题目链接: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
0 1 3 1
1 2
0 2 3 3
1 3
1
4

用了跟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 - 秋实大哥与小朋友的更多相关文章

  1. CDOJ 1059 秋实大哥与小朋友 STL(set)+离散化+BIT区间更新单点查询

    链接: A - 秋实大哥与小朋友 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Subm ...

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

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

  3. UESTC_秋实大哥与小朋友 2015 UESTC Training for Data Structures<Problem A>

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

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

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

  5. UESTC 1061 秋实大哥与战争 线段树区间合并

    秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 男儿何不带吴钩, ...

  6. uestc 1073 秋实大哥与线段树 Label:线段树

    秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) “学习本无底, ...

  7. UESTC 1074 秋实大哥搞算数 栈模拟

    秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  8. UESTC - 1057 秋实大哥与花 线段树

    题意 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前. 所以秋实大哥精心照料了很多花朵.现在所有的花朵排成了一行,每朵花有一个愉悦值. 秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花朵的愉 ...

  9. [UESTC1059]秋实大哥与小朋友(线段树, 离散化)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...

随机推荐

  1. Android ViewDragHelper全然解析 自己定义ViewGroup神器

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46858663. 本文出自:[张鸿洋的博客] 一.概述 在自己定义ViewGro ...

  2. mongodb 初学 索引

    连接服务器异常(Connection refused) 啦啦啦 mongodb 搭建主从服务器 啦啦啦 Mongodb启动命令mongod参数说明 啦啦啦 MongoDB 分片 啦啦啦 啦啦啦 啦啦啦 ...

  3. POJ 3258 River Hopscotch(二分法搜索)

    Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...

  4. PHP压缩html网页代码原理(清除空格,换行符,制表符,注释标记)

    本博启用了一个叫wp super cache的页面压缩工具, 源代码没有去查看,不过原理很简单. 我们可以自己动手书写一个压缩脚本. 清除换行符,清除制表符,去掉注释标记 .它所起到的作用不可小视. ...

  5. 【django】Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

    问题描述:启动django服务时出现“Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试.”的错误 问题原因:8000端口被占用了 解决办法:默认启动的 ...

  6. Kafka Java consumer动态修改topic订阅

    前段时间在Kafka QQ群中有人问及此事——关于Java consumer如何动态修改topic订阅的问题.仔细一想才发现这的确是个好问题,因为如果简单地在另一个线程中直接持有consumer实例然 ...

  7. INSTALL_FAILED_USER_RESTRICTED

    我这里出问的问题是在 清单文件中 <provider <mate_data 中少了   android:resource="@xml/filepaths" 加上就好 了

  8. C++易混淆知识点整理

    // 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...

  9. bootstrapValidator插件动态添加和移除校验

    bootstrapValidator对动态生成的表单进行校验,需要调用方法:addField. 方法:addField(field,option);   field可以是表单的name也可以是jQue ...

  10. MongoDB开篇

    1.安装MongoDB  官方下载地址  https://www.mongodb.com/download-center#community 这个文件下载的有些奇怪,这个zip的文件下载下来和百度出来 ...