BZOJ2527: [Poi2011]Meteors(整体二分)
Description
这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。
BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。
输入:
第一行是两个数N,M。
第二行有M个数,第i个数Oi表示第i段轨道上有第Oi个国家的太空站。
第三行有N个数,第i个数Pi表示第i个国家希望收集的陨石数量。
第四行有一个数K,表示BIU预测了接下来的K场陨石雨。
接下来K行,每行有三个数Li,Ri,Ai,表示第K场陨石雨的发生地点在从Li顺时针到Ri的区间中(如果Li<=Ri,就是Li,Li+1,...,Ri,否则就是Ri,Ri+1,...,m-1,m,1,...,Li),向区间中的每个太空站提供Ai单位的陨石样本。
输出:
N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。
数据范围:
Input
Output
Sample Input
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
Sample Output
NIE
1
解题思路:
整体二分非常好的入门题。
整体二分就是最大化利用二分答案的空隙。
将询问分类,将midcheck后合法的统一右移左指针。
相当于递归栈中实现了棵树。
仔细想想也不无道理,建线段树时一起构建更加省时,这是一个道理,相当于更新环境来检查答案。
这道题就是将mid次陨石全部降下形成一个环境,合法则推入下一个环境。
代码:
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const int N=;
struct object{
int no;
lnt target;
std::vector<int>inp;
}o[N],sp[N],ss[N];
struct matter{
int l;
int r;
lnt val;
}is[N];
int n,m;
int cnt;
int top;
int ans[N];
int blg[N];
lnt line[N];
int lowbit(int x){return x&(-x);}
void update(int pos,lnt v){while(pos<=m){line[pos]+=v;pos+=lowbit(pos);}return ;}
lnt query(int pos){lnt ans=;while(pos){ans+=line[pos];pos-=lowbit(pos);}return ans;}
void occur(int dir,int which)
{
dir=dir*is[which].val;
if(is[which].l<=is[which].r)
{
update(is[which].l,dir);
update(is[which].r+,-dir);
}else{
update(,dir);
update(is[which].r+,-dir);
update(is[which].l,dir);
}
return ;
}
bool check(int no)
{
lnt ret=;
lnt tar=o[no].target;
for(int i=;i<o[no].inp.size();i++)
{
ret+=query(o[no].inp[i]);
if(ret>=tar)
return true;
}
return ret>=tar;
}
void macrs(int l,int r,int ll,int rr)
{
if(ll>rr)
return ;
if(l==r)
{
for(int i=ll;i<=rr;i++)
ans[o[i].no]=l;
return ;
}
int mid=(l+r)>>;
while(top<=mid)
occur(,++top);
while(top>mid)
occur(-,top--);
int sta1=,sta2=;
for(int i=ll;i<=rr;i++)
{
if(check(i))
sp[++sta1]=o[i];
else
ss[++sta2]=o[i];
}
int sta=ll-;
int lmid;
for(int i=;i<=sta1;i++)
o[++sta]=sp[i];
lmid=sta;
for(int i=;i<=sta2;i++)
o[++sta]=ss[i];
macrs(l,mid,ll,lmid);
macrs(mid+,r,lmid+,rr);
return ;
}
int main()
{
//freopen("7.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&blg[i]);
o[blg[i]].inp.push_back(i);
}
for(int i=;i<=n;i++)
{
ans[i]=-;
scanf("%lld",&o[i].target);
o[i].no=i;
}
scanf("%d",&cnt);
for(int i=;i<=cnt;i++)
scanf("%d%d%lld",&is[i].l,&is[i].r,&is[i].val);
is[++cnt]=(matter){,m,0x3f3f3f3f};
macrs(,cnt,,n);
for(int i=;i<=n;i++)
if(ans[i]==-||ans[i]==cnt)
printf("NIE\n");
else
printf("%d\n",ans[i]);
return ;
}
BZOJ2527: [Poi2011]Meteors(整体二分)的更多相关文章
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- [bzoj2527][Poi2011]Meteors_整体二分_树状数组
Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
随机推荐
- DDR工作原理
DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”.DDR SDRAM在原有的SDRAM的基础上改进而来.也正因为如此,DDR能够凭借着转产成本优势 ...
- Lesson 2 Building your first web page: Part 1
In this ‘hands-on’ module we will be building our first web page in no time. We just need to quickly ...
- 洛谷 P2171 Hz吐泡泡
P2171 Hz吐泡泡 题目背景 Hz大大是一种可爱的动物(神).他很喜欢吐泡泡(更喜欢写作业). 题目描述 这天,Hz大大心血来潮,吐了n个不同的泡泡玩(保证没有重复的泡泡).因为他还要写作业,所以 ...
- Eclipse语言的切换方法
安装完中文语言包之后,如果想切换回英文,可以按照下边的方法来做: 创建一个快捷方式,然后鼠标邮件这个快捷方式,在属性里加入-nl "en_US" 记得加空格.应用就可以. 同理切换 ...
- cocos2d-x 3.2 之 2048 —— 第一篇
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- JavaScript数组的某些操作(二)
7.颠倒数组中元素的顺序(注意:不是为数组排序)--reverse方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...
- HBase 数据库检索性能优化策略
HBase 数据表介绍 HBase 数据库是一个基于分布式的.面向列的.主要用于非结构化数据存储用途的开源数据库.其设计思路来源于 Google 的非开源数据库"BigTable" ...
- FFmpeg的HEVC解码器源码简单分析:解码器主干部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- Onvif开发之基础介绍篇
什么是Onvif协议,谁开启了Onvif时代? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在 ...
- Vagrant 和 docker
Docker应用实践 http://dockerone.com/article/146 Vagrant 适合用来管理虚拟机,而docker适合用来管理应用环境 http://www.linuxidc. ...