整体二分——BZOJ2527/Luogu3527 [POI2011]MET-Meteors

原创 2017年05月02日 11:30:50

题面:洛谷3527 BZOJ2527
这题首先可以想到二分答案但是呢有很多点需要二分
同时每个点的二分状态都差不多
那么我们就一起二分(整体二分)
每次二分出答案以后对于每个国家计算有几颗流星
这个树状数组和线段树都可以维护(我用树状数组调了一个上午QAQ)
然后超过希望总数的点放到左边去,没有的放到右边去
然后分别继续二分
对然后统计答案即可

#include<bits/stdc++.h>
using namespace std;
typedef long long lll;
int n,m,k,nedge=0,p[300001],nex[300001],head[300001];
int v[300001],L[300001],R[300001],t[300001],ans[300001];
lll p1[300001],p2[300001],rp=0,f[300001];
bool jzq[300001];
inline int lowbit(int x){return(x&-x);}
inline void add(int x,lll s){for(;x<=m;x+=lowbit(x))f[x]+=s;}
inline lll sum(int x){lll ans=0;for(;x>0;x-=lowbit(x))ans+=f[x];return ans;}
inline void addedge(int a,int b){p[++nedge]=b;nex[nedge]=head[a];head[a]=nedge;}
void jia(int x,int v){
    int l=L[x],r=R[x],vv=v*t[x];
    if(r>=l)add(r+1,-vv),add(l,vv);
    else add(1,vv),add(r+1,-vv),add(l,vv);
}
void erfen(int l,int r,int ll,int rr){
    if(rr<ll)return;
    if(l==r){
        for(int i=ll;i<=rr;i++)ans[p1[i]]=l;
        return;
    }
    int mid=l+r>>1;
    while(rp<mid)jia(++rp,1);while(rp>mid)jia(rp--,-1);
    lll s;
    for(int i=ll;i<=rr;i++){
        p2[i]=p1[i];s=0;
        for(int k=head[p1[i]];k;k=nex[k]){
            s+=sum(p[k]);
            if(s>=v[p1[i]])break;
        }
        jzq[p1[i]]=(s>=v[p1[i]])?1:0;
    }
    s=ll-1;int ss=0;
    for(int i=ll;i<=rr;i++)if(jzq[p2[i]])p1[++s]=p2[i];
    for(int i=ll;i<=rr;i++)if(!jzq[p2[i]])p1[++ss+s]=p2[i];
    erfen(l,mid,ll,s);
    erfen(mid+1,r,s+1,rr);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x;scanf("%d",&x);
        addedge(x,i);
    }
    for(int i=1;i<=n;i++)scanf("%d",&v[i]);
    scanf("%d",&k);
    for(int i=1;i<=k;i++)scanf("%d%d%d",&L[i],&R[i],&t[i]);
    L[++k]=1;R[k]=m;t[k]=1e9;
    for(int i=1;i<=n;i++)p1[i]=i;
    erfen(1,k,1,n);
    for(int i=1;i<=n;i++)if(ans[i]!=k)printf("%d\n",ans[i]);
    else puts("NIE");
    return 0;
}
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/jzq233jzq

【BZOJ 2527】 [Poi2011]Meteors

整体二分~
  • Regina8023
  • Regina8023
  • 2015年05月12日 07:58
  • 1798

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

Byteotian Interstellar Union有N个成员国。现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站。 这个星球经常会下陨石...
  • mousemjq
  • mousemjq
  • 2017年03月16日 22:25
  • 268

【BZOJ2527】MET-Meteors(整体二分)

题面BZOJ权限题,良心洛谷链接题解其实我也不会做 看了zsy博客才会做。。。这题如果直接爆算做显然行不通 如果只有单次询问,我们就可以二分答案 但是询问太多。。 不会二分。。怎么办? 我们...
  • qq_30974369
  • qq_30974369
  • 2018年02月02日 20:32
  • 48

Luogu3527:[POI2011]MET-Meteors

题面 Luogu Sol 整体二分 比较简单,当练手题 每次树状数组统计 # include # define RG register # define IL inline # de...
  • oi_Konnyaku
  • oi_Konnyaku
  • 2018年02月06日 18:25
  • 42

【bzoj2527】Meteors【整体二分】

有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站,所有空间站按照顺序形成一个环,也就是说,m号空间站和1号空间站相邻。 现在,将会有k场流星雨降临,每一场流星雨都会给区间[...
  • ZMOIYNLP
  • ZMOIYNLP
  • 2015年05月12日 11:08
  • 1707

整体二分 【Poi2011】 Meteors bzoj2527

题目大意: 有n个国家。 一块环形区域被分成m块区域,每块区域被一个国家占有。 有k场流星雨,每场流星雨会为l到r区间内所有区域提供a个陨石。 第i个国家希望收集pi个陨石。 询问每一个国家...
  • Todobe
  • Todobe
  • 2017年01月15日 20:33
  • 163

洛谷P3527 [POI2011]MET-Meteors(BZOJ2527)

整体二分 洛谷题目传送门 BZOJ题目传送门 整体二分第一题 把所有国家一起进行二分,每次做1-mid的修改操作,把达成的放在左边,没有达成的放在右边,然后分治下去。 详见代码: #inc...
  • a1799342217
  • a1799342217
  • 2018年02月17日 16:50
  • 21

bzoj2527 [Poi2011]Meteors(整体二分+树状数组)

DescriptionByteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galax...
  • wu_tongtong
  • wu_tongtong
  • 2017年12月17日 21:18
  • 78

[BZOJ2527][Poi2011]Meteors(整体二分+bit)

题目描述传送门题解整体二分最少是哪个流星雨 每一次处理(l,mid)之间的修改然后再判断每一个询问是否满足 线段树的常数太大了…必须用bit才能过…代码#include #include #inc...
  • Clove_unique
  • Clove_unique
  • 2017年01月09日 21:59
  • 298

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

整体二分区间[l,r]为当前处理修改操作区间,即陨石雨的区间,[L,R]为询问操作区间,即每个国家,那么执行[l,r]区间的修改,对于[L,R]中的每个国家,用树状数组查询收集到的陨石,如果大于希望获...
  • Coldef
  • Coldef
  • 2017年02月17日 22:42
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:整体二分——BZOJ2527/Luogu3527 [POI2011]MET-Meteors
举报原因:
原因补充:

(最多只允许输入30个字)