cdoj1344卿学姐种美丽的花
地址:http://acm.uestc.edu.cn/#/problem/show/1344
题目:
卿学姐种美丽的花
Time Limit: 8000/4000MS (Java/Others) Memory Limit: 125535/65535KB (Java/Others)
Submit Status众所周知,在喵哈哈村,有一个温柔善良的卿学姐。
卿学姐喜欢和她一样美丽的花。所以卿学姐家的后院有很多的花坛。
卿学姐有nn个花坛,一开始第ii个花坛里有A[i]A[i]朵花。每过一段时间,卿学姐都会在花坛里种上新的花。
作为一个聪明的学姐,卿学姐的种花方式也是与众不同 , 每一次,卿学姐会在第xx个花坛种上yy朵花,然后在第x+1x+1个花坛上种上y−1y−1朵花,再在第x+2x+2个花坛上种上y−2y−2朵花......以此类推,直到种到最后一个花坛,或者不需要种花为止。
喵哈哈的村民们都喜欢去卿学姐的后院赏花,沈宝宝也不例外。然而沈宝宝可不是省油的灯,怎么可能会老老实实地赏花呢。每次沈宝宝来时,都会随机询问卿学姐在第ii个花坛有多少朵花。
花坛的花实在太多了,卿学姐实在是数不过来。于是现在她向你求助,希望你能帮她数出花坛里多少朵花。
Input
第一行输入两个整数,花坛个数NN和操作次数QQ。
第二行NN个整数A[1],A[2],A[3].....A[N]A[1],A[2],A[3].....A
。 ( 1≤A[i]≤2311≤A[i]≤231 )
接下来QQ行,每行一个操作。
-
1 x y
表示卿学姐会在xx号花坛种yy朵花,并按相应的规律在后面的花坛上种花。 -
2 x
表示沈宝宝问卿学姐第xx个花坛有多少朵花。
数据保证:
-
1≤N≤1061≤N≤106
-
1≤Q≤2∗1061≤Q≤2∗106
-
对于操作 11 , 1≤x≤N1≤x≤N,1≤y≤1091≤y≤109
-
对于操作 22 , 1≤x≤N1≤x≤N
Output
对于每个询问操作,按顺序输出答案对772002+233772002+233取模的值。
Sample input and output
Sample Input | Sample Output |
---|---|
6 3 1 2 3 2 1 2 1 2 3 2 3 2 6 |
5 2 |
思路:
这题之前做过,,所以一看到就去卿学姐的代码搞一发(因为我发现之前提交的代码看不到了,所以就用的卿学姐的)
后来听说会查重,就只好重写了。。
思路:用线段树处理,每个节点记录要加的值,并记录加的次数,然后查询的时候加上原来的数值就好了,不过这题会爆int,重写的时候居然又错了一次,,,,,惨
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <cstdlib> #include <string> #include <bitset> #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000 using namespace std; struct node { int left,right; long long cnt,x; }; struct node tree[4*K+9]; int a[K+9]; void build(int id,int l,int r) { tree[id].left=l;tree[id].right=r; if(l==r) { tree[id].x=tree[id].cnt=0; } else { build(2*id,l,(l+r)/2); build(2*id+1,(l+r)/2+1,r); } } void update(int id,int l,int r,int v) { if(tree[id].left ==l && tree[id].right==r) { tree[id].x+=v;tree[id].cnt++; } else { int mid=(tree[id].left+tree[id].right)/2; if (r<=mid) update(id*2,l,r,v); else if(l>mid) update(id*2+1,l,r,v); else update(id*2,l,mid,v),update(id*2+1,mid+1,r,v-(mid+1-l)); } } long long query(int id,int x) { if(tree[id].left==tree[id].right) return tree[id].x; long long sum=0; sum+=tree[id].x-(x-tree[id].left)*tree[id].cnt; int mid=(tree[id].left+tree[id].right)/2; if (x<=mid) return sum+query(id*2,x); else return sum+query(id*2+1,x); } int main(void) { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); while(m--) { int op; scanf("%d",&op); if(op==1) { long long x,v,y; scanf("%lld%lld",&x,&v); y=v+x-1; if(y>n)y=n; update(1,x,y,v); } else { int x; scanf("%d",&x); printf("%d\n",(a[x]+query(1,x))%(772002 + 233)); } } }View Code
- 160家优秀国外技术公司博客
- 大数据数据来源
- Get方式中文乱码问题
- 4、阻止表单onsubmit事件的默认行为
- activiti 组任务指定办理人三种方式(十一)
- android 自定义进度条颜色
- fzoj 2234 牧场物语 (多线程DP&滚动数组) 好题
- Spring MVC源码解析
- Spark版本定制第2天:通过案例对SparkStreaming透彻理解之二
- MVC多语言应用
- 死锁
- android listview、GridView中item点击后改变其他item中的状态 setOnItemClickListener onItemClick
- 数据结构—快速排序模型
- Android中使用ON CONFLICT REPLACE同步数据到SQLITE
- cdoj 秋实大哥搞算数
- JavaScript创建对象的几种方式
- Compile TrinityCore /Merge Eluna Lua Engine & Update Source/Engine
- Lombok在Eclipse/MyEclipse/STS中的安装及使用
- IO与NIO
- csdn规则