답안 #937405

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
937405 2024-03-04T02:33:38 Z sleepntsheep Rigged Roads (NOI19_riggedroads) C
100 / 100
634 ms 82004 KB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#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);
}

int lo(int a,int b){return a<b?a:b;}

int t2[N<<2];
void u2(int l,int r,int k){
    for(l+=N,r+=N+1;l<r;l>>=1,r>>=1){
        if(l&1)t2[l]=lo(k,t2[l]),++l;
        if(r&1)--r,t2[r]=lo(t2[r],k);
    }
}
int q2(int p){
    int z=1e8;
    for(p+=N;p;p>>=1)z=lo(z,t2[p]);
    return z;
}

int n,m,h[N],e[N<<1][2],ne=1,y[N],P[19][N],dd[N],ch[N],ci[N],timer=0,w[N],ee[N],eee[N],sz[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){
    P[0][u]=p;
        for(int j=1;j<19;++j)P[j][u]=P[j-1][P[j-1][u]];
    sz[u]=1;
    for(int v,j=h[u];j;j=e[j][1])if((v=e[j][0])!=p&&y[j>>1]){
        dd[v]=dd[u]+1;
        ee[v]=j>>1;
        eee[j>>1]=v;
        dfs(v,u);
        sz[u]+=sz[v];
    }
}

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

int qq(int u,int v){
    if(dd[u]>dd[v])return qq(v,u);
    int dt=dd[v]-dd[u];
    for(int j=19;j--;)if(dt&(1<<j))v=P[j][v];
    if(u==v)return u;
    for(int j=19;j--;)if(P[j][u]^P[j][v])u=P[j][u],v=P[j][v];
    return P[0][u];
}

int anc(int u,int d)
{
    for(int j=19;j--;)if(dd[P[j][u]]>=d)u=P[j][u];
    return u;
}

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

int cup(int u,int a)
{
    int z=0;
    for(;ch[u]!=ch[a];u=P[0][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,int k)
{
    for(;ch[u]!=ch[a];u=P[0][ch[u]])
        upd(0,0,n,ci[ch[u]],ci[u],0),
        u2(ci[ch[u]],ci[u],k);
    upd(0,0,n,ci[a],ci[u],0);
    u2(ci[a],ci[u],k);
}

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

int main(){
    memset(lz,-1,sizeof lz);
    memset(t2,63,sizeof t2);

    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;
    dfs(1,1),hld(1,1);

    upd(0,0,n,0,n,1);
    upd(0,0,n,ci[1],ci[1],0);
    u2(0,n,1e8);

    for(int j=1;j<=m;++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),uk=anc(u,dd[lca]+1),vk=anc(v,dd[lca]+1);
            if(u-lca)ord+=cup(u,uk),sup(u,uk,j);
            if(v-lca)ord+=cup(v,vk),sup(v,vk,j);

            use[w[j]=ord++]=1;
        }else
            if(qry(0,0,n,ci[v],ci[v])){
                use[w[j]=ord++]=1;
                upd(0,0,n,ci[v],ci[v],0);
                u2(ci[v],ci[v],-1);
            }
    }

    for(int i=0;i<=m+1;++i)eh[i]=(int*)malloc(2*sizeof**eh);
    for(int j=1;j<=m;++j) if(!w[j]) append(q2(ci[eee[j]]),j);

    int ord2=1;
    for(int j=0;j<=m+1;++j){
        for(int i=0;i<eo[j];++i){
            while(use[ord2])++ord2;
            w[eh[j][i]]=ord2++;
        }
    }

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

Compilation message

riggedroads.c: In function 'main':
riggedroads.c:120:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |     scanf("%d%d",&n,&m);
      |     ^~~~~~~~~~~~~~~~~~~
riggedroads.c:121:30: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |     for(int u,v,i=1;i<=m;++i)scanf("%d%d",&u,&v),_l(u,v),_l(v,u);
      |                              ^~~~~~~~~~~~~~~~~~~
riggedroads.c:122:27: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |     for(int j,i=1;i<n;++i)scanf("%d",&j),y[j]=1;
      |                           ^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 43352 KB Output is correct
2 Correct 6 ms 43356 KB Output is correct
3 Correct 5 ms 43452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 43352 KB Output is correct
2 Correct 6 ms 43356 KB Output is correct
3 Correct 5 ms 43452 KB Output is correct
4 Correct 6 ms 43612 KB Output is correct
5 Correct 5 ms 43612 KB Output is correct
6 Correct 6 ms 43608 KB Output is correct
7 Correct 5 ms 43484 KB Output is correct
8 Correct 6 ms 43612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 51344 KB Output is correct
2 Correct 203 ms 59852 KB Output is correct
3 Correct 332 ms 62288 KB Output is correct
4 Correct 234 ms 67352 KB Output is correct
5 Correct 276 ms 68236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 211 ms 63832 KB Output is correct
2 Correct 192 ms 56464 KB Output is correct
3 Correct 95 ms 50000 KB Output is correct
4 Correct 143 ms 59728 KB Output is correct
5 Correct 39 ms 50260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 163 ms 76372 KB Output is correct
2 Correct 175 ms 82004 KB Output is correct
3 Correct 48 ms 54088 KB Output is correct
4 Correct 81 ms 60608 KB Output is correct
5 Correct 209 ms 81488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 167 ms 68488 KB Output is correct
2 Correct 117 ms 58660 KB Output is correct
3 Correct 398 ms 76968 KB Output is correct
4 Correct 325 ms 74168 KB Output is correct
5 Correct 29 ms 45136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 43352 KB Output is correct
2 Correct 6 ms 43356 KB Output is correct
3 Correct 5 ms 43452 KB Output is correct
4 Correct 6 ms 43612 KB Output is correct
5 Correct 5 ms 43612 KB Output is correct
6 Correct 6 ms 43608 KB Output is correct
7 Correct 5 ms 43484 KB Output is correct
8 Correct 6 ms 43612 KB Output is correct
9 Correct 86 ms 51344 KB Output is correct
10 Correct 203 ms 59852 KB Output is correct
11 Correct 332 ms 62288 KB Output is correct
12 Correct 234 ms 67352 KB Output is correct
13 Correct 276 ms 68236 KB Output is correct
14 Correct 211 ms 63832 KB Output is correct
15 Correct 192 ms 56464 KB Output is correct
16 Correct 95 ms 50000 KB Output is correct
17 Correct 143 ms 59728 KB Output is correct
18 Correct 39 ms 50260 KB Output is correct
19 Correct 163 ms 76372 KB Output is correct
20 Correct 175 ms 82004 KB Output is correct
21 Correct 48 ms 54088 KB Output is correct
22 Correct 81 ms 60608 KB Output is correct
23 Correct 209 ms 81488 KB Output is correct
24 Correct 167 ms 68488 KB Output is correct
25 Correct 117 ms 58660 KB Output is correct
26 Correct 398 ms 76968 KB Output is correct
27 Correct 325 ms 74168 KB Output is correct
28 Correct 29 ms 45136 KB Output is correct
29 Correct 634 ms 76624 KB Output is correct
30 Correct 532 ms 73636 KB Output is correct
31 Correct 484 ms 70080 KB Output is correct
32 Correct 476 ms 62292 KB Output is correct
33 Correct 345 ms 70480 KB Output is correct