整体二分挺好玩的...学一发

这个询问显然是可以二分的,但每次都二分就会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的更多相关文章

  1. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  2. 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)

    [bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  3. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  4. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  5. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

  6. 【BZOJ2527】【POI2011】Meteors [整体二分]

    Meteors Time Limit: 60 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...

  7. BZOJ2527[Poi2011]Meteors——整体二分+树状数组

    题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...

  8. bzoj千题计划149:bzoj2527: [Poi2011]Meteors

    http://www.lydsy.com/JudgeOnline/problem.php?id=2527 整体二分 区间加,单点查,树状数组维护差分序列 注意 累积可能会爆long long,所以一满 ...

  9. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

随机推荐

  1. taotao用户登录springMVC拦截器的实现

    在springMVC中写拦截器,只需要两步: 一.写 java 拦截器类,实现 interceptor 拦截器接口. 二.在 springMVC 的xml配置文件中,配置我们创建的拦截器对象及其拦截目 ...

  2. POJ2492:A Bug's Life(种类并查集)

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 45757   Accepted: 14757 题 ...

  3. 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 ...

  4. AWS nat monitor and route switch script

    This script will monitor another NAT instance and take over its routes if communication with the oth ...

  5. 问题总结——window平台下grunt\bower安装后无法运行的问题

    一.问题: 安装grunt或者bower后,在cmd控制台运行grunt -version 或者 bower -v会出现:“xxx不是内部或外部命令,也不是可运行的程序或批处理文件”,

  6. 【数据结构】bzoj1455罗马游戏

    Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...

  7. 51nod 1076 2条不相交的路径

    给出一个无向图G的顶点V和边E.进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径.(两条路径不经过相同的边)   (注,无向图中不存在重边,也就是说确定起点和终点 ...

  8. Python小程序之购物车

    需求: 用户入口: 1.商品信息放在文件中,从文件中读取 2.已购商品,余额记录,第一要输入起始金额,以后不需要二次输入 商家入口: 2.可以添加商品,修改商品价格 # Author:Lee Siri ...

  9. linux基础之nginx和nfs服务

      第一部分: 一.nginx服务安装nginx包(源码安装)1.先cd /etc/yum.repos.d目录下2.yum install epel-release -y(安装扩展包)3.yum in ...

  10. linux中的阻塞机制及等待队列【转】

    转自:http://www.cnblogs.com/gdk-0078/p/5172941.html 阻塞与非阻塞是设备访问的两种方式.驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知 ...