本文部分代码及思路来源于:http://www.cnblogs.com/Xiper/p/4470202.html

秋实大哥与小朋友

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

秋实大哥以周济天下,锄强扶弱为己任,他常对天长叹:安得广厦千万间,大庇天下寒士俱欢颜。

所以今天他又在给一群小朋友发糖吃。

他让所有的小朋友排成一行,从左到右标号。在接下去的时间中,他有时会给一段区间的小朋友每人v颗糖,有时会问第x个小朋友手里有几颗糖。

这对于没上过学的孩子来说实在太困难了,所以你看不下去了,请你帮助小朋友回答所有的询问。

Input

第一行包含两个整数n,m,表示小朋友的个数,以及接下来你要处理的操作数。

接下来的m行,每一行表示下面两种操作之一:

0 l r v : 表示秋实大哥给[l,r]这个区间内的小朋友每人v颗糖1 x : 表示秋实大哥想知道第x个小朋友手里现在有几颗糖

Output

对于每一个1 x操作,输出一个整数,表示第x个小朋友手里现在的糖果数目。

Sample input and output

Sample Input Sample Output
3 4
0 1 3 1
1 2
0 2 3 3
1 3 
1
4

树状数组/线段树+离散化

经历了这道题,对于离散化有了具体的理解。离散化,适用于基数很大,但是实际操作时涉及到的数却很小的问题。
首先,离散化是离线算法。离散化的关键在于,那些没有被涉及到的数,可以去掉。
如这道题里,假如我的区间是[1,10^9]。我有三个操作,把[1,10^6]里的数都加上3,把[10^5,10^9]里的数加上2,查询10,10^4,10^7上的数各是多少。
我们就可以发现,数很大,但是涉及到的数却只有几个。我们涉及到了1,10,10^4,10^5,10^6,10^7,10^9,我们把这几个数排好序,然后做个映射:1->1,10->2,10^4->3,10^5->4,10^6->5,10^7->6,10^9->7。
所以我们的操作相当于:把[1,5]里的数都加上3,把[4,7]里的数都加上2,查询2,3,6上的数各是多少。于是我们发现,大大减小了内存的开销。
那么,为什么可以我们用离散化呢?因为我们发现我们对整个区间里进行了操作,但是,没有被查询到的点都是没用的点。我们完全可以把他们去掉,而对被查询的点没有影响。假如是个区间求和的问题,那么我觉得可能就不能用离散化了吧。
关于离散化,这里贴一篇博文,供大家了解离散化的思想:http://www.cnblogs.com/saltless/archive/2010/11/14/1877171.html
关于树状数组,也贴一篇博文:http://www.hawstein.com/posts/binary-indexed-trees.html
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
#define maxn 200005
set<int>jud;
long long tr[maxn];
int point[maxn];
//是否可以改掉,只用set而不用再开一个数组?
int size = 0;
struct operate
{int op, l, r, v;operate(int op, int l, int r, int v){this->op = op; this->l = l;this->r = r; this->v = v;}
};
queue<operate>operque;
void update(int l, int r, int val)
{for (int i = r; i > 0; i -= i&(-i))tr[i] += val;for (int i = l - 1; i > 0; i -= i&(-i))tr[i] += (-val);
}
long long query(int idx)
{long long sum = 0;while (idx <= size){sum += tr[idx];idx += idx&(-idx);}return sum;
}
int main()
{int l = 0, r = 0, x = 0;int n = 0, m = 0, bl = 0, v = 0;char op[10] = { '\0' };char fst[10] = { '\0' };memset(point, 0, sizeof(point));memset(tr, 0, sizeof(tr));gets(fst);sscanf(fst,"%d %d", &n, &m);while (m--){gets(op);if (op[0] == '0'){sscanf(op, "%d %d %d %d", &bl, &l, &r, &v);if (!jud.count(l)){jud.insert(l);point[++size] = l;}if (!jud.count(r)){jud.insert(r);point[++size] = r;}operque.push(operate(bl, l, r, v));}else if (op[0] == '1'){sscanf(op, "%d %d", &bl, &x);if (!jud.count(x)){jud.insert(x);point[++size] = x;}operque.push(operate(bl, 0, 0, x));}}sort(point + 1, point + 1 + size);while (!operque.empty()){operate temp = operque.front(); operque.pop();if (temp.op & 1){int pos = lower_bound(point + 1, point + 1 + size, temp.v) - point;printf("%lld\n", query(pos));}else{int left = lower_bound(point + 1, point + 1 + size, temp.l) - point;int right = lower_bound(point + 1, point + 1 + size, temp.r) - point;update(left, right, temp.v);}}return 0;
}

CDOJ 1059 秋实大哥与小朋友(离散化)相关推荐

  1. UESTC-1059 秋实大哥与小朋友(离散化+线段树)

    秋实大哥与小朋友 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  2. 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化...

    秋实大哥与小朋友 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...

  3. 线段树 (更新区间查询点)秋实大哥与小朋友

    题目链接:https://vjudge.net/contest/186273#problem/D D - 秋实大哥与小朋友 Problem Description 秋实大哥以周济天下,锄强扶弱为己任, ...

  4. CDOJ 1070 秋实大哥打游戏 带权并查集

    链接 F - 秋实大哥打游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

  5. cdoj 1070 秋实大哥打游戏 带权并查集

    题目链接: http://acm.uestc.edu.cn/#/problem/show/1070 题意: 题解: 带权并查集 每次往上更新的时候,顺便把边权更新了就好 记住得路径压缩 代码: 1 # ...

  6. CDOJ1059-秋实大哥与小朋友

    秋实大哥与小朋友 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  7. cdoj 秋实大哥搞算数

    地址:http://acm.uestc.edu.cn/#/contest/show/95 题目: N - 秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others)   ...

  8. cdoj 2015数据结构专题:D - 秋实大哥与战争

    男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡, ...

  9. 2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈

    秋实大哥去打工 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

最新文章

  1. BitMap 内存使用优化
  2. AttributeError: module 'select' has no attribute 'error'解决方法
  3. linux内核关闭tcp校验,linux内核tcp调优规范与方案
  4. oc引导win方法_[OC更新]机械革命X1/X6TIS标压测试版更新
  5. win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题
  6. PyTorch C++ API libtorch 简介
  7. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
  8. ListDataView:让你的List可以被任何Site引用
  9. python 中判断是不是通过break;跳出循环(一分钟读懂)
  10. Tensorflow结点打包和依赖控制
  11. windows安装docker环境并配置镜像
  12. 郝斌老师 c语言学习笔记
  13. 信度spss怎么做_Spss详细图文教程——问卷信度和效度检验步骤图解
  14. 中国地理省份行政区划,代表文化收集整理
  15. 利用Python进行数据分析(Ⅳ)
  16. DeFi 2.0的LaaS协议Elephant,重振DeFi赛道发展的关键
  17. eclipse:解决 The word is not correctly spelled问题
  18. HTML5微数据初识
  19. ImageJ自动测量每个细胞平均荧光强度及批量处理多张图片
  20. Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)

热门文章

  1. 从苏宁电器到卡巴斯基第35篇:我与卡巴斯基的邂逅(中)
  2. 达摩院技术创新全景|懂你的语音AI
  3. 1.1 NBU基本概念
  4. 2017网易秋招编程集合
  5. IDEA项目无法引用本地Class类,而且各种报错
  6. IT服务管理标准化解决方案实践
  7. ccf2016年4月10日认证考试 俄罗斯方块问题思路
  8. Python的下载及安装
  9. cisco 2821 路由器的端口映射
  10. element-ui 的 el-input-number的默认值设置为空