首页 > 代码库 > FZU 2171 防守阵地 II
FZU 2171 防守阵地 II
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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。