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
- NYOJ 123 士兵杀敌 四
- NYOJ 123 士兵杀敌(四)
- nyoj 123 士兵杀敌四
- nyoj 123 士兵杀敌(四)
- NYOJ 123 士兵杀敌(四)
- NYOJ-123士兵杀敌(四)
- nyoj 题目123 士兵杀敌(四)
- NYOJ-123士兵杀敌(四)【线段树】
- nyoj 123士兵杀敌(四)
- nyoj 123 士兵杀敌(四)
- NYOJ-123-士兵杀敌(四)
- nyoj 123 士兵杀敌(四) 插线问点
- NYOJ-123 士兵杀敌(四) (线段树)
- NYOJ 123 士兵杀敌(四)
- NYOJ士兵杀敌(四)
- NYOJ-123 士兵杀敌(四)树状数组 插线问点
- nyoj 123 士兵杀敌(四)【树状数组】+【插线问点】
- NYOJ-123-士兵杀敌(四)【线段树】
- c中的数据类型
- 概率dp && 高斯消元 专题训练
- RequestInputStream获取中文乱码
- Microsoft(R) Developer Studio 已停止工作 解决办法(3)
- java34.HTTP通信------使用HttpClient进行Get方式通信
- nyoj 123 士兵杀敌四
- dialog
- 安卓开发:使用ViewPager+Fragment实现选项卡
- apche2.4 基于前缀域名的虚拟主机配置
- memcached—使用
- Hadoop可能出现的问题
- Linux内核延时和时间测量函数
- php中 session和cookie的基本使用
- 235. Lowest Common Ancestor of a Binary Search Tree