Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colonisation due to strange meteor showers, which on the other hand make it an exceptionally interesting object of study.

The member states of BIU have already placed space stations close to the planet's orbit. The stations' goal is to take samples of the rocks flying by. The BIU Commission has partitioned the orbit into  sectors, numbered from  to , where the sectors  and  are adjacent. In each sector there is a single space station, belonging to one of the  member states.

Each state has declared a number of meteor samples it intends to gather before the mission ends. Your task is to determine, for each state, when it can stop taking samples, based on the meter shower predictions for the years to come.

Input

The first line of the standard input gives two integers,  and  (), separated by a single space, that denote, respectively, the number of BIU member states and the number of sectors the orbit has been partitioned into.

In the second line there are  integers  (), separated by single spaces, that denote the states owning stations in successive sectors.

In the third line there are  integers  (), separated by single spaces, that denote the numbers of meteor samples that the successive states intend to gather.

In the fourth line there is a single integer  () that denotes the number of meteor showers predictions. The following  lines specify the (predicted) meteor showers chronologically. The -th of these lines holds three integers , ,  (separated by single spaces), which denote that a meteor shower is expected in sectors  (if ) or sectors  (if ), which should provide each station in those sectors with  meteor samples ().

Output

Your program should print  lines on the standard output. The -th of them should contain a single integer , denoting the number of shower after which the stations belonging to the -th state are expected to gather at least  samples, or the word NIE (Polish for no) if that state is not expected to gather enough samples in the foreseeable future.

Example

For the input data:

3 5
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2

the correct result is:

3
NIE
1

题意:

n个国家,m个收集站,每个收集站分别归属于某个国家,一共又k颗流星,问每个国家再第几颗流星经过可以搜集够自己需要的流星need[i]。

先谈谈自己的感受。

普通二分过程([L,R]+一个询问X):二分[L,mid]或者二分[mid+1,R]。最后L==R时得到了一个询问的答案X。

整体二分过程([L,R]+一群询问X):部分询问(集合A)需要二分[L,mid](假设叫左二分),一些询问(集合B)需要二分[mid+1,R](右二分)。这个时候把属于左二分是一起左二分,属于有二分的一起右二分。 当L==R时得到了当前集合的答案,其中集合X=集合A+集合B。

对于整体效率的分析:

假设二分solve(X,L,R)表示集合X的答案在[L,R]间(L,R是由上一层二分判定缩小的范围,初始L=1,R=m,X为1到n的集合)。

按照上面整体二分的过程,solve(X,L,R)继续分解为solve(A,L,mid)和solve(B,mid+1,R)两部分;前面一部分是mid的时候,A集合满足条件need[],答案范围缩小为[L,mid];同理,B集合不满足条件need[],答案范围缩小到[mid+1,R]。

所以,若最开始的集合X=(1,2,3,...n)最后分解为了g个集合(1<=g<=m,m为操作数量,此题的流星数量),

每一个二分复杂度为O(qlgn),q为一个常数,大小取决于题目,总的效率为O(g*qlgn)<O(m*qlgn)。如果最后集合g,q不会太大,整体二分就行得通。而g取决于数据,q取决于算法。

综上,大概知道什么是整体二分了。具体针对这道题:

(抄袭的代码,From victorywonder,现在主要是学习思想,首先的化,多做几个题再整理)。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double D;
typedef pair<int,int> pr;
const int infi=;
const int N=;
const int M=;
struct node{int x,y,z;}p[N];
int n,m,k,c[N],id[N],ans[N];
int g[N],to[N],nxt[N],tot;
int tol[N],tor[N];
ll h[N],tmp[N],cur[N];
void add(int pos,int x) {while (pos<=m) h[pos]+=x,pos+=(pos&-pos);}
void adddt(int x,int y,int z) {add(x,z); add(y+,-z);}
ll sum(int pos) {ll t=; while (pos>) t+=h[pos],pos-=(pos&-pos);return t;}
void addop(int x,int y,int z,int i) {p[i].x=x; p[i].y=y; p[i].z=z;}//第i颗流星
void addpt(int x,int y) {to[++tot]=y; nxt[tot]=g[x]; g[x]=tot;}//第x个国家,拥有的收集站。
void solve(int head,int tail,int l,int r) { //id [head到tail]的队列答案在[l,r]中
if (head>tail) return;
int i,k,x,mid=(l+r)>>,lnum=,rnum=;
if(l==r) {
for (i=head;i<=tail;i++) ans[id[i]]=l;
return;
}
for(i=l;i<=mid;i++) {//试探左半截。
if (p[i].x<=p[i].y) adddt(p[i].x,p[i].y,p[i].z);//加入树状数组
else adddt(p[i].x,m,p[i].z),adddt(,p[i].y,p[i].z);//由于是个环。
}
for(i=head;i<=tail;i++) {
tmp[id[i]]=;
for (k=g[id[i]];k;k=nxt[k]) {//第id[i]个国家的每一个站。
tmp[id[i]]+=sum(to[k]);
if (tmp[id[i]]+cur[id[i]]>c[id[i]]) break;
}
if (cur[id[i]]+tmp[id[i]]>=c[id[i]]) tol[++lnum]=id[i];
else tor[++rnum]=id[i],cur[id[i]]+=tmp[id[i]];
}
for (i=l;i<=mid;i++) {//减回去。效果就是memset(h,0,sizeof(h)),但是memset太浪费了;
if (p[i].x<=p[i].y) adddt(p[i].x,p[i].y,-p[i].z);
else adddt(p[i].x,m,-p[i].z),adddt(,p[i].y,-p[i].z);
}
for (i=;i<lnum;i++) id[head+i]=tol[i+];
for (i=;i<rnum;i++) id[head+lnum+i]=tor[i+];
solve(head,head+lnum-,l,mid);
solve(head+lnum,tail,mid+,r);
}
int main() {
int i,x,y,z;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++) {
scanf("%d",&x);
addpt(x,i);
}
for (i=;i<=n;i++) {
scanf("%d",&c[i]);
id[i]=i;
}
scanf("%d",&k);
for (i=;i<=k;i++) {
scanf("%d%d%d",&x,&y,&z);
addop(x,y,z,i);
}
addop(,m,infi,++k);
solve(,n,,k);
for (i=;i<=n;i++) if (ans[i]!=k) printf("%d\n",ans[i]);
else puts("NIE");
return ;
}

[Poi2011] Meteors(从不知所措到整体二分)的更多相关文章

  1. 2527: [Poi2011]Meteors[整体二分]

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1528  Solved: 556 [Submit][S ...

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

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

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

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

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

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

  5. bzoj 2527: [Poi2011]Meteors 整体二分

    给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...

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

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

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

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

  8. Luogu3527 POI2011 Meteors 整体二分、树状数组、差分

    传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...

  9. BZOJ 2527 [Poi2011]Meteors(整体二分)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2527 [题目大意] 有N个成员国.现在它发现了一颗新的星球, 这颗星球的轨道被分为M份 ...

随机推荐

  1. python中@property的使用

    在绑定属性时,如果我们将属性直接暴露在外面,就可能导致属性被任意修改,有时候这个是我们不希望看到的如:设置学生的成绩 class Student(object): def __init__(self) ...

  2. Spring学习十三----------Spring AOP的基本概念

    © 版权声明:本文为博主原创文章,转载请注明出处 什么是AOP -面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 -主要的功能是:日志记录.性能统计.安全控制.事务处理. ...

  3. 浏览器前缀-----[译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序

    Autoprefixer解析CSS文件并且添加浏览器前缀到CSS规则里,使用Can I Use的数据来决定哪些前缀是需要的.   所有你需要做的就是把它添加到你的资源构建工具(例如 Grunt)并且可 ...

  4. Chrome + Python 抓取动态网页内容

    用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字.如下所示: import urllib2 url="http: ...

  5. 渐变背景(background)效果

    chrom and Safari浏览器: webkit核心的浏览器.使用CSS3渐变方法(css-gradient) -webkit-gradient(type, start_point, end_p ...

  6. Rider

    听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider   本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只 ...

  7. 奇妙的go语言(開始篇)

    [ 声明:版权全部.欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 从前接触脚本语言不多,可是自从遇到go之后,就開始慢慢喜欢上了这个脚本语言.go语言是goog ...

  8. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  9. EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:通过接口获取实时信息

    对于动态网站,要实时更新网站的信息,通过接口来获取实时信息是一个必不可少的部分.EasyNVR可以接入IPC等前端设备,必须要实时获取到对应的IPC实时信息进行展示. 本篇主要说明Ajax来获取数据. ...

  10. Louvain Modularity Fast unfolding of communities in large networks

    Louvain Modularity Fast unfolding of communities in large networks https://arxiv.org/pdf/0803.0476.p ...