闲着无聊,写两个线段树发现类似点。

来源:互联网 发布:js中怎么获取name属性 编辑:程序博客网 时间:2024/05/29 15:28

Hdu 1166 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

Hdu 1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754


线段树:1分为2,2分为4,4分为8,区间更新。

一个求和,一个求最大值。差不多吧。

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>using namespace std;struct node{int s,l,r;}a[500010];void bulit(int n,int l,int r){a[n].s=0;a[n].l=l;a[n].r=r;if (l==r) return; int m=(l+r)/2;bulit(n*2,l,m);bulit(n*2+1,m+1,r);}void insert(int n,int x,int y){a[n].s+=y;if (a[n].l==a[n].r)return;int m=(a[n].l+a[n].r)/2;if (x<=m)insert(n*2,x,y);elseinsert(n*2+1,x,y);}void change(int n,int x,int y){if (a[n].l==a[n].r){a[n].s+=y;return;}int m=(a[n].l+a[n].r)/2;if (x<=m)change(n*2,x,y);else change(n*2+1,x,y);a[n].s=a[2*n].s+a[2*n+1].s;}long long qsum(int n,int l,int r){if (a[n].l==l && a[n].r==r)return a[n].s;int m=(a[n].l+a[n].r)/2;if (r<=m)return qsum(n*2,l,r);else if (l>m)return qsum(n*2+1,l,r);elsereturn qsum(n*2,l,m)+qsum(n*2+1,m+1,r);}int main(){int T,n,i,j,k;char c[10];scanf("%d",&T);for (int cas=1;cas<=T;cas++){printf("Case %d:\n",cas);scanf("%d",&n);bulit(1,1,n);for (i=1;i<=n;i++){scanf("%d",&k);insert(1,i,k);}while (~scanf("%s",&c)){if (c[0]=='E') break;scanf("%d%d",&i,&j);if (c[0]=='A') change(1,i,j);if (c[0]=='S') change(1,i,-j);if (c[0]=='Q') printf("%lld\n",qsum(1,i,j));}}return 0;}

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>using namespace std;struct node{int max,l,r;}a[2000005];int s;void bulit(int n,int l,int r){a[n].max=0;a[n].l=l;a[n].r=r;if (l==r) return;int mid=(l+r)/2;bulit(n*2,l,mid);bulit(n*2+1,mid+1,r);}void insert(int n,int x,int y){if (a[n].max<y)a[n].max=y;if (a[n].l==a[n].r)return;int mid=(a[n].l+a[n].r)/2;if (x<=mid)insert(n*2,x,y);elseinsert(n*2+1,x,y);a[n].max=max(a[n*2].max,a[n*2+1].max);}int qmax(int n,int l,int r){if (a[n].l==l && a[n].r==r){if (s<a[n].max)s=a[n].max;return s;}int mid=(a[n].l+a[n].r)/2;if (r<=mid)return qmax(n*2,l,r);else if (l>mid) return qmax(n*2+1,l,r);elsereturn max(qmax(n*2,l,mid),qmax(n*2+1,mid+1,r));}int main(){int n,m,i,k;while (~scanf("%d%d",&n,&m)){bulit(1,1,n);for (i=1;i<=n;i++){scanf("%d",&k);insert(1,i,k);}for (i=1;i<=m;i++){getchar();char c;int q,w;s=0;scanf("%c%d%d",&c,&q,&w);if (c=='U') insert(1,q,w);if (c=='Q') printf("%d\n",qmax(1,q,w));}}return 0;}


0 0
原创粉丝点击