【BZOJ2527】【POI2011】Meteors(整体二分)
很简单的整体二分
对每个国家记录一下有哪些空间站
注意极限数据一个国家收集到的数量可能会炸
中途判断是否已经满足就可以了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
char ch=getchar();
int res=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
return res*f;
}
const int N=300005;
const ll inf=1e12;
struct ctry{
vector<int>son;
ll hop;int id;
}p[N],p1[N],p2[N];
struct rain{
int l,r;ll a;
}q[N];
int n,m,k,ans[N];
inline int lowbit(int x){
return x&(-x);
}
ll tr[N];
inline void modify(int p,ll k){
for(;p<=m;p+=lowbit(p))tr[p]+=k;
}
inline void update(int l,int r,ll k){
modify(l,k),modify(r+1,-k);
}
inline ll query(int p,ll res=0){
for(;p;p-=lowbit(p))res+=tr[p];return res;
}
void solve(int l,int r,int st,int des){
if(l==r){
for(int i=st;i<=des;i++)ans[p[i].id]=l;return;
}
int mid=(l+r)>>1,cnt1=0,cnt2=0;
for(int i=l;i<=mid;i++){
if(q[i].l<=q[i].r){
update(q[i].l,q[i].r,q[i].a);
}
else update(q[i].l,m,q[i].a),update(1,q[i].r,q[i].a);
}
for(int i=st;i<=des;i++){
ll res=0;
for(int j=0;j<p[i].son.size();j++){
res+=query(p[i].son[j]);
if(res>=p[i].hop)break;
}
if(res<p[i].hop)p[i].hop-=res,p2[++cnt2]=p[i];
else p1[++cnt1]=p[i];
}
for(int i=1;i<=cnt1;i++)p[st+i-1]=p1[i];
for(int i=1;i<=cnt2;i++)p[st+cnt1+i-1]=p2[i];
for(int i=l;i<=mid;i++){
if(q[i].l<=q[i].r){
update(q[i].l,q[i].r,-q[i].a);
}
else update(q[i].l,m,-q[i].a),update(1,q[i].r,-q[i].a);
}
solve(l,mid,st,st+cnt1-1),solve(mid+1,r,st+cnt1,des);
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
p[read()].son.push_back(i);
}
for(int i=1;i<=n;i++){
p[i].hop=read(),p[i].id=i;
}
k=read();
for(int i=1;i<=k;i++){
q[i].l=read(),q[i].r=read(),q[i].a=read();
}
q[++k].l=1,q[k].r=m,q[k].a=inf;
solve(1,k,1,n);
for(int i=1;i<=n;i++){
if(ans[i]==k)puts("NIE");
else cout<<ans[i]<<'\n';
}
}