秋实大哥与小朋友

Time Limit: 1 Sec  Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/contest/show/59

Description

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

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

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

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

Input

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

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

0 l r v : 表示秋实大哥给[l,r]这个区间内的小朋友每人v颗糖

1 x : 表示秋实大哥想知道第x个小朋友手里现在有几颗糖

1≤m,v≤100000,1≤l≤r≤n,1≤x≤n,1≤n≤100000000。1≤x≤n,1≤n≤100000000。

Output

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

Sample Input

3 4
0 1 3 1
1 2
0 2 3 3
1 3

Sample Output

1
4

HINT

题意

题解:

灰常简单的一个区间更新+单点查询问题,但是n比较大!比较大!肿么办?

这位 小彭玉请告诉我,肿么办?
哈,我们先把数读进来,然后排个序,维护个前缀和,或者来个map,就可以离散化啦!
我真是机智呀!

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define MID(a,b) (a+((b-a)>>1))
const int N=100000*5;
typedef long long LL;struct node
{int lft,rht;LL sum,add;int mid(){return MID(lft,rht);}void fun(LL tmp){add+=tmp;sum+=(rht-lft+1)*tmp;}
};int y[N];struct Segtree
{node tree[N*4];void relax(int ind){if(tree[ind].add){tree[LL(ind)].fun(tree[ind].add);tree[RR(ind)].fun(tree[ind].add);tree[ind].add=0;}}void build(int lft,int rht,int ind){tree[ind].lft=lft;    tree[ind].rht=rht;tree[ind].sum=0;    tree[ind].add=0;if(lft==rht) tree[ind].sum=y[lft];else{int mid=tree[ind].mid();build(lft,mid,LL(ind));build(mid+1,rht,RR(ind));tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;}}void updata(int st,int ed,int ind,int add){int lft=tree[ind].lft,rht=tree[ind].rht;if(st<=lft&&rht<=ed) tree[ind].fun(add);else{relax(ind);int mid=tree[ind].mid();if(st<=mid) updata(st,ed,LL(ind),add);if(ed> mid) updata(st,ed,RR(ind),add);tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;}}LL query(int st,int ed,int ind){int lft=tree[ind].lft,rht=tree[ind].rht;if(st<=lft&&rht<=ed) return tree[ind].sum;else{relax(ind);int mid=tree[ind].mid();LL sum1=0,sum2=0;if(st<=mid) sum1=query(st,ed,LL(ind));if(ed> mid) sum2=query(st,ed,RR(ind));return sum1+sum2;}}
}seg;
int kiss[100000*5];
int dow[100000*5];
struct oi
{int x,y,c,id,ty;
};
oi ans[100000*5];
int tot1,tot2=1;
int getid(int x)
{int l=1,r=tot2;int mid=(l+r)>>1;while(dow[mid]!=x&&dow[l]!=x&&dow[r]!=x){mid=(l+r)>>1;if(dow[mid]>x)r=mid;elsel=mid+1;}if(dow[mid]==x)return mid;if(dow[l]==x)return l;if(dow[r]==x)return r;
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){char str[5];int a,b,c;memset(y,0,sizeof(y));seg.build(1,100000*3,1);for(int i=0;i<m;i++){scanf("%s",str);if(str[0]=='1'){scanf("%d",&a);ans[i].x=a,ans[i].y=a,ans[i].c=1,ans[i].id=i,ans[i].ty=-1;kiss[tot1++]=a;}else{scanf("%d%d%d",&a,&b,&c);ans[i].x=a,ans[i].y=b,ans[i].c=c,ans[i].id=i,ans[i].ty=1;kiss[tot1++]=a;kiss[tot1++]=b;}}tot2=0;sort(kiss,kiss+tot1);for(int i=0;i<tot1;i++)if(dow[tot2]!=kiss[i])dow[++tot2]=kiss[i];for(int i=0;i<m;i++){if(ans[i].ty==-1){int x=getid(ans[i].x);printf("%lld\n",seg.query(x,x,1));}else{int x=getid(ans[i].x),y=getid(ans[i].y),z=ans[i].c;seg.updata(x,y,1,z);}}}return 0;
}

转载于:https://www.cnblogs.com/qscqesze/p/4426296.html

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

  1. 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈

    秋实大哥搞算数 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1074 Des ...

  2. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

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

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

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

  4. 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询...

    D - 秋实大哥与战争 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...

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

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

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

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

  7. UESTC-1057 秋实大哥与花(线段树+成段加减+区间求和)

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

  8. UESToj 1057 秋实大哥与花 ( 线段树

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

  9. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

最新文章

  1. 过年回家应对七大姑八大姨,程序猿绝了!
  2. 【重发】终于提交了项目第一个版本到git@osc了。兴奋ing
  3. 【直播资料下载】Python第五讲——关于爬虫如何做js逆向的思路
  4. SharePoint 账号
  5. Python tcp编程,TCP服务端和TCP客户端代码编写
  6. 发送结构化数据Client端
  7. Pmwiki基本编辑功能
  8. Ubuntu18.04在线安装JDK1.8
  9. 如何用postman发送post请求
  10. Leetcode刷题指南和top100题目
  11. 爬去图片插件_学不会你打我,一个插件爬取亚马逊数据!
  12. android7.0+关闭wifi连接CA验证
  13. android 隐藏桌面图标
  14. 使用CSS控制表单样式/示例演示
  15. DSP 2812: 使用C++封装外设时钟控制
  16. echarts设置主标题和副标题样式
  17. rpm -qa的意思详解
  18. 一个在线的文件密码破解网站( rar文件、zip文件、pdf文件、ppt文件、xls文件)
  19. python 从字符串中提取数字
  20. win7旗舰版6l打印机咋安驱动_打印机安装不了,教您解决打印机驱动安装不了

热门文章

  1. Linux 内核裁剪方法
  2. 学计算机二手笔记本,二手笔记本中的套路 坑你就跟玩一样
  3. conflicting requests nothing provides libpq.so.5(RHPG_9.6)(64bit) needed **
  4. OCR文档识别的工作原理
  5. 看了一遍蝴蝶效应1,在看到了一篇很好的《蝴蝶效应1》影评
  6. DAY5 C高级笔记
  7. ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章)
  8. 神箭手 美国亚马逊_亚马逊会摧毁美国的购物中心吗?还是会拯救它们?
  9. 定义一个点(point)类表示二维空间的点(x,y)
  10. 使用 BOL API 创建 SAP CRM IBASE 数据