防守阵地 II【线段树 区间修改】
2016-03-13 21:15
381 查看
E - 防守阵地 II
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice FZU
2171
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)
对于30%的数据1<=M,N,Q<=1000。
Output
输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。
Sample Input
5 3 32 1 3 1 4123
Sample Output
635
FAQ | About Virtual Judge | Forum | Discuss | Open
Source Pro
模板
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice FZU
2171
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)
对于30%的数据1<=M,N,Q<=1000。
Output
输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。
Sample Input
5 3 32 1 3 1 4123
Sample Output
635
FAQ | About Virtual Judge | Forum | Discuss | Open
Source Pro
模板
#include<stdio.h> #define lson l , m ,rt << 1 #define rson m+1 , r , rt << 1 | 1 const int maxn = 100002; int add[maxn << 2]; int sum[maxn << 2]; void PushUP(int rt) { 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); add[rt] = 0; } } void build(int l,int r,int rt) { add[rt] = 0; 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(L <= m) update(L , R , c , lson); if(m < R) 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(L <= m) ret+=query(L , R , lson); if(m < R) ret+=query(L , R , rson); return ret; } int main() { int n,m,q; while(~scanf("%d%d%d",&n,&m,&q)) { build(1,n,1); int ans,x; while(q--) { scanf("%d",&x); ans=query(x,x+m-1,1,n,1); update(x,x+m-1,-1,1,n,1); printf("%d\n",ans); } } return 0; }
相关文章推荐
- 内连接、外连接[左连接、右连接、全连接]、交叉连接、自连接
- hdu5299 Circles Game
- Java并发编程:Callable、Future和FutureTask
- HDOJ 1541 star(树状数组)
- iOS开发-进阶:iOS7中的多任务 - Background Fetch,Silent Remote Notifications,Background Transfer Service
- 数据结构之邻接表
- 数据库的悲观锁和乐观锁
- C++ / CLI 调用 C++ /Native 随记
- jmeter中基于oracle的JDBC Request的使用
- java多线程的线程池
- 面试题目二
- 软件包管理—rpm
- 操作系统三个简单的部分(Operating Systems in Three Easy Pieces)4.1
- 随便写写C++,看看Essential C++
- 使用Euclidean法求乘法逆
- POJ 1470 Closest Common Ancestors(离线tarjan-LCA)
- java ssh
- HDU 1846 (巴什博弈)
- 记程序第一次增补体会
- 中兴事件之痛 ——谁扒掉了中国电子整机产业的皇帝新衣(转)