답안 #937219

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
937219 2024-03-03T16:18:35 Z sleepntsheep Rigged Roads (NOI19_riggedroads) C++17
58 / 100
2000 ms 30800 KB
#include<stdio.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 ttt[N],n,m,h[N],e[N<<1][2],ne,y[N],id,pp[N],jj[N],ee[N],dd[N],w[N],tin[N],tout[N],timer=1;
void _l(int u,int v){e[++ne][0]=v,e[ne][1]=h[u],h[u]=ne;}

void __u(int*t,int p,int k){ for(;p<N;p+=p&-p)t[p]+=k; }
int __q(int*t,int p){int z=0;for(;p;p-=p&-p)z+=t[p];return z;}
int __s(int*t,int k){int p=0,v=0,j=1<<20;for(;j>>=1;)if(p+j<N&&v+t[p+j]<k)v+=t[p+=j];return p+1;}

void doedge(int v,int k){
    __u(ttt,tin[v],k);
    __u(ttt,tout[v]+1,-k);
}

void dfs(int u,int p){
    tin[u]=timer++;
    for(int v,j=h[u];j;j=e[j][1])if((v=e[j][0])!=p&&y[(j+1)/2]){
        dd[v]=dd[pp[v]=u]+1;
        ee[v]=(j+1)/2;
        pp[v]=u;
        jj[v]=(dd[p]-dd[jj[u]]==dd[jj[u]]-dd[jj[jj[u]]])?jj[jj[u]]:u;
        dfs(v,u);
        doedge(v,1);
    }
    tout[u]=timer-1;
}

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 nx(int u,int aa){
    int base=__q(ttt,tin[u]);
    while(dd[u]>dd[aa]&&__q(ttt,tin[pp[u]])==base){
        u=(dd[jj[u]]>dd[aa]&&__q(ttt,tin[jj[u]])==base)?jj[u]:pp[u];
    }
    return u;
}

int need[N],np;

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

int main(){
    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);

    int ord = 1;
    for(int j=1;j<=m;++j){
        int u=e[j*2-1][0],v=e[j*2][0];
        if(dd[v]+1==dd[u]){int t=u;u=v;v=t;}
        if(w[j])continue;
        if(!y[j]){
            int lca=qq(u,v);
            for(int ii=nx(u,lca);dd[ii]>dd[lca];ii=nx(ii,lca)) doedge(ii,-1),need[np++]=ii;
            for(int ii=nx(v,lca);dd[ii]>dd[lca];ii=nx(ii,lca)) doedge(ii,-1),need[np++]=ii;
            compar=c1;sort(need,0,np);
            for(int i=0;i<np;++i) w[ee[need[i]]]=ord++;
            np=0;
            w[j]=ord++;
        }else{
            w[j]=ord++;
            doedge(v,-1);
        }
    }
    for(int j=1;j<=m;++j)printf("%d ",w[j]);
}

Compilation message

riggedroads.cpp: In function 'int main()':
riggedroads.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |     scanf("%d%d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:59:35: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |     for(int u,v,i=1;i<=m;++i)scanf("%d%d",&u,&v),_l(u,v),_l(v,u);
      |                              ~~~~~^~~~~~~~~~~~~~
riggedroads.cpp:60:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |     for(int j,i=1;i<n;++i)scanf("%d",&j),y[j]=1;
      |                           ~~~~~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 8536 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Correct 1 ms 8540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 8536 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Correct 1 ms 8540 KB Output is correct
4 Correct 2 ms 8540 KB Output is correct
5 Correct 2 ms 8540 KB Output is correct
6 Correct 2 ms 8540 KB Output is correct
7 Correct 2 ms 8676 KB Output is correct
8 Correct 2 ms 8536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 13404 KB Output is correct
2 Correct 72 ms 15092 KB Output is correct
3 Correct 83 ms 16992 KB Output is correct
4 Correct 102 ms 18108 KB Output is correct
5 Correct 113 ms 18512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2102 ms 20016 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 107 ms 25968 KB Output is correct
2 Correct 130 ms 30800 KB Output is correct
3 Correct 34 ms 16720 KB Output is correct
4 Correct 45 ms 19024 KB Output is correct
5 Correct 135 ms 29268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 96 ms 22864 KB Output is correct
2 Correct 54 ms 19536 KB Output is correct
3 Correct 142 ms 25848 KB Output is correct
4 Correct 135 ms 23952 KB Output is correct
5 Correct 12 ms 9564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 8536 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Correct 1 ms 8540 KB Output is correct
4 Correct 2 ms 8540 KB Output is correct
5 Correct 2 ms 8540 KB Output is correct
6 Correct 2 ms 8540 KB Output is correct
7 Correct 2 ms 8676 KB Output is correct
8 Correct 2 ms 8536 KB Output is correct
9 Correct 37 ms 13404 KB Output is correct
10 Correct 72 ms 15092 KB Output is correct
11 Correct 83 ms 16992 KB Output is correct
12 Correct 102 ms 18108 KB Output is correct
13 Correct 113 ms 18512 KB Output is correct
14 Execution timed out 2102 ms 20016 KB Time limit exceeded
15 Halted 0 ms 0 KB -