原题链接:单点修改区间查询
/*线段树,就是区间数据放一个树里
这是最后一道题了,话说我2018年过年那会儿买的课........
不过因为各种原因并没有去看
半年前因为严重的抑郁症+挂科多被学校强制休学了
一个月前吧大约才开始看这个课
课的内容挺广泛,比我们那垃圾学校讲的全面多了,层次也深很多,还简练
群里的word老师也很好啊.一般群里叫他他都是会回的,会帮你检查问题.还能侃大山
唯一的缺点就是有的内容不好理解还是一笔带过
希望3月份复学开始大二下学业能够顺利一些
最好acm,pat天梯一类的能水个奖什么的
如果大家对自学算法啊,抑郁症啊有什么想了解的可以联系我*/O(∩_∩)O哈哈~
#include<bits/stdc++.h>
using namespace std;
int tot=0;
int fuck;
int c,d,sum;
struct node{
int data,father,a,b,l,r;
}tree[150000];//这么多估计就行了,理论上讲应该是400000的
void getans(int num){//赋值
if(c==tree[num].a&&tree[num].b==c){
fuck=d-tree[num].data;
tree[num].data=d;}
else{
int mid=(tree[num].a+tree[num].b)/2;
if(c<=mid){getans(tree[num].l);
tree[num].data+=fuck;}
else {getans(tree[num].r);
tree[num].data+=fuck;}}}//他的父亲节点们都得加上新的值,要是直接找会超时
void getfuck(int num){//找区间求和
if(c<=tree[num].a&&tree[num].b<=d){
sum+=tree[num].data;
}
else{
int mid=(tree[num].a+tree[num].b)/2;
if(c<=mid)getfuck(tree[num].l);
if(mid+1<=d)getfuck(tree[num].r);}}
void build(int a,int b){//建立树,这个就不用说了
int point=++tot;
tree[point].a=a;
tree[point].b=b;
int mid=(a+b)/2;
if(a<b){
tree[point].l=tot+1;
tree[tot+1].father=point;
build(a,mid);
tree[point].r=tot+1;
tree[tot+1].father=point;
build(mid+1,b);
}
}
int main(){
int n,m,i;
char temp;
cin>>n>>m;
build(1,n+1);
for(i=1;i<=m;i++){
cin>>temp;
if(temp=='C'){
cin>>c>>d;
getans(1);}
else if(temp=='S'){
cin>>c>>d;
sum=0;
getfuck(1);
cout<<sum<<endl;}}}
9.9 分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复