BZOJ.2527.[POI2011]MET-Meteors(整体二分)
每个国家的答案可以二分+求前缀和,于是可以想到整体二分。
在每次Solve()中要更新所有国家得到的值,不同位置的空间站对应不同国家比较麻烦。
注意到每次Solve()其国家数是与区间大小相关的,so根据国家处理,区间更新空间站的值,用vector枚举对应空间站得到每个国家的值。(or边表)
//20048kb	11292ms
//1316ms	24.8MB
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#define lb(x) (x&-x)
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=3e5+5,INF=1e9;
int n,m,K,A[N],Ans[N],q[N],q1[N],q2[N];
std::vector<int> v[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read();
struct Operation
{
	int l,r,v;
	inline void Input(){
		l=read(),r=read(),v=read();
	}
}op[N];
inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
namespace T//区间修改 单点查询
{
	int n;
	LL t[N];
	inline void Modify(int p,int v){
		while(p<=n) t[p]+=v, p+=lb(p);
	}
	inline void Modify_Range(int l,int r,int v)
	{
		Modify(l,v), Modify(r+1,-v);
		if(l>r) Modify(1,v);//Modify(n+1,-v)
	}
	inline void Clear(int p)
	{
		for(; p<=n; p+=lb(p))
			if(t[p]) t[p]=0; else break;
	}
	inline void Clear_Range(int l,int r)
	{
		Clear(l), Clear(r+1);//不能少啊
		if(l>r) Clear(1);
	}
	inline LL Query(int p)
	{
		LL res=0; while(p) res+=t[p], p^=lb(p);
		return res;
	}
}
void Solve(int l,int r,int h,int t)
{
	if(h>t) return;
	if(l==r){
		for(int i=h; i<=t; ++i) Ans[q[i]]=l;
		return;
	}
	int mid=l+r>>1, t1=0, t2=0;
	for(int i=l; i<=mid; ++i) T::Modify_Range(op[i].l,op[i].r,op[i].v);
	for(int i=h,now=q[i]; i<=t; now=q[++i])//now:may be q[n+1]
	{
		LL tmp=0;
		for(int j=0,lim=v[now].size(); j<lim; ++j)
			if((tmp+=T::Query(v[now][j]))>=A[now]) break;//tmp可能爆longlong。。不过也是个剪枝。
		if(tmp>=A[now]) q1[t1++]=now;
		else A[now]-=tmp, q2[t2++]=now;
	}
	for(int i=l; i<=mid; ++i) T::Clear_Range(op[i].l,op[i].r);//T::Modify_Range(op[i].l,op[i].r,-op[i].v);
	//T::Clear(op[i].l), T::Clear(op[i].r);//T::Clear(std::min(op[i].l,op[i].r));//因为有l>r的情况,所以要清空的位置比较麻烦。。这一行的两种都是错的。(而且应是r+1)
	for(int i=0; i<t1; ++i) q[h+i]=q1[i];
	for(int i=0; i<t2; ++i) q[h+t1+i]=q2[i];
	Solve(l,mid,h,h+t1-1), Solve(mid+1,r,h+t1,t);
}
int main()
{
	n=read(),T::n=m=read();
	for(int i=1; i<=m; ++i) v[read()].push_back(i);
	for(int i=1; i<=n; ++i) A[i]=read(), q[i]=i;
	K=read();
	for(int i=1; i<=K; ++i) op[i].Input();
	op[++K]=(Operation){m+1,m+1,0};
	Solve(1,K,1,n);
	for(int i=1; i<=n; ++i) Ans[i]==K?puts("NIE"):printf("%d\n",Ans[i]);
	return 0;
}
												
											BZOJ.2527.[POI2011]MET-Meteors(整体二分)的更多相关文章
- 【BZOJ2527】【POI2011】Meteors [整体二分]
		
Meteors Time Limit: 60 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这个星球经常会下陨石雨.BI ...
 - BZOJ 2527 [Poi2011]Meteors(整体二分)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...
 - BZOJ 2527 [Poi2011]Meteors:整体二分
		
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527 题意: 有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站, ...
 - bzoj 2527: [Poi2011]Meteors 整体二分
		
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
 - bzoj 2527 Meteors - 整体二分 - 树状数组
		
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
 - 2527: [Poi2011]Meteors[整体二分]
		
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
 - BZOJ 2527 Meteors | 整体二分
		
BZOJ 2527 Meteors 题意 一个圆环上有m个位置,编号为1~m,分别属于n个国家. 有k个时刻,每个时刻都会给圆环上的一个区间中每个位置的值加上一个数. 每个国家有一个目标,问对于每个国 ...
 - BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
		
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
 - 【BZOJ2527】[Poi2011]Meteors 整体二分
		
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
 
随机推荐
- Python time()方法
			
from:http://www.runoob.com/python/att-time-time.html 描述 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数 ...
 - ispoweroftwo 判断2的次幂
			
首先结果是: public bool IsPowerOfTwo(int n) { if(n<1) return false;//2的次幂一定大于0 return ((n & (n -1) ...
 - C# 所生成项目的处理器架构“MSIL”与引用“Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。
			
这个问题一般都是Oracle.DataAccess的版本不兼容问题造成的. 解决办法: 1.把Oracle.DataAccess.dll文件拿到C盘或D盘的安装文件的地方进行搜索. 2.会出现在pro ...
 - django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
			
url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...
 - 170406回顾-SQL Server的smalldatetime类型比较
			
在比较SQL Server的类型为smalldatetime字段时出现下面的错误:将 expression 转换为数据类型 smalldatetime 时出现算术溢出错误 正确的比较方法如下:将lon ...
 - java基础67 JavaScript通过关系找节点、添加附件(网页知识)
			
1.通过关系找节点(父子关系,兄弟关系) 1.1.常用方法 parentNode:获取当前元素的父节点. childNodes:获取当前元素的所有下一级子元素 firstChild:获取当 ...
 - WiFi无线连接真机进行Appium自动化测试方法
			
有时需要测试APP 产品的耗电问题,但用自动化又面临了一个USB接电脑供电的问题,从而导致计算出来的功耗与手动跑,存在有很大的误差,因此可使用wifi无线连接到手机进行自动化测试,解决功耗问题. 前提 ...
 - SQL Server和Access数据读写
			
1.查询Access中数据的方法: select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:/db2.mdb','select ...
 - 如何用python解析mysqldump文件
			
一.前言 最近在做离线数据导入HBase项目,涉及将存储在Mysql中的历史数据通过bulkload的方式导入HBase.由于源数据已经不在DB中,而是以文件形式存储在机器磁盘,此文件是mysqldu ...
 - HTML5元素1
			
文档和元数据元素 元素 说明 类型 HTML5与其他的变化 base 设置相对URL的基础 元数据 无变化 body 表示HTML文档的内容 无 有变化 DOCTYPE 表示HTML文档的开始 无 有 ...