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

这个询问显然是可以二分的,但每次都二分就会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. Working with large data sets in MySQL

    What does working with large data sets in mySQL teach you ? Of course you have to learn a lot about ...

  2. 转:nginx入门指南,快速搭建静态文件服务器和代理服务器

    本文介绍 Nginx 入门基础知识,让你迅速搭建 Nginx 服务器.主要内容包括 Nginx 安装和简单使用.Nginx的简单原理.Nginx 配置文件的结构.如何使用 Nginx 来提供静态文件服 ...

  3. php连接mysql报错——Fatal error: Call to undefined function mysql_connect() in

    练习php连接mysql数据库 代码:mysql_connect("127.0.0.1:3306","root", ..... 浏览器报错:Fatal erro ...

  4. 【poj1226-出现或反转后出现在每个串的最长公共子串】后缀数组

    题意:求n个串的最长公共子串,子串出现在一个串中可以是它的反转串出现.总长<=10^4. 题解: 对于每个串,把反转串也连进去.二分长度,分组,判断每个组. #include<cstdio ...

  5. 【洛谷 P4342】[IOI1998]Polygon(DP)

    题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...

  6. bzoj 1044 贪心二分+DP

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1044 首先对于第一问,我们可以轻易的用二分答案来搞定,对于每一个二分到的mid值 我们从l ...

  7. 人脸识别 - 环境搭建(Ubuntu 16.04)

    安装人脸识别开源库(face_recognition) pip3 install face_recognition 注意:pip3 尝试编译 dlib 依赖时很可能会报错,参考:https://www ...

  8. jquery——通过name属性查找元素

      Js代码 : $("div[id]") 选择所有含有id属性的div元素 $("input[name='newsletter']") 选择所有的name属性 ...

  9. python3,判断,循环练习1

    1.使用while循环输出1 2 3 4 5 6 8 9 10 i = 1 while i <= 10: if i == 7: i += 1 print(end=' ') continue pr ...

  10. 这个命令可以看到你的cpu到底集合

      cat /proc/cpuinfo  |grep processor|awk '{print $3}'|wc -l    改变虚拟机分辨率  xrandr -s 1024x768 -r 60  或 ...