[BZOJ2527] [Poi2011]Meteors(整体二分)
对于单个国家,可以对答案进行二分,每次找出此时的陨石数量,如果大于需要的那么答案就在[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(整体二分)的更多相关文章
- BZOJ2527 [Poi2011]Meteors 整体二分 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...
- BZOJ2527[Poi2011]Meteors——整体二分+树状数组
题目描述 Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The ...
- BZOJ2527: [Poi2011]Meteors(整体二分)
Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- [bzoj2527][Poi2011]Meteors_整体二分_树状数组
Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 2527: [Poi2011]Meteors[整体二分]
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1528 Solved: 556 [Submit][S ...
- bzoj 2527: [Poi2011]Meteors 整体二分
给每个国家建一个链表,这样分治过程中的复杂度就和序列长度线形相关了,无脑套整体二分就可以. (最坑的地方是如果所有位置都是一个国家,那么它的样本个数会爆longlong!!被这个坑了一次,大于p[i] ...
- Luogu3527 POI2011 Meteors 整体二分、树状数组、差分
传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...
随机推荐
- (七)JavaScript之[调试]与[前端表单验证]
12].调试为什么要去调试?1.在编写JavaScript时,如果没有调试工具将是一件很痛苦的事情.2.没有调试工具是很难去编写JavaScript程序的.3.编写的代码可能包含语法错误.逻辑错误,如 ...
- iDempiere 使用指南 采购入库流程
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- ansible使用1-安装&配置
参考文档 http://docs.ansible.com https://github.com/leucos/ansible-tuto 控制机安装 ansible控制机通过ssh控制远程主机,远程主机 ...
- Spark master节点HA配置
Spark master节点HA配置 1.介绍 Spark HA配置需要借助于Zookeeper实现,因此需要先搭建ZooKeeper集群. 2.配置 2.1 修改所有节点的spark-evn.sh文 ...
- java核心-流基础
1.流的概念: 1.1输入流:向内存中写入数据 1.2输出流:有内存向指定的地方输出数据 2.
- 模仿ArcGIS用Graphics重绘的直方图分级调节器
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 虚拟内存映射 段分割 vm_area_struct
http://www.cnblogs.com/huxiao-tee/p/4660352.html linux内核使用vm_area_struct结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内 ...
- 7 MSSQL数据库备份与恢复
0 MSSQL数据库备份 1 SQLAgent配置 2 设置连接属性 3 输入SA账号密码 4 SQL备份脚本配置 5 生成SQL全量备份脚本 6 生成SQL差异备份脚本 7 修改SQL差异备份脚本 ...
- win10 下的python虚拟环境安装使用(使用powershell)
安装virtualenv 若要使用python虚拟环境进行开发,首先需要安装virtualenv.命令:pip install virtualenv 我已经装过了
- ZooKeeper 完全分布式集群环境搭建
1. 搭建前准备 示例共三台主机,主机IP映射信息如下: 192.168.32.101 s1 192.168.32.102 s2 192.168.32.103 s3 2.下载ZooKeeper, 以 ...