nyoj 123 士兵杀敌四

来源:互联网 发布:淘宝信誉评价 编辑:程序博客网 时间:2024/05/14 17:18

士兵杀敌(四)

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
描述

南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧。

假设起始时所有人的军功都是0.

输入
只有一组测试数据。
每一行是两个整数T和M表示共有T条指令,M个士兵。(1<=T,M<=1000000)
随后的T行,每行是一个指令。
指令分为两种:
一种形如
ADD 100 500 55 表示,第100个人到第500个人请战,最终每人平均获得了55军功,每次每人获得的军功数不会超过100,不会低于-100。
第二种形如:
QUERY 300 表示南将军在询问第300个人的军功是多少。
输出
对于每次查询输出此人的军功,每个查询的输出占一行。
样例输入
4 10ADD 1 3 10QUERY 3ADD 2 6 50QUERY 3
样例输出
1060


开始觉得用延时标记可以。就是再更新一段区间的时候,并不是顺着这个区间下去,把它每一个子孙节点都更新,而是用一个add标记,记下来这个区间内每个数应该增加多少。只有当查询到这个区间,继续向下查询的时候,才会把这个延时标记带到下边去。

可是后来发现延时标记超时。所以这个题如果用线段树,就可以想象成更新区间,每询问一个点,就把这个点经过的所有的区间所存下的增量相加。毕竟只是询问一个点,所以它所经过的区间只要是有增量标记就说明这个点需要增加多少,这样就省去往下打延时标记的时间了。直接把和累加即可。

#include <stdio.h>#include <string.h>typedef struct{int l, r, add;}tree;tree node[1000003<<2];void bulid(int i, int l, int r){node[i].l = l;node[i].r = r;node[i].add = 0;if(l == r)    return;int mid = (l + r) >> 1;bulid(i << 1, l, mid);bulid((i << 1) + 1, mid + 1, r);}void update(int i, int l, int r, int x){if(node[i].l == l && node[i].r == r){node[i].add += x;return;}int mid = (node[i].l + node[i].r) >> 1;if(r <= mid)    update(i << 1, l, r, x);else if(l > mid)    update((i << 1) + 1, l, r, x);else{update(i << 1, l, mid, x);update((i << 1) + 1, mid + 1, r, x);}}int query(int i, int l, int r, int x){if(node[i].l == node[i].r && node[i].l == x){return node[i].add;}/*if(node[i].add){node[i << 1].add += node[i].add;node[(i << 1) + 1].add += node[i].add;node[i].add = 0;}*/int mid = (node[i].l + node[i].r) >> 1;if(x <= mid)    return node[i].add + query(i << 1, l, mid, x);else    return node[i].add + query((i << 1) + 1, mid + 1, r, x);}int main(){int t, n, x, l, i, r;char cmd[11];scanf("%d %d", &t, &n);bulid(1, 1, n);while(t--){scanf("%s", cmd);switch(cmd[0]){case 'A' : scanf("%d %d %d", &l, &r, &x); update(1, l, r, x); break;case 'Q' : scanf("%d", &x); printf("%d\n", query(1, 1, n, x)); break;}}return 0;}



0 0
原创粉丝点击