[BZOJ2527]Meteors
整体二分挺好玩的...学一发
这个询问显然是可以二分的,但每次都二分就会T爆,所以我们有了“整体”二分
每次处理一些询问,要求这些询问的答案一定在$[l,r]$中
先把$l$到$mid$的操作实施,那么当前TAK的询问答案一定在$[l,mid]$中,当前NIE的询问答案一定在$[mid+1,r]$中,对答案为$[mid+1,r]$的那些询问加上$[l,mid]$的修改所产生的影响后分治处理即可
开始时加上一个操作$(1,m,+\infty)$就可以处理NIE的情况了
直接用线段树会被卡常,因为是区间加,单点询问,所以差分后用树状数组做即可
#include<stdio.h>
#include<vector>
using namespace std;
typedef long long ll;
const int inf=1000000000;
struct rain{
int l,r,d;
rain(int a=0,int b=0,int c=0){l=a;r=b;d=c;}
}R[300010];
vector<int>s[300010];
vector<int>::iterator it;
int p[300010],q[300010],ans[300010],ql[300010],qr[300010],n,m;
ll d[300010],las[300010];
int lowbit(int x){return x&-x;}
void add(int x,int v){
while(x<=m){
d[x]+=v;
x+=lowbit(x);
}
}
void add(int l,int r,int v){
add(l,v);
add(r+1,-v);
}
ll query(int x){
ll s=0;
while(x){
s+=d[x];
x-=lowbit(x);
}
return s;
}
void solve(int h,int t,int l,int r){
if(h>t)return;
int i,mid,cl,cr;
ll tmp;
if(l==r){
for(i=h;i<=t;i++)ans[q[i]]=l;
return;
}
mid=(l+r)>>1;
for(i=l;i<=mid;i++){
if(R[i].l<=R[i].r)
add(R[i].l,R[i].r,R[i].d);
else{
add(R[i].l,m,R[i].d);
add(1,R[i].r,R[i].d);
}
}
cl=cr=0;
for(i=h;i<=t;i++){
tmp=0;
for(it=s[q[i]].begin();it!=s[q[i]].end();it++){
tmp+=query(*it);
if(tmp+las[q[i]]>=p[q[i]])break;
}
if(tmp+las[q[i]]>=p[q[i]])
ql[++cl]=q[i];
else{
las[q[i]]+=tmp;
qr[++cr]=q[i];
}
}
for(i=1;i<=cl;i++)q[h+i-1]=ql[i];
for(i=1;i<=cr;i++)q[h+cl+i-1]=qr[i];
for(i=l;i<=mid;i++){
if(R[i].l<=R[i].r)
add(R[i].l,R[i].r,-R[i].d);
else{
add(R[i].l,m,-R[i].d);
add(1,R[i].r,-R[i].d);
}
}
solve(h,h+cl-1,l,mid);
solve(h+cl,t,mid+1,r);
}
int main(){
int i,x,k;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d",&x);
s[x].push_back(i);
}
for(i=1;i<=n;i++)scanf("%d",p+i);
scanf("%d",&k);
for(i=1;i<=k;i++)scanf("%d%d%d",&R[i].l,&R[i].r,&R[i].d);
R[++k]=rain(1,m,inf);
for(i=1;i<=n;i++)q[i]=i;
solve(1,n,1,k);
for(i=1;i<=n;i++){
if(ans[i]==k)
puts("NIE");
else
printf("%d\n",ans[i]);
}
}
[BZOJ2527]Meteors的更多相关文章
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- 【BZOJ2527】【POI2011】Meteors [整体二分]
Meteors Time Limit: 60 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- bzoj千题计划149:bzoj2527: [Poi2011]Meteors
http://www.lydsy.com/JudgeOnline/problem.php?id=2527 整体二分 区间加,单点查,树状数组维护差分序列 注意 累积可能会爆long long,所以一满 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
随机推荐
- taotao用户登录springMVC拦截器的实现
在springMVC中写拦截器,只需要两步: 一.写 java 拦截器类,实现 interceptor 拦截器接口. 二.在 springMVC 的xml配置文件中,配置我们创建的拦截器对象及其拦截目 ...
- POJ2492:A Bug's Life(种类并查集)
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 45757 Accepted: 14757 题 ...
- Out of memory due to hash maps used in map-side aggregation解决办法
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4): -----Task ID: task_201411191723_723592 ...
- AWS nat monitor and route switch script
This script will monitor another NAT instance and take over its routes if communication with the oth ...
- 问题总结——window平台下grunt\bower安装后无法运行的问题
一.问题: 安装grunt或者bower后,在cmd控制台运行grunt -version 或者 bower -v会出现:“xxx不是内部或外部命令,也不是可运行的程序或批处理文件”,
- 【数据结构】bzoj1455罗马游戏
Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...
- 51nod 1076 2条不相交的路径
给出一个无向图G的顶点V和边E.进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径.(两条路径不经过相同的边) (注,无向图中不存在重边,也就是说确定起点和终点 ...
- Python小程序之购物车
需求: 用户入口: 1.商品信息放在文件中,从文件中读取 2.已购商品,余额记录,第一要输入起始金额,以后不需要二次输入 商家入口: 2.可以添加商品,修改商品价格 # Author:Lee Siri ...
- linux基础之nginx和nfs服务
第一部分: 一.nginx服务安装nginx包(源码安装)1.先cd /etc/yum.repos.d目录下2.yum install epel-release -y(安装扩展包)3.yum in ...
- linux中的阻塞机制及等待队列【转】
转自:http://www.cnblogs.com/gdk-0078/p/5172941.html 阻塞与非阻塞是设备访问的两种方式.驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知 ...