【BZOJ2527】【POI2011】Meteors [整体二分]
Meteors
Time Limit: 60 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。
BIU的第i个成员国希望能够收集Pi单位的陨石样本。你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石。
Input
第一行是两个数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单位的陨石样本。
Output
输出N行。第i行的数Wi表示第i个国家在第Wi波陨石雨之后能够收集到足够的陨石样本。如果到第K波结束后仍然收集不到,输出NIE。
Sample Input
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
Sample Output
NIE
1
HINT
Main idea
每个国家有一个需要价值,一个国家可以控制多个点,定义国家已经获得的价值为每个控制点上的价值和,每次操作可以将一段区间上每个点都加上一个价值,问每个国家在第几个操作时达到了需要价值,若达不到则输出NIE。
Solution
我们先从二分层面去考虑,对于一个点来说,可以二分答案来求解,那么我们就可以利用整体二分。
整体二分,就是我们将所有的询问一起来做,然后二分操作区间L,R,执行L,MID的部分,
然后判断询问是否可行,如果可行,将这个询问放到左边区间,否则加上左边的价值再把这个询问放到右区间。然后继续递归操作区间。
对于这道题来说,由于一个国家可以控制多个点,我们用链表来存,然后用Bit来判断是否可行。
这样就解决了这道题\(≧▽≦)/。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std; typedef long long s64; const int ONE=;
const int INF=; int n,m,k;
int x;
int next[ONE],first[ONE],go[ONE],tot;
int Ans[ONE]; struct power
{
int need;
int id;
}a[ONE],qL[ONE],qR[ONE]; struct opera
{
int l,r;
int val;
}oper[ONE]; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Add(int u,int v)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v;
} namespace Bit
{
struct power
{
s64 value;
}Node[ONE]; int lowbit(int i)
{
return i&-i;
} void Update(int R,int x)
{
for(int i=R;i<=m;i+=lowbit(i))
Node[i].value+=x;
} s64 Query(int R)
{
s64 res=;
for(int i=R;i>=;i-=lowbit(i))
res+=Node[i].value;
return res;
}
} void Update(int l,int r,int val)
{
if(l>r)
{
Bit::Update(l,val); Bit::Update(m+,-val);
Bit::Update(,val); Bit::Update(r+,-val);
}
else
{
Bit::Update(l,val); Bit::Update(r+,-val);
}
} void Solve(int l,int r,int L,int R)//l,r 询问;L,R 操作
{
if(l>r) return;
if(L==R)
{
for(int i=l;i<=r;i++)
Ans[a[i].id] = L;
return;
} int M=(L+R)>>;
for(int i=L;i<=M;i++)
Update(oper[i].l, oper[i].r, oper[i].val); int l_num=,r_num=;
for(int i=l;i<=r;i++) //判断询问在哪个区间
{
s64 sum=;
for(int e=first[a[i].id];e;e=next[e])
{
sum+=Bit::Query(go[e]);
if(sum>=a[i].need) break;
} if(sum>=a[i].need)
{
qL[++l_num]=a[i];
}
else
{
qR[++r_num]=a[i];
qR[r_num].need-=sum;
}
}
int t=l;
for(int i=;i<=l_num;i++) a[t++]=qL[i];
for(int i=;i<=r_num;i++) a[t++]=qR[i]; for(int i=L;i<=M;i++)
Update(oper[i].l, oper[i].r, -oper[i].val); Solve(l,l+l_num-,L,M);
Solve(l+l_num,r,M+,R);
} int main()
{
n=get(); m=get();
for(int i=;i<=m;i++) {x=get(); Add(x,i);}
for(int i=;i<=n;i++)
{
a[i].need=get();
a[i].id=i;
} k=get();
for(int i=;i<=k;i++)
{
oper[i].l=get(); oper[i].r=get(); oper[i].val=get();
} Solve(,n,,k+); for(int i=;i<=n;i++)
{
if(Ans[i] > k) printf("NIE");
else printf("%d",Ans[i]);
printf("\n");
}
}
【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(整体二分)
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- 【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 ...
随机推荐
- SVN 使用时的小错误
在使用SVN的时候总是出现一些小问题,今天又出现了一个,诶,分享一下吧! Error:(个人文件夹名http://www.qdjhu.com/anli_xq/f_wancheng.php) is ...
- C++学习010-将某个地址转化为指针
如果需要将某个具体的地址转化为指针,可以直接使用类型那个转换来是实现. 实例如下 int main() { void* pData = (void*)(0x004001); std::cout < ...
- Python 套接字的使用 (1)
获取设备名称和IPv4地址 socket.gethostname() socket.gethostbyname(host_name) def print_machine_info(): host_ ...
- 用node是踩过的一些坑
1.http.request抓取数据时,response的“data”回调事件返回的数据不完整 问题原因:因为“data"事件返回是chunk,就是说是一块块连续的数据 解决的办法:在”da ...
- Mysql性能优化三:主从配置,读写分离
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- python基础训练营02
任务二 时长:2天 1. 列表 a. 标志 b. 基本操作(创建,append( ),pop( ) ,del( ), 拷贝) c. 列表相关方法 2. 元组 a. 标志 b. 基本操作(创建及不可变性 ...
- 配置cas可外网访问
把应用程序tomcat下的conf下的context.xml里配置内容修改 如把: D:\apache-tomcat-APP\conf\context.xml <Resource name=&q ...
- [leetcode-655-Print Binary Tree]
Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...
- linux学习(一)——学习之路
首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来.什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘, ...
- 并查集——poj1182(带权并查集高阶)
题目链接:食物链 题解:点击 说一声:这题关系推导值得学习.