Submission #937280

# Submission time Handle Problem Language Result Execution time Memory
937280 2024-03-03T18:11:33 Z sleepntsheep Rigged Roads (NOI19_riggedroads) C++17
18 / 100
2000 ms 78656 KB
#include<stdio.h>
#include<set>
#include<string.h>
int hi(int a,int b){return a>b?a:b;}
unsigned X=12345;int rand_(){return(X*=3)>>1;}
int(*compar)(int,int);void sort(int*aa,int l,int r){ while(l<r){ int i=l,j=l,k=r,t,p=aa[l+rand_()%(r-l)]; while(j<k)switch(compar(aa[j],p)){case 0:++j;break;case -1:t=aa[i],aa[i]=aa[j],aa[j]=t,++i,++j;break;case 1:t=aa[--k],aa[k]=aa[j],aa[j]=t;break;}sort(aa,l,i);l=k; }}

#define N 300005
int t[N<<2], lz[N<<2];
void push(int v, int l, int r)
{
    if (~lz[v])
    {
        if (l != r) lz[2*v+1] = lz[2*v+2] = lz[v];
        t[v] = lz[v]*(r-l+1);
        lz[v] = -1;
    }
}

void upd(int v, int l, int r, int x, int y, int k)
{
    push(v, l, r);
    if (r < x||y<l)return;
    if(x<=l&&r<=y){lz[v]=k;push(v,l,r);return;}
    upd(2*v+1, l,(l+r)/2,x,y,k),upd(2*v+2,(l+r)/2+1,r,x,y,k);
    t[v]=t[2*v+1]+t[2*v+2];
}

int qry(int v,int l,int r,int x,int y)
{
    push(v,l,r);
    if(r<x||y<l)return 0;
    if (x<=l&&r<=y)return t[v];
    return qry(2*v+1,l,(l+r)/2,x,y)+qry(2*v+2, (l+r)/2+1, r, x,y);
}

//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,tune=native")

int n,m,h[N],e[N<<1][2],ne=1,y[N],id,pp[N],jj[N],dd[N],ch[N],ci[N],timer=0,w[N],ee[N],eee[N],sz[N],hv[N];
void _l(int u,int v){e[++ne][0]=v,e[ne][1]=h[u],h[u]=ne;}

void dfs(int u,int p){
    sz[u]=1;
    hv[u]=0;
    for(int v,j=h[u];j;j=e[j][1])if((v=e[j][0])!=p&&y[j>>1]){
        dd[v]=dd[pp[v]=u]+1;
        ee[v]=j>>1;
        eee[j>>1]=v;
        pp[v]=u;
        jj[v]=(dd[p]-dd[jj[u]]==dd[jj[u]]-dd[jj[jj[u]]])?jj[jj[u]]:u;
        dfs(v,u);
        sz[u]+=sz[v];
        if(sz[v]>sz[hv[u]])hv[u]=v;
    }
}

void hld(int u,int hh)
{
    ci[u]=timer++;ch[u]=hh;
    if(hv[u])hld(hv[u],hh);
    for(int v,j=h[u];j;j=e[j][1])if((v=e[j][0])!=pp[u]&&y[j>>1]&&v-hv[u]) hld(v,v);
}


int anc(int u,int d){
    while(dd[u]>d) u=(dd[jj[u]]>=d)?jj[u]:pp[u];
    return u;
}

int qq(int u,int v){
    if(dd[u]>dd[v])return qq(v,u);
    while(dd[v]>dd[u])
        if(dd[jj[v]]>=dd[u]) v=jj[v];
        else v=pp[v];
    while(u-v)
        if(jj[v]-jj[u])u=jj[u],v=jj[v];
        else u=pp[u],v=pp[v];
    return u;
}

int need[N],np,ord=1;

int c1(int i,int j){return i<j?-1:i>j?1:0;}

int cup(int u,int a)
{
    int z=0;
    for(;ch[u]!=ch[a];u=pp[ch[u]])
        z+=qry(0,0,n,ci[ch[u]],ci[u]);
    z+=qry(0,0,n,ci[a],ci[u]);
    return z;
}

void sup(int u,int a)
{
    for(;ch[u]!=ch[a];u=pp[ch[u]])
        upd(0,0,n,ci[ch[u]],ci[u],0);
    upd(0,0,n,ci[a],ci[u],0);
}

#include<stdlib.h>
int *eh[N+N],eo[N];
void append(int i,int j){
    int o=eo[i]++;
    if(o>=2&&(o&(o-1))==0)eh[i]=(int*)realloc(eh[i],o*2*sizeof**eh);
    eh[i][o]=j;
}

#include<string>

std::multiset<int>mp;

int ww[N],wo,at[N];
int c2(int i,int j){
    if(at[i]-at[j])return at[i]<at[j]?-1:1;
    return i<j?-1:i>j?1:0;
}

void dfs2(int u,int p)
{
    for(int v,j=h[u];j;j=e[j][1])if((v=e[j][0])!=p&&y[j>>1]){
        dfs2(v,u);
    }
    for(int x,j=0;j<eo[u];++j){
        x=eh[u][j];
        if(x>0) mp.insert(x);
    }
    for(int x,j=0;j<eo[u];++j){
        x=eh[u][j];
        if(x<0)mp.erase(x);
    }
    if(!w[ee[u]]&&ee[u])
    {
        at[ee[u]]=*mp.begin();
        ww[wo++]=ee[u];
    }
}

static int use[N];

int main(){
    memset(lz,-1,sizeof lz);
    for(int i=0;i<N+N;++i)eh[i]=(int*)malloc(2*sizeof**eh);
    scanf("%d%d",&n,&m);
    for(int u,v,i=1;i<=m;++i)scanf("%d%d",&u,&v),_l(u,v),_l(v,u);
    for(int j,i=1;i<n;++i)scanf("%d",&j),y[j]=1;
    pp[1]=jj[1]=1;dfs(1,1);hld(1,1);
    upd(0,0,n,0,n,1);
    upd(0,0,n,ci[1],ci[1],0);

    for(int j=1;j<=m;++j)if(!w[j]){
        int u=e[j*2][0],v=e[j*2+1][0];
        if(dd[v]+1==dd[u]){int t=u;u=v;v=t;}
        if(!y[j]){
            int lca=qq(u,v);
            int left=cup(u,anc(u,dd[lca]+1))+ cup(v,anc(v,dd[lca]+1));
            ord+=left;
            sup(u,anc(u,dd[lca]+1)); sup(v,anc(v,dd[lca]+1));
            append(u,j);
            append(v,j);
            append(lca,-j);
            w[j]=ord++;
            upd(0,0,n,ci[eee[j]],ci[eee[j]],0);
        }else {
            if(qry(0,0,n,ci[eee[j]],ci[eee[j]])){
                w[j]=ord++;
                upd(0,0,n,ci[eee[j]],ci[eee[j]],0);
            }
        }
    }

    for(int i=1;i<=m;++i)use[w[i]]=1;
    dfs2(1,1);
    compar=c2;sort(ww,0,wo);
    int ord2=1;
    for(int j=0;j<wo;++j){
        while(use[ord2])++ord2;
        w[ww[j]]=ord2++;
    }

    for(int j=1;j<=m;++j)printf("%d ",w[j]);
}

Compilation message

riggedroads.cpp: In function 'int main()':
riggedroads.cpp:145:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  145 |     scanf("%d%d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:146:35: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  146 |     for(int u,v,i=1;i<=m;++i)scanf("%d%d",&u,&v),_l(u,v),_l(v,u);
      |                              ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:147:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  147 |     for(int j,i=1;i<n;++i)scanf("%d",&j),y[j]=1;
      |                           ~~~~~^~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 25 ms 47960 KB Output is correct
2 Correct 19 ms 47832 KB Output is correct
3 Correct 18 ms 47964 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 47960 KB Output is correct
2 Correct 19 ms 47832 KB Output is correct
3 Correct 18 ms 47964 KB Output is correct
4 Incorrect 19 ms 47964 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 96 ms 56100 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2041 ms 61196 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 176 ms 73040 KB Output is correct
2 Correct 191 ms 78656 KB Output is correct
3 Correct 62 ms 57008 KB Output is correct
4 Correct 96 ms 62348 KB Output is correct
5 Correct 220 ms 76624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 165 ms 69204 KB Output is correct
2 Incorrect 117 ms 63140 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 47960 KB Output is correct
2 Correct 19 ms 47832 KB Output is correct
3 Correct 18 ms 47964 KB Output is correct
4 Incorrect 19 ms 47964 KB Output isn't correct
5 Halted 0 ms 0 KB -