对于单个国家,可以对答案进行二分,每次找出此时的陨石数量,如果大于需要的那么答案就在[l,mid],否则就在[mid+1,r]里面

而对于很多国家,也可以进行二分,solve(l,r,L,R)表示询问id[l...r]的答案都在[L,R]之间

每次用树状数组统计一下

Code

#include <cstdio>
#include <algorithm>
#define lowbit(x) ((x)&(-x))
#define N 300010
#define ll long long
using namespace std; struct edge{int to,nex;}e[N*2];
struct que{int x,y,z;}q[N];
const int Inf=1e9;
int n,m,k,tot,head[N],A[N],id[N],Ans[N],tmp,tmp2[N];
ll T[N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} inline void Link(int u,int v){
e[++tot].to=v;e[tot].nex=head[u];head[u]=tot;
} ll query(int x){
ll res=0;
for(;x;x-=lowbit(x)) res+=T[x];
return res;
} void add(int x,int v){
for(;x<=m;x+=lowbit(x)) T[x]+=v;
} void opera(int k,int f){
add(q[k].x,f*q[k].z),add(q[k].y+1,f*q[k].z*(-1));
if(q[k].x>q[k].y) add(1,f*q[k].z);
} bool mk[N];
inline void solve(int l,int r,int L,int R){
if(l>r) return;
if(L==R){
for(int i=l;i<=r;++i) Ans[id[i]]=L;
return;
}
int mid=(L+R)>>1;
for(;tmp<=mid;) opera(++tmp,1);
for(;tmp>mid;) opera(tmp--,-1);
int cnt=0,u;ll tot;
for(int i=l;i<=r;++i){
tot=0,u=id[i];
for(int j=head[u];j;j=e[j].nex){
int v=e[j].to;
tot+=query(v);
if(tot>=A[u]) break;
}
if(tot>=A[u]) mk[u]=1,cnt++;
else mk[u]=0;
}
int l1=l,l2=l+cnt;
for(int i=l;i<=r;++i)
if(mk[id[i]]) tmp2[l1++]=id[i];
else tmp2[l2++]=id[i];
for(int i=l;i<=r;++i) id[i]=tmp2[i];
solve(l,l1-1,L,mid);
solve(l1,l2-1,mid+1,R);
} int main(){
n=read(),m=read();
for(int i=1,x;i<=m;++i) x=read(),Link(x,i);
for(int i=1;i<=n;A[i++]=read());
k=read();
for(int i=1;i<=k;++i) q[i].x=read(),q[i].y=read(),q[i].z=read();
q[++k].x=1,q[k].y=m,q[k].z=Inf;
for(int i=1;i<=n;++i) id[i]=i;
solve(1,n,1,k);
for(int i=1;i<=n;++i) (Ans[i]<k)?printf("%d\n",Ans[i]):puts("NIE");
return 0;
}

[BZOJ2527] [Poi2011]Meteors(整体二分)的更多相关文章

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

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

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

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

  3. BZOJ2527: [Poi2011]Meteors(整体二分)

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

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

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

  5. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  6. [bzoj2527][Poi2011]Meteors_整体二分_树状数组

    Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...

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

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

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

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

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

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

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

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

随机推荐

  1. tween.js 插件

    1.是什么? jQueryTween是一款轻量级的jQuery补间动画工具库插件.使用jQueryTween可以制作出各种平滑的动画过渡效果.该插件基于tween.js,旨在简化各种补间动画操作,提供 ...

  2. eclipse中安装thymeleaf插件完成thymeleaf模板中自动代码提示功能

    插件地址:https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin 页面有介绍如何使用:

  3. 启动selenium server

    java -jar selenium-server-standalone-2.37.0.jar

  4. oracle的数值数据类型和兼容细分类型

    Oracle存储数值类型的数据不区分int .double .float 等类型,统一使用number(p,s)来存储. 基本类型为 NUMBER(P,S) P范围1到38 S 范围 -84 到 12 ...

  5. [topcoder]TheGridDivTwo

    http://community.topcoder.com/stat?c=problem_statement&pm=13628&rd=16278 标程是BFS,我用DFS,都可解. 这 ...

  6. 来自NVIDIA开源的pix2pixHD,将Image-to-Image Translation带到了另一个境界

    Kuo Ming Lin 分享了 Learning By Hacking 的动图 最近討論最火熱的project之一,來自NVIDIA開源的pix2pixHD,將Image-to-Image Tran ...

  7. php 调用微信虚拟支付

    摘要:小游戏对接微信虚拟支付,需要自己的后台调用微信的虚拟支付接口,微信的文档实在烂,总结走过的坑. 1.报错{errcode:90007,errmsg:invalid openid} 无效的open ...

  8. Vim中修改列模式的文字为ABCD或1234的递增序号

    vimrc里添加 vnoremap <F3> :<C-u>call <SID>AddCharOfCursor()<CR> "递增列模式下的字符 ...

  9. 基于LBS的多人聊天

  10. Entity Framework 6事务回滚

    使用EF6你有新的事务处理可以使用类似于: 复制代码 using (var context = new PostEntityContainer()) { using (var dbcxtransact ...