提交记录 32332


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_260814 2002. 【NOIP2018】旅行(加强版) Accepted 100 122.463 ms 33600 KB C++ 4.08 KB
提交时间 评测时间
2026-08-14 10:42:03 2026-08-14 10:43:50
// NOIP2018 旅行 加强版 (duck.ac 2002) - optimized
#include <sys/auxv.h>
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#ifdef LOCAL
#include <stdio.h>
#endif
struct DuckInfo { uint64_t abi_version; const char *stdin_ptr; uint64_t stdin_size; char *stdout_ptr; uint64_t stdout_limit; uint64_t stdout_size; char *stderr_ptr; uint64_t stderr_limit; uint64_t stderr_size; const char *IB_ptr; uint64_t IB_limit; char *OB_ptr; uint64_t OB_limit; uint64_t tsc_frequency; } __attribute__((packed));

static const char *inp;
static char *outp;
static char *sbase;
#ifdef LOCAL
static char ibuf[1<<22]; static char obuf[1<<22];
#endif

static inline int rd(){int x=0;char c=*inp++;while(c<'0')c=*inp++;while(c>='0'){x=x*10+(c-'0');c=*inp++;}return x;}
static inline void put_int(int x,char sep){char tmp[8];int i=0;do{tmp[i++]=(char)('0'+x%10);x/=10;}while(x);while(i)*outp++=tmp[--i];*outp++=sep;}

int main(){
#ifdef LOCAL
  size_t _n=fread(ibuf,1,sizeof(ibuf),stdin); inp=ibuf; outp=obuf; sbase=obuf; (void)_n;
#else
  struct DuckInfo *di=(struct DuckInfo*)getauxval(0x6b637564);
  inp=di->stdin_ptr; outp=di->stdout_ptr; sbase=di->stdout_ptr;
#endif
  int n=rd(), m=rd();
  if(n==1){ put_int(1,'\n');
#ifdef LOCAL
    fwrite(obuf,1,(size_t)(outp-obuf),stdout); return 0;
#else
    di->stdout_size=(uint64_t)(outp-sbase); __asm__ volatile("syscall" : : "a"(60),"D"(0) : "rcx","r11","memory");
#endif
  }
  int em=2*m;
  int *eu=(int*)malloc((size_t)em*sizeof(int));
  int *ev=(int*)malloc((size_t)em*sizeof(int));
  int *etu=(int*)malloc((size_t)em*sizeof(int));
  int *etv=(int*)malloc((size_t)em*sizeof(int));
  int *cnt=(int*)malloc((size_t)(n+2)*sizeof(int));
  int *deg=(int*)malloc((size_t)(n+1)*sizeof(int));
  int *start=(int*)malloc((size_t)(n+2)*sizeof(int));
  int *deg2=(int*)malloc((size_t)(n+1)*sizeof(int));
  unsigned char *oncycle=(unsigned char*)malloc((size_t)(n+1));
  unsigned char *vis=(unsigned char*)malloc((size_t)(n+1));
  int *queue=(int*)malloc((size_t)(n+1)*sizeof(int));
  int *sx=(int*)malloc((size_t)(n+1)*sizeof(int));
  int *si=(int*)malloc((size_t)(n+1)*sizeof(int));
  int *sn=(int*)malloc((size_t)(n+1)*sizeof(int));

  memset(deg,0,(size_t)(n+1)*sizeof(int));
  for(int i=0;i<m;i++){int u=rd(),v=rd();eu[2*i]=u;ev[2*i]=v;eu[2*i+1]=v;ev[2*i+1]=u;deg[u]++;deg[v]++;}

  memset(cnt,0,(size_t)(n+2)*sizeof(int));
  for(int i=0;i<em;i++)cnt[ev[i]]++;
  for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];
  for(int i=em-1;i>=0;i--){int c=--cnt[ev[i]];etu[c]=eu[i];etv[c]=ev[i];}
  memset(cnt,0,(size_t)(n+2)*sizeof(int));
  for(int i=0;i<em;i++)cnt[etu[i]]++;
  for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];
  for(int i=em-1;i>=0;i--){int c=--cnt[etu[i]];eu[c]=etu[i];ev[c]=etv[i];}

  start[1]=0;
  for(int i=1;i<=n;i++)start[i+1]=start[i]+deg[i];

  // degree peeling
  memcpy(deg2,deg,(size_t)(n+1)*sizeof(int));
  memset(oncycle,1,(size_t)(n+1));
  int qh=0,qt=0;
  for(int i=1;i<=n;i++)if(deg2[i]<=1)queue[qt++]=i;
  while(qh<qt){int u=queue[qh++];if(!oncycle[u])continue;oncycle[u]=0;
    int s=start[u],e=start[u+1];
    for(int k=s;k<e;k++){int v=ev[k];if(oncycle[v]){if(--deg2[v]==1)queue[qt++]=v;}}}

  // greedy DFS
  memset(vis,0,(size_t)(n+1));
  vis[1]=1; put_int(1,' ');
  int top=0; sx[top]=1; si[top]=start[1]; sn[top]=0x7fffffff; top++;
  int turned=0;
  while(top>0){
    int x=sx[top-1], idx=si[top-1], now=sn[top-1];
    int e=start[x+1];
    while(idx<e && vis[ev[idx]]) idx++;
    if(idx>=e){top--;continue;}
    int tt=ev[idx];
    if(oncycle[x]){
      int j=idx+1; while(j<e&&vis[ev[j]])j++;
      int has_next=(j<e);
      if(!turned && oncycle[tt] && !has_next && now<tt){turned=1;top--;continue;}
      vis[tt]=1; put_int(tt,' ');
      si[top-1]=j;
      int child_now=has_next?ev[j]:now;
      sx[top]=tt; si[top]=start[tt]; sn[top]=child_now; top++;
    } else {
      vis[tt]=1; put_int(tt,' ');
      si[top-1]=idx+1;
      sx[top]=tt; si[top]=start[tt]; sn[top]=now; top++;
    }
  }

  outp[-1]='\n';
#ifdef LOCAL
  fwrite(obuf,1,(size_t)(outp-obuf),stdout); return 0;
#else
  di->stdout_size=(uint64_t)(outp-sbase);
  __asm__ volatile("syscall" : : "a"(60),"D"(0) : "rcx","r11","memory");
  return 0;
#endif
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #19.58 us16 KBAcceptedScore: 5

Testcase #28.12 us16 KBAcceptedScore: 5

Testcase #314.65 us20 KBAcceptedScore: 5

Testcase #413.77 us20 KBAcceptedScore: 5

Testcase #5340.13 us344 KBAcceptedScore: 5

Testcase #6336.3 us344 KBAcceptedScore: 5

Testcase #712.211 ms6 MB + 300 KBAcceptedScore: 5

Testcase #812.169 ms6 MB + 92 KBAcceptedScore: 5

Testcase #9120.524 ms31 MB + 860 KBAcceptedScore: 5

Testcase #10121.86 ms32 MB + 376 KBAcceptedScore: 5

Testcase #11120.574 ms30 MB + 852 KBAcceptedScore: 5

Testcase #12122.463 ms31 MB + 412 KBAcceptedScore: 5

Testcase #13335.69 us340 KBAcceptedScore: 5

Testcase #14307.35 us348 KBAcceptedScore: 5

Testcase #1510.348 ms6 MB + 188 KBAcceptedScore: 5

Testcase #1610.143 ms6 MB + 272 KBAcceptedScore: 5

Testcase #1796.258 ms32 MB + 832 KBAcceptedScore: 5

Testcase #1896.246 ms32 MB + 832 KBAcceptedScore: 5

Testcase #19102.608 ms30 MB + 1020 KBAcceptedScore: 5

Testcase #2099.722 ms32 MB + 16 KBAcceptedScore: 5


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-11 23:12:31 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠