codecomb 2098【stone】
题目描述
Description
n个石堆围成一圈,提供两种操作:
1、每次将[L,R]堆的石子数量+k,其中,1<=L,R<=n,k>=0。
2、询问有最多石子的那一堆有多少石子。
现在,要求在线解决该问题。
Input
第一行两个整数n和m,n表示石子圈的长度,m表示操作数量。
以下m行,首先一个是整数t,t=1或2,表示是哪种操作。 如果t=1,则后面跟三个整数l,r,k,表示区间[l,r]的所有石子堆石子数量+k,如果t=2表示上述询问操作。
Output
对于每一个询问,输出石子数量。
Sample Input
3 3
1 1 2 1
1 3 1 2
2
Sample Output
3
Hint
数据范围:
10%的数据m<=1000
40%的数据n<=100000
100%的数据n<2^32,m<=100000
答案保证在longint范围内
离散完线段树维护区间最大值
我会说原来我一直不会线段树维护区间最大最小?
不过黄巨大说正解其实是类似可持久化线段树的搞法
一开始直接搞出l=1 r=2^32的第一条线段,然后修改时照样修改,遇到完全覆盖的时候直接更新tag退出,否则递归,没有左右节点的就插入一条边,这样每次最坏插入一条链,只有32个
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<ctime>
#define LL long long
#define inf 2147483647
#define pa pair<int,int>
#define pi 3.1415926535897932384626433832795028841971
#define mod 100007
#define N 300010
using namespace std;
struct hashing{
int next,rnk;
LL v;
}hash[N];
bool operator <(const hashing &a,const hashing &b){return a.v<b.v;}
struct oprations{
int l,r,x;
bool opr;//0:work 1:query
}w[N];
int rnk[N];
int head[mod];
int n,m,cnt;
LL chafen[N];
LL sum,ans,toadd;
inline int ins(LL w)
{
LL u=w%mod;
for (int i=head[u];i;i=hash[i].next)
if (hash[i].v==w) return i;
hash[++cnt].v=w;
hash[cnt].next=head[u];
hash[cnt].rnk=cnt;
head[u]=cnt;
return cnt;
}
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct segtree{
int l,r,mx,tag;
}tree[1000010];
int treesize;
inline void pushdown(int k)
{
int t=tree[k].tag;
tree[k].tag=0;
tree[k<<1].tag+=t;
tree[k<<1|1].tag+=t;
tree[k<<1].mx+=t;
tree[k<<1|1].mx+=t;
}
inline void update(int k)
{
if (tree[k].l==tree[k].r)return;
tree[k].mx=max(tree[k<<1].mx,tree[k<<1|1].mx);
}
inline void buildtree(int now,int l,int r)
{
tree[now].l=l;tree[now].r=r;
if (l==r)return;
int mid=(l+r)>>1;
buildtree(now<<1,l,mid);
buildtree(now<<1|1,mid+1,r);
}
inline void add(int now,int l,int r,int dat)
{
pushdown(now);
int x=tree[now].l,y=tree[now].r;
if (x==l&&y==r)
{
tree[now].tag+=dat;
tree[now].mx+=dat;
return;
}
int mid=(x+y)>>1;
if (r<=mid)add(now<<1,l,r,dat);
else if(l>mid)add(now<<1|1,l,r,dat);
else
{
add(now<<1,l,mid,dat);
add(now<<1|1,mid+1,r,dat);
}
update(now);
}
int main()
{
n=read();m=read();
for (int i=1;i<=m;i++)
{
w[i].opr=(read()==2);
if (!w[i].opr)
{
w[i].l=ins(read());
w[i].r=ins(read());
w[i].x=read();
}
}
sort(hash+1,hash+cnt+1);
for (int i=1;i<=cnt;i++)
rnk[hash[i].rnk]=i;
for (int i=1;i<=m;i++)
if (!w[i].opr)
{
w[i].l=rnk[w[i].l];
w[i].r=rnk[w[i].r];
}
buildtree(1,1,cnt);
for (int i=1;i<=m;i++)
{
if(w[i].opr)printf("%d\n",tree[1].mx);
else
{
if (w[i].l>w[i].r)
{
add(1,1,w[i].r,w[i].x);
add(1,w[i].l,cnt,w[i].x);
}else add(1,w[i].l,w[i].r,w[i].x);
}
}
}
codecomb 2098【stone】的更多相关文章
- codecomb 2086【滑板鞋】
题目背景 我的滑板鞋时尚时尚最时尚 回家的路上我情不自禁 摩擦 摩擦 在这光滑的地上摩擦 月光下我看到自己的身影有时很远有时很近 感到一种力量驱使我的脚步 有了滑板鞋天黑都不怕 题目描述 你在魅力之都 ...
- 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)
[题目] Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2, ...
- 【BZOJ2138】stone Hall定理+线段树
[BZOJ2138]stone Description 话说Nan在海边等人,预计还要等上M分钟.为了打发时间,他玩起了石子.Nan搬来了N堆石子,编号为1到N,每堆包含Ai颗石子.每1分钟,Nan会 ...
- 【BZOJ2138】stone(线段树,Hall定理)
[BZOJ2138]stone(线段树,Hall定理) 题面 BZOJ 题解 考虑一个暴力. 我们对于每堆石子和每个询问,显然是匹配的操作. 所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\ ...
- codecomb 2100【警察叔叔就是这个人!】
题目背景 十个地方十人十色 全部都是猥琐大叔 这里也是那里也是 行踪可疑 现如今hentai横行,警察叔叔们不得不采取特♂殊手段惩戒这些家伙 题目描述 魅力之都是一个有N个路口,M条双向道路连接的城市 ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 【POJ1113】Wall(凸包)
[题目] Description Once upon a time there was a greedy King who ordered his chief Architect to build a ...
- 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶
虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...
- Fruits【水果】
Fruits Many of us love July because it's the month when nature's berries and stone fruits are in abu ...
随机推荐
- 【转】Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
原文网址:http://dadekey.blog.51cto.com/107327/119938 我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touch variable # vi ...
- Hdu2425-Hiking Trip(优先队列搜索)
Hiking in the mountains is seldom an easy task for most people, as it is extremely easy to get lost ...
- UVa232.Crossword Answers
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ
许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...
- 【转】Linux awk命令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- [转]Laravel 4之表单
Laravel 4之表单 http://dingjiannan.com/2013/laravel-forms/ 创建表单 除了原有的方式创建表单,Laravel提供了一种便捷的方式 <!-- a ...
- js对象克隆, 深复制.
亲测有效: //对象克隆 function clone(obj) { // Handle the 3 simple types, and null or undefined if (null == o ...
- 《JavaScript 闯关记》之作用域和闭包
作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理. 作用域 任何程序设计语言都有作用域的概念,简单 ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Android-----------国际化多国语言文件夹命名汇总
*如果不区分地区,则不加后面的-rxx内容 Arabic, Egypt (ar_rEG) —————————–阿拉伯语,埃及 Arabic, Israel (ar_rIL) ———————— ...