[树状数组][codevs1081]线段树练习2
来源:互联网 发布:java面向对象编程继承 编辑:程序博客网 时间:2024/05/22 01:32
传送门http://codevs.cn/problem/1081/
终于学会了树状数组区间修改&&单点查询,好感动QAQ
之前一直不懂差分。。网上blog还看不懂。。问别人还是不懂。。
然后过了hin长hin长时间 做了几道有关差分的水题 突然就开窍了QwQ
确实比线段树快很多呐
//不要问我为什么现在才学会,我是蒟蒻啊
#include <iostream>#include<cstdio>using namespace std;const int N=100001;int n,q,c[N],x,y,v,tp;inline void read(int &x){ x=0;int w=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=-1; for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0'; x=x*w;}void ymz(int x,int v){ for(;x<=n;x+=x&(-x)) c[x]+=v;}int find(int x){ int ans=0; for(;x;x^=x&(-x)) ans+=c[x]; return ans;}int main() { read(n); for(int i=1;i<=n;i++){ read(x); ymz(i,x);ymz(i+1,-x); } read(q); for(int i=1;i<=q;i++){ read(tp);read(x); if (tp==1){ read(y);read(v); ymz(x,v);ymz(y+1,-v); } else printf("%d",find(x)); } return 0;}
顺便再贴一个线段树的板子好了(我线段树很丑
#include<iostream>#include<cstdio>using namespace std;const int N=100001;int n,q,tp,x,y,v,a[N],lazy[N*4],ans;inline void read(int &x){ x=0;int w=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') w=-1; for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0'; x=x*w;}void buildtree(int node,int L,int r){ if (L==r) lazy[node]=a[L]; else{ int mid=(L+r)>>1; buildtree(node*2,L,mid);buildtree(node*2+1,mid+1,r); }}void ymz(int node,int L,int r){ if (r<x||L>y) return; if (L>=x&&r<=y) lazy[node]+=v; else{ int mid=(L+r)>>1; ymz(node*2,L,mid);ymz(node*2+1,mid+1,r); }}void ask(int node,int L,int r){ if (r<x||L>x) return; if (L==x&&r==x) ans=lazy[node]; else{ int mid=(L+r)>>1; lazy[node*2]+=lazy[node]; lazy[node*2+1]+=lazy[node]; lazy[node]=0; ask(node*2,L,mid);ask(node*2+1,mid+1,r); }}int main(){ read(n); for(int i=1;i<=n;i++) read(a[i]); buildtree(1,1,n); read(q); for(int i=1;i<=q;i++){ read(tp);read(x); if (tp==1) read(y),read(v),ymz(1,1,n); else ask(1,1,n),printf("%d\n",ans); // for(int i=1;i<=4*n;i++) printf("%d ",lazy[i]);printf("\n"); } return 0;}
除了好理解就没有别的优点。。
阅读全文
1 0
- [树状数组][codevs1081]线段树练习2
- codevs1081线段树练习2(树状数组)
- 线段树模版(codevs1081线段树练习2)
- [CodeVS1081]线段树练习2(区间修改+单点询问)
- 水题笔记: codevs1081 线段树练习2 [重口味线段树(区间修改)]
- codevs1080线段树练习(树状数组)
- Codevs_P1080 线段树练习(树状数组)
- 线段树练习_codevs1080_树状数组
- 线段树练习五(+树状数组)
- Codevs1082 线段树练习三(树状数组)
- 【codevs1081】【树状数组】区间修改 单点查询
- 【数据结构】树状数组模板--CODE[VS] 1080线段树练习and1081线段树练习2
- Codevs 1081 线段树练习 2(线段树&&树状数组&&分块)
- 【练习手记】【多题合集】用树状数组做线段树练习1、2、3
- 线段树与树状数组模版及专题练习
- codevs 1080_线段树练习_树状数组
- 【CODE[VS]】1082 线段树练习 3 树状数组
- 线段树,树状数组
- lab 2
- Java 如何判断线程池所有任务是否执行完毕
- Hive整合HBase 通过Hive读/写HBase中的表
- linux下GCC的安装
- 一个10分钟神经网络演讲
- [树状数组][codevs1081]线段树练习2
- Java 中字符串的处理
- JavaScript--选择排序、冒泡排序
- Fail-Fast 前奏
- hdu 6227 Rabbits
- Android、ios双平台车牌识别,无需联网
- 济南刷题冲刺 Day1 下午
- c语言大数加法
- Keras指定使用GPU运算