改了三天,提交17次,一定要纪念一下!

1004:Challenge 4

总时间限制: 
10000ms
单个测试点时间限制: 
1000ms
内存限制: 
262144kB
描述

给一个长为N的数列,有M次操作,每次操作时以下三种之一:

(1)修改数列中的一个数

(2)求数列中某连续一段所有数的两两乘积的和 mod 1000000007

(3)求数列中某连续一段所有相邻两数乘积的和 mod 1000000007

输入
第一行两个正整数N和M。
第二行N的整数表示这个数列。
接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的值修改为y;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做2号询问;若该字符为'A',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做3号询问。
输出
对每一个询问操作单独输出一行,表示答案。
样例输入
5 5
1 2 3 4 5
Q 1 5
A 1 5
M 2 7
Q 1 5
A 1 5
样例输出
85
40
150
60
提示
1<=N<=10^5,1<=M<=10^5,输入保证合法,且所有整数可用带符号32位整型存储。

更新操作其实是很简单的,稍微推一下就可以出来,可是细节很多!还有毒瘤数据有负数!所以所有的mod操作都要模加模!!

还有就是指针池的大小问题...因为过程中一直在开新节点...改了三天的大毒瘤

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;const int mod = 1000000007;
const int N = 100005;ll a[N];
int n, m;struct node {node *ls, *rs;ll sum, num1, num2, lf, rg;
} pool[N*32], *tail = pool, *zero, *root;///指针池大小void update ( node *nd, node *ld, node *rd ) {nd -> sum = ( ld -> sum + rd -> sum + mod ) % mod;nd -> num1 = (  ld -> sum * rd -> sum  % mod + ld -> num1 + rd -> num1 + mod ) % mod;nd -> num2 = ( ld -> num2 + rd -> num2 + ld -> rg * rd -> lf % mod + mod ) % mod;nd -> lf = ld -> lf % mod; nd -> rg = rd -> rg % mod;
}node *build ( int l, int r ) {node *nd = ++ tail;if ( l == r ) {ll pp = ( a[l] % mod + mod ) % mod;nd -> lf = nd -> rg = pp;nd -> sum = pp; nd -> num1 = nd -> num2 = 0;return nd;}int mid = ( l + r ) >> 1;nd -> ls = build ( l, mid );nd -> rs = build ( mid + 1, r );update ( nd, nd -> ls, nd -> rs );return nd;
}node *query ( node *nd, int l, int r, int L, int R ) {if ( l >= L && r <= R )return nd;int mid = ( l + r ) >> 1;node *nd1 = ++ tail, *nd2 = ++ tail;if ( mid >= L )nd1 = query ( nd -> ls, l, mid, L, R );if ( mid < R )nd2 = query ( nd -> rs, mid + 1, r, L, R );node *st = ++ tail;update ( st, nd1, nd2 );return st;
}void modify ( node *nd, int l, int r, int pos, ll d ) {if ( l == r ) {nd -> lf = nd -> rg = d;nd -> sum = d;return ;}int mid = ( l + r ) >> 1;if ( pos <= mid ) modify ( nd -> ls, l, mid, pos, d );else modify ( nd -> rs, mid + 1, r, pos, d );update ( nd, nd -> ls, nd -> rs );
}int main ( ) {scanf ( "%d%d", &n, &m );for ( int i = 1; i <= n; i ++ )scanf ( "%lld", &a[i] );root = build ( 1, n );for ( int i = 1; i <= m; i ++ ) {char opt;scanf ( "\n%c", &opt );if ( opt == 'Q' ) {int l, r;scanf ( "%d%d", &l, &r );node *ans = query ( root, 1, n, l, r );printf ( "%lld\n", ( ans -> num1 + mod ) % mod );} else if ( opt == 'A' ) {int l, r;scanf ( "%d%d", &l, &r );node *ans = query ( root, 1, n, l, r );printf ( "%lld\n", ( ans -> num2 + mod ) % mod );} else {int pos; ll r;scanf ( "%d%lld", &pos, &r );r = ( r + mod ) % mod;////modify ( root, 1, n, pos, r );}}return 0;
}

转载于:https://www.cnblogs.com/wans-caesar-02111007/p/9468559.html

【openjudge】 CDQZ challenge 4相关推荐

  1. 【openjudge】抓住那头牛

    描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: 1.从 ...

  2. 【openjudge】金银岛

    描述 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属.但是他只带着一个口袋,口袋至多只能装重量为w的物品.岛上金属有s个种类 ...

  3. 【openjudge】开餐馆

    描述 北大信息学院的同学小明毕业之后打算创业开餐馆.现在共有n 个地点可供选择.小明打算从中选择合适的位置开设一些餐馆.这 n 个地点排列在同一条直线上.我们用一个整数序列m1, m2, ... mn ...

  4. 【openjudge】【字符串+模拟】1777:文件结构“图”

    [题目传送门:]戳 [描述:] 在计算机上看到文件系统的结构通常很有用.Microsoft Windows上面的"explorer"程序就是这样的一个例子.但是在有图形界面之前,没 ...

  5. 建立二叉树A【openjudge】

    总时间限制: 1000ms 内存限制:65535kB 描述 给出一颗二叉树根节点到各叶子节点的路径,建立这颗二叉树,输出中序遍历的结果. 输入 第一行输入一个整数t,代表测试数据的组数. 对于每组测试 ...

  6. 【译】The challenge of verification and testing of machine learning

    在我们的第二篇文章中 ,我们给出了一些背景解释为什么攻击机器学习通常比维护它更容易. 我们看到了一些原因,为什么我们还没有完全有效的防范敌对的例子,我们猜测我们是否能够期待这样的防御. 在这篇文章中, ...

  7. 【OpenJudge】白细胞计数

    描述 医院采样了某临床病例治疗期间的白细胞数量样本n份,用于分析某种新抗生素对该病例的治疗效果.为了降低分析误差,要先从这n份样本中去除一个数值最大的 样本和一个数值最小的样本,然后将剩余n-2个有效 ...

  8. 【OpenJudge】反反复复

    描述 Mo和Larry发明了一种信息加密方法.他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵.例如,若信息是"There ...

  9. 【BZOJ2288】[POJ Challenge]生日礼物(线段树)

    题目来源:BZOJ2288 如果 m=1m=1m=1 我们只需要求最大子段和即可. 但是当 m>1m>1m>1 时,我们的选取可能会产生后效性. 比如说黄色部分是选取一个子段的最优方 ...

最新文章

  1. 吴恩达新书《Machine Learning Yearning》中7个实用建议(附论文)
  2. linux (ubuntu) 命令学习笔记
  3. java 信号量 countdown_Java计数器之CountDownLatch、CyclicBarrier、Semaphore
  4. JavaScript时间日期函数
  5. [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项
  6. spring 源码分析(1)-xml文件解析
  7. 思杰VDI十终极结构图及总结
  8. 红旗linux的安装命令,红旗linux安装【处理思路】
  9. vue中的v-show与v-if区别
  10. 获取GridView控件总列数
  11. vue - 开发环境构建
  12. webbrowser在vb中叫
  13. SPSS图文教程:两个率的比较(卡方检验)及Fisher精确检验
  14. OpenJudge NOI题库 入门 116题 (二)
  15. WEB漏洞攻防 -根据不同数据库类型之间的差异性进行注入
  16. 微博模拟登陆之验证码的解决方法
  17. 利用DOCX文档远程模板注入执行宏代码
  18. 以友盟+U-Push为例,深度解读消息推送的筛选架构解决方案应用与实践
  19. MySQL慢查询记录原理和内容解析
  20. 学习node.js第二天

热门文章

  1. 计算机专业考研学习,计算机专业考研133分复习经验谈
  2. linux 添加deepin ppa,Deepin 添加PPA源问题
  3. 文件上传漏洞原理/方式/防护
  4. java中else语句有错_java 菜鸟 If else有错误
  5. python自动压图贴图到Excel小工具
  6. 应物联网要求而生 美国团队研发出零功耗红外探测器
  7. 录音整理文字工具otranscribe简介
  8. 开源监控解决方案Nagios+Cacti+PNP4Nagios+NConf+NDOUtils+Nagvis(九)NagVis安装
  9. 【程序员眼中的统计学(12)】相关与回归:我的线条如何?
  10. DTCoreText