http://codeforces.com/problemset/problem/627/B
题目大意: n代表天数 ,k代表每一次维修持续的天数,a代表维修过后每天能生产a件产品,b代表维修之前每天只能生产b件产品 q代表q次查询
每次查询 都会先输入一个数
1 ,第d天接到a个订单
2,从第p天开始维修 这几天(往后的k天不工作 在第p天之前每天只能生产b件产品,p+k天之后都维修过了,所以之后的每一天能生产a件产品)
刚开始一直没有读懂题目 后来上cf上看了看 呢上面有提示 然后就是线段树
我觉得我的方法比较笨 我把每一个>a || >b 的都用一个变量保存下来,我还保存了不大于a和不大于b的和
最后更新点就行了
我刚开开始写 忽略了如果他加上一个数如果大于a的话 他的和应该减去他本身的值
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<math.h> #include<string.h> #include<iostream> #include<queue> #include<ctype.h> using namespace std; #define N 200005 #define met(a,b) memset(a,b,sizeof(b)) #define Lson r<<1|1 #define Rson r<<1 int n,k,x,y; struct node { int L,R,e; long long int Lsum,Rsum,Ls,Rs; int mid() { return (L+R)/2; } }a[N*4]; void BuildTree(int r,int L,int R) { a[r].L=L; a[r].R=R; a[r].e=0; a[r].Lsum=0; a[r].Rsum=0; a[r].Ls=0; a[r].Rs=0; if(L==R) return; BuildTree(Lson,L,a[r].mid()); BuildTree(Rson,a[r].mid()+1,R); a[r].Lsum=a[Lson].Lsum+a[Rson].Lsum; a[r].Rsum=a[Lson].Rsum+a[Rson].Rsum; a[r].Ls=a[Lson].Ls+a[Rson].Ls; a[r].Rs=a[Lson].Rs+a[Rson].Rs; } void Update(int r,int L,int v) { if(a[r].L==a[r].R && a[r].L==L) { int kk=a[r].e; a[r].e+=v; if(a[r].e>=y && kk<y) { a[r].Lsum++; a[r].Ls-=kk; } if(a[r].e>=x && kk<x) { a[r].Rs-=kk; a[r].Rsum++; } if(a[r].e<y) a[r].Ls=a[r].e; if(a[r].e<x) a[r].Rs=a[r].e; return; } if(L>a[r].mid()) Update(Rson,L,v); else Update(Lson,L,v); a[r].Lsum=a[Lson].Lsum+a[Rson].Lsum; a[r].Rsum=a[Lson].Rsum+a[Rson].Rsum; a[r].Ls=a[Lson].Ls+a[Rson].Ls; a[r].Rs=a[Lson].Rs+a[Rson].Rs; } long long int Qurry(int r,int L,int R,int b) { if(L>R) return 0; if(a[r].L==L && a[r].R==R) { if(b==1) return a[r].Lsum*y+a[r].Ls; else if(b==2) return a[r].Rsum*x+a[r].Rs; } if(L>a[r].mid()) return Qurry(Rson,L,R,b); else if(R<=a[r].mid()) return Qurry(Lson,L,R,b); else { long long a1=Qurry(Lson,L,a[r].mid(),b); long long a2=Qurry(Rson,a[r].mid()+1,R,b); return a1+a2; } } int main() { int q; while(scanf("%d",&n)!=EOF) { met(a,0); int u,v; BuildTree(1,1,n); scanf("%d %d %d %d",&k,&x,&y,&q); while(q--) { int kk; scanf("%d",&kk); if(kk==1) { scanf("%d %d",&u,&v); Update(1,u,v); } else { scanf("%d",&u); long long int sum1=Qurry(1,1,u-1,1); long long int sum2=Qurry(1,u+k,n,2); printf("%lld\n",sum1+sum2); } } } return 0; }
时间: 2024-10-14 16:43:43