线段树
来源:互联网 发布:金无怠 知乎 编辑:程序博客网 时间:2024/05/18 10:16
1.hdu1166 敌兵布阵
#include <iostream>#include <string>using namespace std;#define MAX_N 50000string str;int sum; //记录总兵数int num[MAX_N+1]={0}; //记录各个兵营的兵数typedef struct node{int left;int right;int data;node* lchild;node* rchild;node(){left = right = data = 0;}}Tree;Tree* CreateTree(int a,int b){Tree* r;r = (Tree*)malloc(sizeof(Tree));r->left = a;r->right = b;if(a == b){r->data = num[a];r->lchild = r->rchild = NULL;}else{int mid = (a+b)>>1;r->lchild = CreateTree(a,mid);r->rchild = CreateTree(mid+1,b);r->data = r->lchild->data + r->rchild->data;}return r;}void insert(Tree* r,int a,int b){if(r->left == a && r->right == a){r->data += b;return;}int mid = (r->left + r->right)>>1;if(a <= mid){insert(r->lchild,a,b);}else {insert(r->rchild,a,b);}r->data += b;}void find(Tree* r,int a,int b){if(r->left == a && r->right == b){sum += r->data;return;}int mid = (r->left + r->right)>>1;if(b<=mid){find(r->lchild,a,b);}else if(a>mid){find(r->rchild,a,b);}else{find(r->lchild,a,mid);find(r->rchild,mid+1,b);}}int main(){int t,n,x,y;int i;int ca = 0;scanf("%d",&t);while(t--){printf("Case %d:/n",++ca);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);}Tree* T;T = CreateTree(1,n);while(cin>>str){if(str == "Query"){sum = 0;scanf("%d%d",&x,&y);find(T,x,y);printf("%d/n",sum);}else if(str == "Add"){scanf("%d%d",&x,&y);insert(T,x,y);}else if(str == "Sub"){scanf("%d%d",&x,&y);insert(T,x,-y);}else{break;}}}return 0;}
2.hdu1754 I Hate It
#include <iostream>using namespace std;#define MAX_N 200000int big;typedef struct node{ int left; int right; int data; int maxx;}node;node stu[MAX_N*4];//int num[MAX_N+1];int Max(int a,int b){ return a>b?a:b;}void CreateTree(int ii,int a,int b){ stu[ii].left = a; stu[ii].right = b; stu[ii].maxx = 0; stu[ii].data = 0; if(a == b) { return; } else { int mid = (a+b)>>1; CreateTree(ii*2,a,mid); CreateTree(ii*2+1,mid+1,b); }}void updata(int ii,int a,int b){ if(stu[ii].left == a && stu[ii].right == a) { stu[ii].data = b; stu[ii].maxx = b; } else { int mid = (stu[ii].left+stu[ii].right)>>1; if(a <= mid) { updata(ii*2,a,b); } else { updata(ii*2+1,a,b); } if(b > stu[ii].maxx) stu[ii].maxx = b; }}void find(int ii,int a,int b){ if(stu[ii].left == a && stu[ii].right == b) { //printf("%d/n",stu[ii].maxx); if(stu[ii].maxx > big) big = stu[ii].maxx; } else { int mid = (stu[ii].left + stu[ii].right)>>1; if(b <= mid) { find(ii*2,a,b); } else if(a > mid) { find(ii*2+1,a,b); } else { find(ii*2,a,mid); find(ii*2+1,mid+1,b); } }}int main(){ int n,m,num; int i; while(scanf("%d%d",&n,&m)!=EOF) { CreateTree(1,1,n); for(i=1;i<=n;i++) { scanf("%d",&num); updata(1,i,num); } char c; int x1,x2; while(m--) { scanf("%*c%c",&c); scanf("%d%d",&x1,&x2); if(c == 'Q') { big = 0x80000000; find(1,x1,x2); printf("%d/n",big); } else { updata(1,x1,x2); } } } return 0;}3.hdu1698 Just a Hook
#include <iostream>using namespace std;#define MAX_N 100000struct node{int left;int right;int data;int sum;};node hook[4*MAX_N];void CreateTree(int ii,int a,int b){hook[ii].left = a;hook[ii].right = b;if(a == b){hook[ii].data = 1;hook[ii].sum = 1;}else{int mid = (a+b)>>1;CreateTree(ii*2,a,mid);CreateTree(ii*2+1,mid+1,b);hook[ii].data = 0;hook[ii].sum = (hook[ii*2].sum + hook[ii*2+1].sum);}}void updata(int ii,int a,int b,int c){if(hook[ii].left == a && hook[ii].right == b){hook[ii].data = c;hook[ii].sum = (b-a+1)*c;}else{if(hook[ii].data > 0){hook[ii*2].data = hook[ii].data;hook[ii*2].sum = (hook[ii*2].right - hook[ii*2].left+1)*hook[ii*2].data;hook[ii*2+1].data = hook[ii].data;hook[ii*2+1].sum = (hook[ii*2+1].right - hook[ii*2+1].left+1)*hook[ii*2+1].data;}hook[ii].data = 0; //写的时候这个丢掉了。一直错int mid = (hook[ii].left + hook[ii].right)>>1;if(b <= mid){updata(ii*2,a,b,c);}else if(a > mid){updata(ii*2+1,a,b,c);}else{updata(ii*2,a,mid,c);updata(ii*2+1,mid+1,b,c);}hook[ii].sum = hook[ii*2].sum + hook[ii*2+1].sum;}}int main(){int t,n,m,x1,x2,x3;int i;scanf("%d",&t);for(i=1;i<=t;i++){scanf("%d",&n);CreateTree(1,1,n);scanf("%d",&m);while(m--){scanf("%d%d%d",&x1,&x2,&x3);updata(1,x1,x2,x3);}printf("Case %d: The total value of the hook is %d./n",i,hook[1].sum);}return 0;}.hdu2795 Billboard
#include <iostream>using namespace std;#define MAX_N 200000int h,w,n;struct node{ int left; int right; int data; //表示这一段中最大的数};node T[4*MAX_N];int Max(int a,int b){ return a>b?a:b;}void CreateTree(int ini,int a,int b){ T[ini].left = a; T[ini].right = b; T[ini].data = w; //一开始最大都是宽度 if(a == b) { return; } else { int mid = (a + b) >> 1; CreateTree(ini*2,a,mid); CreateTree(ini*2+1,mid+1,b); }}void insert(int ini,int a){ if(T[ini].left == T[ini].right) { printf("%d/n",T[ini].left); T[ini].data -= a; } else { if(T[ini*2].data >= a) { insert(ini*2,a); } else { insert(ini*2+1,a); } T[ini].data = Max(T[ini*2].data,T[ini*2+1].data); } }int main(){ int i,num; while(scanf("%d%d%d",&h,&w,&n)!=EOF) { if(h < n) CreateTree(1,1,h); else CreateTree(1,1,n); //建树按照min(h,n)来建,这样就保证最大时n。 for(i=0;i<n;i++) { scanf("%d",&num); if(num > T[1].data) { printf("-1/n"); } else insert(1,num); } } return 0;}
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 使用BinCompiler将资源文件打包成二进制文件
- Cent OS安装Samba
- linux获取文件大小
- python_getopt解析命令行输入参数的使用
- sql server is null 和 '' 和 = 的折中用法
- 线段树
- 《谈判是什么》笔记……
- 文件大小查看
- ubuntu 11.10下载和编译Android源码
- 创造鲜活的三维数字城市
- linux send recv函数详解
- 8--5将输入的三个整数按大小顺序输出,用函数实现
- java synchronized详解
- 被触动到的话语