POJ3468(线段树+lazy思想)

来源:互联网 发布:autodesk mac 注册机 编辑:程序博客网 时间:2024/06/03 14:34

读入时没有用%I64d结果一直WA..


#include <iostream>#include <cstdio>using namespace std;__int64 total=0;__int64 A[100000];struct CNode{int left,right;CNode *leftchild,*rightchild;__int64 sum;__int64 inc;};CNode* build(int l,int r){CNode* root=new CNode;        root->left=l;root->right=r;root->sum=0;root->inc=0;root->leftchild=NULL;root->rightchild=NULL;if (l!=r){int mid=(l+r)/2;root->leftchild=build(l,mid);root->rightchild=build(mid+1,r);}return root;}void add(int l,int r,int c,CNode* root){if (l<=root->left && r>=root->right){root->inc+=c;}else{if (l>=root->left && r<=root->right)  root->sum+=(r-l+1)*c;else if (l>=root->left && r>root->right)root->sum+=(root->right-l+1)*c;else if (l<root->left && r>root->right)root->sum+=(root->right-root->left+1)*c;elseroot->sum+=(r-root->left+1)*c;if ( l<=(root->left+root->right)/2 ) add(l,r,c,root->leftchild);if ( r>(root->left+root->right)/2 ) add(l,r,c,root->rightchild);}}void getsum(int l,int r,CNode* root){if (l<=root->left && r>=root->right){total+=root->sum;total+=(root->right-root->left+1)*root->inc;}else{root->sum+=(root->right-root->left+1)*root->inc;if (root->leftchild!=NULL)  root->leftchild->inc+=root->inc;if (root->rightchild!=NULL)  root->rightchild->inc+=root->inc;root->inc=0;if ( l<=(root->left+root->right)/2 ) getsum(l,r,root->leftchild);if ( r>(root->left+root->right)/2 ) getsum(l,r,root->rightchild);}}int main(){int N,Q;int i;char ch;int a,b,c;scanf("%d%d",&N,&Q);CNode* root=build(1,N);scanf("%I64d",&A[0]);for (i=1;i<=N-1;i++){scanf("%I64d",&A[i]);A[i]+=A[i-1];}getchar();while (Q--){scanf("%c",&ch);if (ch=='Q'){scanf("%d%d",&a,&b);getchar();getsum(a,b,root);if (a>=2)  total+=A[b-1]-A[a-2];elsetotal+=A[b-1];printf("%I64d\n",total);total=0;}else{scanf("%d%d%d",&a,&b,&c);getchar();add(a,b,c,root);}}return 0;}


版本2:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <algorithm>using namespace std;__int64 A[100005];__int64 total;struct Node{int l,r;struct Node *lchild,*rchild;__int64 sum,inc;}Root;void build(int l,int r,struct Node *root){root->l=l;root->r=r;root->lchild=root->rchild=NULL;root->sum=root->inc=0;if (l==r)return;int mid=(l+r)/2;root->lchild=new struct Node;build(l,mid,root->lchild);root->rchild=new struct Node;build(mid+1,r,root->rchild);}void add(int l,int r,int inc,struct Node *root){int mid=(root->l+root->r)/2;if (l<=root->l && r>=root->r)  root->inc+=inc;else if (l>mid){root->sum+=(min(r,root->r)-l+1)*inc;add(l,r,inc,root->rchild);}else if (r<=mid){root->sum+=(r-max(l,root->l)+1)*inc;add(l,r,inc,root->lchild);}else{root->sum+=(min(r,root->r)-max(l,root->l)+1)*inc;add(l,r,inc,root->lchild);add(l,r,inc,root->rchild);}}void query(int l,int r,struct Node *root){root->sum+=(root->r-root->l+1)*root->inc;if (root->lchild!=NULL)root->lchild->inc+=root->inc;if (root->rchild!=NULL)root->rchild->inc+=root->inc;root->inc=0;int mid=(root->l+root->r)/2;if (l<=root->l && r>=root->r)total+=root->sum;else if (l>mid)query(l,r,root->rchild);else if (r<=mid)query(l,r,root->lchild);else{query(l,r,root->lchild);query(l,r,root->rchild);}}int main(){int N,Q,i,a,b,c;char s[2];scanf("%d%d",&N,&Q);scanf("%I64d",&A[1]);for (i=2;i<=N;i++){scanf("%I64d",&A[i]);A[i]+=A[i-1];}build(1,N,&Root);for (i=1;i<=Q;i++){scanf("%s",s);if (s[0]=='Q'){scanf("%d%d",&a,&b);query(a,b,&Root);total+=A[b]-A[a-1];printf("%I64d\n",total);total=0;}else{scanf("%d%d%d",&a,&b,&c);add(a,b,c,&Root);}}}


原创粉丝点击