bzoj4631
4631: 踩气球
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 260 Solved: 133
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1 1 1 1
5 5
2 2
1 3
5
4
2
5
2
3
Sample Output
1
1
2
3
【样例说明】
实际上每次操作的盒子是: 4 2 1 3 5
在第二次操作后,第二个熊孩子会高兴 (区间[2,2]中的气球已经全部被踩爆)。
在第四次操作后,第三个熊孩子会高兴(区间[1,3]中的气球已经全部被踩爆)。
在第五次操作后,第一个熊孩子会高兴(区间[5,5]中的气球已经全部被踩爆)。
HINT
Source
按r排序,每次询问二分查找r的位置,线段树上查找最大值就可以了(我仍然想不出来)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define N 200010
struct query
{
int l,r;
}q[N];
int n,m,Q,cnt,ans,lastans;
int pre[N],nxt[N],a[N];
PII tree[N<<];
bool cp(query x,query y)
{
if(x.r!=y.r) return x.r<y.r;
return x.l>y.l;
}
void update(int l,int r,int x,int pos,int num)
{
if(l==r)
{
tree[x].first=num;
tree[x].second=l;
return;
}
int mid=(l+r)>>;
if(pos<=mid) update(l,mid,x<<,pos,num);
else update(mid+,r,x<<|,pos,num);
if(tree[x<<].first>tree[x<<|].first) tree[x]=tree[x<<];
else tree[x]=tree[x<<|];
}
PII query(int l,int r,int x,int a,int b)
{
if(l>b||r<a) return make_pair(,);
if(l>=a&&r<=b) return tree[x];
int mid=(l+r)>>;
PII t1=query(l,mid,x<<,a,b),t2=query(mid+,r,x<<|,a,b);
if(t1.first>t2.first) return t1; else return t2;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);
pre[i]=i-; nxt[i]=i+;
}
for(int i=;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r);
sort(q+,q+m+,cp);
for(int i=;i<=m;++i) update(,m,,i,q[i].l);
scanf("%d",&Q);
while(Q--)
{
int x; scanf("%d",&x);
x=(x+lastans-)%n+;
a[x]--;
if(a[x])
{
printf("%d\n",ans);
continue;
}
int pos1=n,pos2=n,left=pre[x]+,right=nxt[x]-;
int l=,r=n+;
while(r-l>)
{
int mid=(l+r)>>;
if(q[mid].r>=left) r=pos1=mid; else l=mid;
}
l=; r=n+;
while(r-l>)
{
int mid=(l+r)>>;
if(q[mid].r<=right) l=pos2=mid; else r=mid;
}
/* if(q[pos1].r>right) pos1--;
if(q[pos2].r>right) pos2--;
if(pre[x]==0) pos1=1; */
// printf("x=%d\n",x);
// printf("left=%d right=%d\n",left,right);
// printf("pos1=%d pos2=%d\n",pos1,pos2);
while()
{
PII t=query(,m,,pos1,pos2);
// printf("query=%d\n",t.first);
if(t.first>=left&&t.first<=right&&t.first!=)
{
ans++;
update(,m,,t.second,);
} else break;
}
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
lastans=ans;
printf("%d\n",ans);
}
return ;
}
bzoj4631的更多相关文章
- 【BZOJ4631】踩气球 链表+线段树+堆
[BZOJ4631]踩气球 Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操 ...
- bzoj4631踩气球
bzoj4631踩气球 题意: 有一个序列和一个区间集合,每次将序列中的一个数-1,求此时集合里有多少个区间和为0.序列大小≤100000,区间数≤100000,操作数≤100000. 题解: 此题解 ...
- 【BZOJ-4631】踩气球 线段树 + STL
4631: 踩气球 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 224 Solved: 114[Submit][Status][Discuss] ...
- BZOJ4631 : 踩气球
将所有盒子插入链表,每当一个盒子变空时,从链表里删去它. 查一下它的前驱后继$pre,nxt$,那么$[pre+1,nxt-1]$都是空的. 每次对于$[A,B]$这段都为空,对小朋友按$R$维护线段 ...
- 【bzoj4631】踩气球 线段树
题解: 真是很zz 我都想到线段树分治的思路了... 不过还是一道好题 首先跟线段树分治一样将区间投射到线段树上去 每次修改如果该个区间修改为0,则对他们对应的特定区间-1 这样每个区间会有一次变0, ...
- 【BZOJ4631】踩气球 题解(线段树)
题目链接 ---------------------- 题目大意:给定一个长度为$n$的序列${a_i}$.现在有$m$个区间$[l_i,r_i]$和$q$个操作,每次选取一个$x$使得$a_x--$ ...
随机推荐
- android中的OnClickListener两种实现方式
android的activity点击事件中,通过OnClickListener来实现,要实现点击事件有两种方式 1.通过定义一个OnClickListener的内部类来实现 The example b ...
- 弹飞绵羊(bzoj 2002)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- PHP 常见问题3
1,Http 和 Https 的区别 第一:http 是超文本传输协议,信息是明文传输,https 是具有安全性的 ssl 加密传输协议 第二:http 和 https 使用的是完全不同的连接方式,端 ...
- Codeforces 660E Different Subsets For All Tuples【组合数学】
看了官方题解+q神的讲解才懂... 智商问题.. 讲道理..数学真的比脱单难啊... 题目链接: http://codeforces.com/problemset/problem/660/E 题意: ...
- RedirectAttributes
RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的 他有两种带参的方式: 第一种: attr.addAttribute(&q ...
- Oracle 行转列小结
近期在工作中.对行转列进行了应用,在此做一个简单的小结. 转换步骤例如以下: 1.创建表结构 CREATE TABLE RowToCol ( ID NUMBER(10) not null, U ...
- 一个基于JBoss5.1+EJB3.0 登陆应用
花了几天的时间研究了一下EJB的使用,一直以来都主要是在写终端中的程序,对Java框架的相关的开发非常不熟悉,中间遇到了不少麻烦,还好总算都攻克了.写篇日志记录一下. 经验总结 为什么选择JBoss5 ...
- XP 系统如何安装.NET Framework4.0
1 运行CMD,然后输入命令net stop WuAuServ 2 打开C盘的Windows目录,然后找到SoftwareDistribution文件夹改名为SDold. 3 在CMD窗口中输 ...
- HDU1306 String Matching 【暴力】
String Matching Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- vector draw 试用期结束的 激活方法
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\DBEA4D42-0745-428e-B17A-A5B6CA3AB34B] 把这个注冊表给删 了