• 【BZOJ2527】【POI2011】Meteors(整体二分)


    传送门

    很简单的整体二分
    对每个国家记录一下有哪些空间站
    注意极限数据一个国家收集到的数量可能会炸long longlong long
    中途判断是否已经满足breakbreak就可以了

    #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]<<'
    ';
    	}
    }
    
  • 相关阅读:
    php提示undefined index的几种解决方法
    划分树(poj2104)
    ACM-ICPC 2018 南京赛区网络预赛B
    AC Challenge(状压dp)
    UVALive5966(bfs)
    UVALive
    STL next_permutation 算法原理和实现
    凸包算法
    poj1873(枚举+凸包)
    CodeForces
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145631.html
Copyright © 2020-2023  润新知