UESTC 1059 - 秋实大哥与小朋友
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
秋实大哥以周济天下,锄强扶弱为己任,他常对天长叹:安得广厦千万间,大庇天下寒士俱欢颜。
所以今天他又在给一群小朋友发糖吃。
他让所有的小朋友排成一行,从左到右标号。在接下去的时间中,他有时会给一段区间的小朋友每人vv颗糖,有时会问第xx个小朋友手里有几颗糖。
这对于没上过学的孩子来说实在太困难了,所以你看不下去了,请你帮助小朋友回答所有的询问。
Input
第一行包含两个整数nn,mm,表示小朋友的个数,以及接下来你要处理的操作数。
接下来的mm行,每一行表示下面两种操作之一:
0 l r v : 表示秋实大哥给[l,r]这个区间内的小朋友每人v颗糖 1 x : 表示秋实大哥想知道第x个小朋友手里现在有几颗糖
1≤m,v≤100000,1≤l≤r≤n,1≤x≤n,1≤n≤100000000。
Output
对于每一个11 xx操作,输出一个整数,表示第xx个小朋友手里现在的糖果数目。
Sample input and output
| Sample Input | Sample Output |
|---|---|
3 4 |
1 |
用了跟UESTC 1057一样的模板,可以说跟1057一脉相承(click to http://www.cnblogs.com/dilthey/p/6824863.html)
当然啦,如果是完全一样的写法,还不如不做,肯定有不同之处。
不难看到,这题的n达到了1e8,不可能开一个4倍的MAXN的node数组,这时候便需要进行离散化。
引用:

(source: http://blog.csdn.net/code12hour/article/details/46596503)
然后观察了半天网上的题解,看的我莫名烦躁,就自己写想了个办法离散化;
①我们可以用栈来存储所有的input的操作,等到所有input完成,建树操作也完成后,再从栈里一个个取出操作,完成这些操作。
②我们可以利用map自带升序、单对单映射的功能来实现上述的离散化。
对于每个在input里出现的点,我们都在把他放到map里,等input结束,我们用迭代器对map进行遍历,因为正好迭代器是从小到大遍历map,我们就可以借此把这些点映射到1~k;
最后,我们在update和query时记得把l、r、x都先进行映射,再传给update()、query()函数就行。
#include<cstdio>
#include<map>
#include<queue>
#define MAXM 100000+5
typedef long long ll;
using namespace std;
map<int,int> point;
struct Op{
int type,l,r,v,x;
};
queue<Op> op;
struct Node{
int l,r;
ll sum,lazy;
void update(ll x)
{
sum+=(r-l+)*x;
lazy+=x;
}
}node[*MAXM];
int n,m,size;
void pushdown(int root)
{
if(node[root].lazy)
{
node[root*].update(node[root].lazy);
node[root*+].update(node[root].lazy);
node[root].lazy=;
}
}
void pushup(int root)
{
node[root].sum=node[root*].sum+node[root*+].sum;
}
void build(int root,int l,int r)
{
node[root].l=l; node[root].r=r;
node[root].sum=; node[root].lazy=;
if(l==r) node[root].sum=;
else
{
int mid=l+(r-l)/;
build(root*,l,mid);
build(root*+,mid+,r);
pushup(root);
}
}
void update(int root,int st,int ed,int val)
{
if(st>node[root].r || ed<node[root].l) return;
if(st<=node[root].l && node[root].r<=ed) node[root].update(val);
else
{
pushdown(root);
update(root*,st,ed,val);
update(root*+,st,ed,val);
pushup(root);
}
}
ll query(int root,int st,int ed)
{
if(ed<node[root].l || node[root].r<st) return ;
if(st<=node[root].l && node[root].r<=ed) return node[root].sum;
else
{
ll ans=;
pushdown(root);
ans+=query(root*,st,ed);
ans+=query(root*+,st,ed);
pushup(root);
return ans;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
Op tmp;
scanf("%d",&tmp.type);
if(tmp.type)
{
scanf("%d",&tmp.x);
tmp.l=tmp.r=tmp.v=-;
if(!point.count(tmp.x)) point[tmp.x]=;
op.push(tmp);
}
else
{
scanf("%d%d%d",&tmp.l,&tmp.r,&tmp.v);
tmp.x=-;
if(!point.count(tmp.l)) point[tmp.l]=;
if(!point.count(tmp.r)) point[tmp.r]=;
op.push(tmp);
}
}
size=;
for(map<int,int>::iterator i=point.begin();i!=point.end();i++) (*i).second=(++size);
build(,,size);
while(!op.empty())
{
Op now=op.front();op.pop();
if(now.type)
{
printf("%lld\n",query(,point[now.x],point[now.x]));
}
else
{
update(,point[now.l],point[now.r],now.v);
}
}
}
note:再次强调要认真估计一下node[]数组要开的大小……跟UESTC1057一样,第一发都RE在test 8上,真是僵硬……
UESTC 1059 - 秋实大哥与小朋友的更多相关文章
- CDOJ 1059 秋实大哥与小朋友 STL(set)+离散化+BIT区间更新单点查询
链接: A - 秋实大哥与小朋友 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Subm ...
- 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化
秋实大哥与小朋友 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...
- UESTC_秋实大哥与小朋友 2015 UESTC Training for Data Structures<Problem A>
A - 秋实大哥与小朋友 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC-1059 秋实大哥与小朋友(离散化+线段树)
秋实大哥与小朋友 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC 1061 秋实大哥与战争 线段树区间合并
秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 男儿何不带吴钩, ...
- uestc 1073 秋实大哥与线段树 Label:线段树
秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) “学习本无底, ...
- UESTC 1074 秋实大哥搞算数 栈模拟
秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- UESTC - 1057 秋实大哥与花 线段树
题意 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前. 所以秋实大哥精心照料了很多花朵.现在所有的花朵排成了一行,每朵花有一个愉悦值. 秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花朵的愉 ...
- [UESTC1059]秋实大哥与小朋友(线段树, 离散化)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...
随机推荐
- 【Winform】自定义Messagebox
1.保持Msgbox的Icon 2.可以追加Checkbox,RadioBOx 下载
- 5 -- Hibernate的基本用法 --4 2 hibernate.properties文件与hibernate.cfg.xml文件
hibernate.properties : project\etc\hibernate.properties hibernate.cfg.xml : project\etc\hibernate.cf ...
- Jackson Gson Json.simple 比较
为公司做了小任务,需要用到Java Json库,Json库我几个月之前就用过,不过那时候是跟着项目来的,延续了项目的使用习惯直接用了jackson Json,而这次我觉得好好比较一下几个常见的Json ...
- vue再次入手(数据传递②)
接上篇~ 5.最后一种,互通:无所谓父组件或者是子组件,而是随时随地都能调用到数据的一种方法.便是利用vuex来管理数据,官网描述: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它 ...
- KindEditor上传图片无法使用绝对路径
之前百度,一直查到的都是urlType使用domain,但是根本没有效果.想着去插件代码里面看,但是实在看不下去了. 最后还是百度去了.然后查到下面的一个方法.直接将其中的某部分代码注释到就好了.具体 ...
- 【数据处理】SQL Server高效大数据量存储方案SqlBulkCopy
要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 一个比较好的解决方案,就是采用SqlBulkCopy来处理存储数据. SqlBulkCopy存储大批量的数 ...
- Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server
改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "use ...
- 日记整理---->2016-11-21
2016-11-21简单的总结一下学到的知识点.作为一个目标而存在的东西,总是那么美丽而优雅. 一.PE中事务的编写 getTransactionTemplate().execute(new Tran ...
- Linux下grep命令查找带有tab(退格)的字符
需要在日志文件统计删除的主帖,而日志文件是tab(退格)字符隔开的:假设日志文件名叫delete.log. 保存格式和保存的数据如下, 删除日期 帖子类型(11为主帖,12为回帖 ...
- sencha touch 类的使用
sencha touch 有一套自己的类机制,可以以面向对象的方式去写代码,封装业务逻辑,sencha touch 的组件.插件.api等都建立在这一套类机制的上面 在实际开发中,我们需要遵循这一套机 ...