AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

Posted Only U - IU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC日记——「SCOI2015」国旗计划 LiBreOJ 2007相关的知识,希望对你有一定的参考价值。

#2007. 「SCOI2015」国旗计划

 

思路:

  跪烂Claris

 

代码:

#include <cstdio>
#include <algorithm>
#define maxn 800010
int n,m,ai[maxn][2],bi[maxn],f[maxn<<1],st[maxn];
int g[maxn],nxt[maxn<<1],q[maxn<<1],t,ans[maxn],L,x,y,i;
inline void in(int&a)
{
    char c;
    while(!(((c=getchar())>=\'0\')&&(c<=\'9\')));
    a=c-\'0\';while(((c=getchar())>=\'0\')&&(c<=\'9\'))(a*=10)+=c-\'0\';
}
inline int lower(int x)
{
    int l=1,r=m,mid,t;
    while(l<=r) if(bi[mid=(l+r)>>1]<=x) l=(t=mid)+1;else r=mid-1;
    return t;
}
inline void up(int &x,int y)
{
    if(x<y) x=y;
}
void dfs(int x)
{
    q[++t]=x;
    if(x<=m)
        for(int i=L;;i++)
            if(q[t-i]>=x+m)
            {
                ans[x]=i;
                break;
            }
    for(int i=g[x];i;i=nxt[i]) dfs(i);
    t--;
}
int main()
{
    freopen("data.txt","r",stdin);
    in(n),in(m);
    for(m=0,i=1;i<=n;i++) in(ai[i][0]),in(ai[i][1]),bi[++m]=ai[i][0],bi[++m]=ai[i][1];
    for(std::sort(bi+1,bi+m+1),i=1;i<=n;i++)
    {
        st[i]=x=lower(ai[i][0]),y=lower(ai[i][1]);
        if(x<y) up(f[x],y),up(f[x+m],y+m);
        else up(f[1],y),up(f[x],y+m),up(f[x+m],m+m);
    }
    for(i=1;i<=m+m;i++) up(f[i],f[i-1]);
    for(i=1;i<m+m;i++) nxt[i]=g[f[i]],g[f[i]]=i;
    for(L=-1,i=1;i<=m;i=f[i])L++;
    dfs(m+m);
    for(i=1;i<=n;i++) printf("%d ",ans[st[i]]);
    return 0;
}

 

以上是关于AC日记——「SCOI2015」国旗计划 LiBreOJ 2007的主要内容,如果未能解决你的问题,请参考以下文章

LibreOJ #2007. 「SCOI2015」国旗计划

bzoj4444[Scoi2015]国旗计划

BZOJ4444[Scoi2015]国旗计划 双指针+倍增

[SCOI2015]国旗计划

[luogu] P4155 [SCOI2015]国旗计划(贪心)

BZOJ 4444: [Scoi2015]国旗计划