標籤:des style blog color os io 資料 for
E - 防守陣地 II
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit
Status
Description
部隊中總共有N個士兵,每個士兵有各自的能力指數Xi,
在一次演練中,指揮部確定了M個需要防守的地點,
指揮部將選擇M個士兵依次進入指定地點進行防守任務,
獲得的參考指數即為M個士兵的能力之和。
隨著時間的推移,指揮部將下達Q個指令來替換M個進行防守計程車兵們,
每個參加完防守任務計程車兵由於疲憊等原因能力指數將下降1。
現在士兵們排成一排,請你計算出每次進行防守計程車兵的參考指數。
Input
輸入包含多組資料。
輸入第一行有兩個整數N,M,Q(1<=N<=100000,1<=M<=1000,1<=Q<=100000),
第二行N個整數表示每個士兵對應的能力指數Xi(1<=Xi<=1000)。
接下來Q行,每行一個整數X,
表示在原始隊列中以X為起始的M個士兵替換之前計程車兵進行防守。(1<=X<=N-M+1)
Output
輸出Q行,每行一個整數,為每次指令執行之後進行防守計程車兵參考指數。
Sample Input
5 3 3
2 1 3 1 4
1
2
3
Sample Output
6
3
5
一開始是看到覺得眼熟還有點小激動 結果數組沒開4倍 簡直了= =
之前有問過王大神 這題用線段樹點修改是必逾時的 就去看了 區間修改
目前有感覺只能套模板 還不能做到很流暢地運用
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<queue>#include<stack>#define mem(a,b) memset(a,b,sizeof(a))#define ll __int64#define MAXN 1000#define INF 0x7ffffff#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int sum[400000+10];// n<<2!!!!!int add[1000000];void pushup(int rt){ //if(sum[rt<<1]<0) sum[rt<<1]=0; //if(sum[rt<<1|1]<0) sum[rt<<1|1]=0; sum[rt]=sum[rt<<1] +sum[rt<<1|1];}void pushdown(int rt,int m){ if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=add[rt]*(m-(m>>1)); sum[rt<<1|1]+=add[rt]*(m>>1); //if(sum[rt<<1]<0) sum[rt<<1]=0; //if(sum[rt<<1|1]<0) sum[rt<<1|1]=0; add[rt]=0; }}void build(int l,int r,int rt){ if(l==r) { scanf("%d",&sum[rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt);}void update(int L,int R,int c,int l,int r,int rt){ if(L<=l&&r<=R) { add[rt]+=c; sum[rt]+=c*(r-l+1); return ; } pushdown(rt,r-l+1); int m=(l+r)>>1; if(R<=m) update(L,R,c,lson); else if(L>m) update(L,R,c,rson); else { update(L,R,c,lson); update(L,R,c,rson); } pushup(rt);}int query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) { return sum[rt]; } pushdown(rt,r-l+1); int m=(l+r)>>1; int ret=0; if(R<=m) ret+=query(L,R,lson); else if(L>m) ret+=query(L,R,rson); else { ret+=query(L,R,lson); ret+=query(L,R,rson); } return ret;}int main(){ int i,j,n,m,q,wen,jian; while(scanf("%d%d%d",&n,&m,&q)!=EOF) { mem(add,0); build(1,n,1); for(i=1;i<=q;i++) { scanf("%d",&wen); printf("%d\n",query(wen,wen+m-1,1,n,1)); update(wen,wen+m-1,-1,1,n,1); } } return 0;}