1. /*线段树,就是区间数据放一个树里
  2. 这是最后一道题了,话说我2018年过年那会儿买的课........
  3. 不过因为各种原因并没有去看
  4. 半年前因为严重的抑郁症+挂科多被学校强制休学了
  5. 一个月前吧大约才开始看这个课
  6. 课的内容挺广泛,比我们那垃圾学校讲的全面多了,层次也深很多,还简练
  7. 群里的word老师也很好啊.一般群里叫他他都是会回的,会帮你检查问题.还能侃大山
  8. 唯一的缺点就是有的内容不好理解还是一笔带过
  9. 希望3月份复学开始大二下学业能够顺利一些
  10. 最好acm,pat天梯一类的能水个奖什么的
  11. 如果大家对自学算法啊,抑郁症啊有什么想了解的可以联系我*/O(∩_∩)O哈哈~
  12. #include<bits/stdc++.h>
  13. using namespace std;
  14. int tot=0;
  15. int fuck;
  16. int c,d,sum;
  17. struct node{
  18. int data,father,a,b,l,r;
  19. }tree[150000];//这么多估计就行了,理论上讲应该是400000的
  20. void getans(int num){//赋值
  21. if(c==tree[num].a&&tree[num].b==c){
  22. fuck=d-tree[num].data;
  23. tree[num].data=d;}
  24. else{
  25. int mid=(tree[num].a+tree[num].b)/2;
  26. if(c<=mid){getans(tree[num].l);
  27. tree[num].data+=fuck;}
  28. else {getans(tree[num].r);
  29. tree[num].data+=fuck;}}}//他的父亲节点们都得加上新的值,要是直接找会超时
  30. void getfuck(int num){//找区间求和
  31. if(c<=tree[num].a&&tree[num].b<=d){
  32. sum+=tree[num].data;
  33. }
  34. else{
  35. int mid=(tree[num].a+tree[num].b)/2;
  36. if(c<=mid)getfuck(tree[num].l);
  37. if(mid+1<=d)getfuck(tree[num].r);}}
  38. void build(int a,int b){//建立树,这个就不用说了
  39. int point=++tot;
  40. tree[point].a=a;
  41. tree[point].b=b;
  42. int mid=(a+b)/2;
  43. if(a<b){
  44. tree[point].l=tot+1;
  45. tree[tot+1].father=point;
  46. build(a,mid);
  47. tree[point].r=tot+1;
  48. tree[tot+1].father=point;
  49. build(mid+1,b);
  50. }
  51. }
  52. int main(){
  53. int n,m,i;
  54. char temp;
  55. cin>>n>>m;
  56. build(1,n+1);
  57. for(i=1;i<=m;i++){
  58. cin>>temp;
  59. if(temp=='C'){
  60. cin>>c>>d;
  61. getans(1);}
  62. else if(temp=='S'){
  63. cin>>c>>d;
  64. sum=0;
  65. getfuck(1);
  66. cout<<sum<<endl;}}}
点赞(0)
 

9.9 分

3 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论