• 2019-2020 ACM-ICPC, Asia Xuzhou Regional Contest


    A - Cat

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <unordered_map>
    #include <vector>
    #include <map>
    #include <list>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <set>
    #pragma GCC optimize(3 , "Ofast" , "inline")
    using namespace std ;
    #define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
    #define x first
    #define y second
    typedef long long ll ;
    const double esp = 1e-6 , pi = acos(-1) ;
    typedef pair<int , int> PII ;
    const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
    ll in()
    {
      ll x = 0 , f = 1 ;
      char ch = getchar() ;
      while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
      while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
      return x * f ;
    }
    void work()
    {
      ll l = in() , r = in() , s = in() ;
      if(r - l + 1 <= 4) {
        ll ans = -1 ;
        for(ll i = l ;i <= r ;i ++ )
         {
           ll res = 0 ;
           for(ll j = i ;j <= r ;j ++ ) {
              res ^= j ;
              if(res <= s) ans = max(ans , j - i + 1) ;
           }
         }
         cout << ans << endl ;
         return ;
      }
      if(l % 2) {
        ll rr ;
        for(ll i = r; i ;i --)
         {
           if((i - l) % 4 == 0)
            {
              rr = i ;
              break ;
            }
         }
      //   cout << rr << endl ;
         ll ans = rr - l ;
         if(l <= s) {
           ans ++ ;
         }
    
         ll res = 0 ;
         for(ll i = rr + 1 ; i <= r ;i ++ ) {
           res ^= i ;
           if(res <= s) {
             ans = max(ans , i - l) ;
           }
           if((res ^ l) <= s) {
             ans = max(ans , i - l + 1) ;
           }
        //   cout << i << " " << res << " " << (res ^ l) << " " << ans << endl ;
         }
         cout << ans << endl ;
      }
      else {
        for(ll i = r ; ;i --) {
          if((i - l + 1) % 4 == 0)  {
    
            ll ans = i - l + 1 ;
            ll res = 0 ;
            for(ll j = i + 1; j <= r ;j ++ ) {
              res ^= j ;
              if(res <= s)
               ans = max(ans , j - l + 1) ;
            }
            cout << ans << endl ;
            return ;
          }
    
        }
      }
      return ;
    }
    int main()
    {
      int t = in() ;
      while(t --) work() ;
      return 0 ;
    }
    /*
    */
    

    C - ❤️ numbers

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <unordered_map>
    #include <vector>
    #include <map>
    #include <list>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <set>
    #pragma GCC optimize(3 , "Ofast" , "inline")
    using namespace std ;
    #define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
    #define x first
    #define y second
    typedef long long ll ;
    const double esp = 1e-6 , pi = acos(-1) ;
    typedef pair<int , int> PII ;
    const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
    ll in()
    {
      ll x = 0 , f = 1 ;
      char ch = getchar() ;
      while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
      while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
      return x * f ;
    }
    int prime[N] , vis[N] ;
    void work()
    {
      int l = in() , r = in() ;
      if(r - l + 1 >= 10000) puts("Yes") ;
      else {
        int tot = 0 ;
        for(int i = 2; i < N ;i ++ ) {
          if(!vis[i]) prime[++ tot] = i ;
          for(int j = 1; j <= tot && prime[j] * i < N ;j ++ ) {
            vis[i * prime[j]] = 1 ;
            if(i % prime[j] == 0) break ;
          }
        }
        int ans = 0 ;
        for(int i = l ;i <= r;i ++ ) {
          if(i < N && !vis[i]) ans ++ ;
          else if(i >= N) {
            int f = 1;
            for(int j = 1; j <= tot ;j ++ ) {
              if(i % prime[j] == 0) {
                f = 0 ;
                break ;
              }
            }
            if(f) ans ++ ;
          }
        }
        if(ans * 3 < r - l + 1) puts("Yes") ;
        else puts("No") ;
      }
      return ;
    }
    int main()
    {
      int n = in() ;
      while(n --) work() ;
      return 0 ;
    }
    /*
    */
    

    E - Multiply

    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    const int S=20;
    using namespace std;
    
    typedef long long ll;
    #define maxn 1000000
    
    ll factor[maxn];
    int tot;
    
    ll muti_mod(ll a,ll b,ll c){    //返回(a*b) mod c,a,b,c<2^63
        a%=c;
        b%=c;
        ll ret=0;
        while (b){
            if (b&1){
                ret+=a;
                if (ret>=c) ret-=c;
            }
            a<<=1;
            if (a>=c) a-=c;
            b>>=1;
        }
        return ret;
    }
    
    ll pow_mod(ll x,ll n,ll mod){  //返回x^n mod c ,非递归版
        if (n==1) return x%mod;
        int bit[64],k=0;
        while (n){
            bit[k++]=n&1;
            n>>=1;
        }
        ll ret=1;
        for (k=k-1;k>=0;k--){
            ret=muti_mod(ret,ret,mod);
            if (bit[k]==1) ret=muti_mod(ret,x,mod);
        }
        return ret;
    }
    
    bool check(ll a,ll n,ll x,ll t){   //以a为基,n-1=x*2^t,检验n是不是合数
        ll ret=pow_mod(a,x,n),last=ret;
        for (int i=1;i<=t;i++){
            ret=muti_mod(ret,ret,n);
            if (ret==1 && last!=1 && last!=n-1) return 1;
            last=ret;
        }
        if (ret!=1) return 1;
        return 0;
    }
    
    bool Miller_Rabin(ll n){
        ll x=n-1,t=0;
        while ((x&1)==0) x>>=1,t++;
        bool flag=1;
        if (t>=1 && (x&1)==1){
            for (int k=0;k<S;k++){
                ll a=rand()%(n-1)+1;
                if (check(a,n,x,t)) {flag=1;break;}
                flag=0;
            }
        }
        if (!flag || n==2) return 0;
        return 1;
    }
    
    ll gcd(ll a,ll b){
        if (a==0) return 1;
        if (a<0) return gcd(-a,b);
        while (b){
            ll t=a%b; a=b; b=t;
        }
        return a;
    }
    
    ll Pollard_rho(ll x,ll c){
        ll i=1,x0=rand()%x,y=x0,k=2;
        while (1){
            i++;
            x0=(muti_mod(x0,x0,x)+c)%x;
            ll d=gcd(y-x0,x);
            if (d!=1 && d!=x){
                return d;
            }
            if (y==x0) return x;
            if (i==k){
                y=x0;
                k+=k;
            }
        }
    }
    
    void findfac(ll n){           //递归进行质因数分解N
        if (!Miller_Rabin(n)){
            factor[tot++] = n;
            return;
        }
        ll p=n;
        while (p>=n) p=Pollard_rho(p,rand() % (n-1) +1);
        findfac(p);
        findfac(n/p);
    }
    int idx = 0 ;
    struct node
    {
    	ll val , num ;
    	node() {}
    	node(ll val , ll num) : val(val) , num(num) {} 
    	bool operator<(const node &a) const 
    	{
    		val < a.val ;
    	}
    }fac[maxn];
    ll b[maxn] ;
    bool solve(ll n)
    {
    	if (!Miller_Rabin(n)) 
    	 {
    	 	fac[++ idx] = {n , 1} ;
    	 }
    	else{
                tot = 0;
                findfac(n);
                sort(factor , factor + tot) ;
                idx = 0 ;
                for(int i = 0 ; i < tot ;i ++)
                 {
                 	if(factor[i] != fac[idx].val) 
                 	 fac[++ idx] = {factor[i] , 1};
                 	else 
                 	 fac[idx].num ++ ;
    			 }
            }
    }
    ll get(ll n , ll p)
    {
    	ll res = 0 ;
    	while(n)
    	{
    		res += n / p ;
    		n /= p ;
    	}
    	return res ;
    }
    int main(){
        srand(time(NULL));
        int t;
        scanf("%d",&t);
        while (t--){
            ll n , x , y ;
            scanf("%lld%lld%lld",&n , &x , &y);
            idx = 0 ;
    		solve(x) ;
    		for(int j = 1; j <= idx ;j ++) b[j] = 0 ;
            for(int i = 1; i <= n ;i ++)
             {
             	ll p ;
             	scanf("%lld" , &p) ;
             	for(int j = 1 ;j <= idx ;j ++)
             	 	b[j] += get(p , fac[j].val)  ;
    		 }
    		ll minx = 0 ;
    		for(int j = 1; j <= idx ;j ++)
    		  b[j] = get(y , fac[j].val) - b[j] , minx = max(minx , b[j]);
    		for(int j = 1; j <= idx ;j ++)
    		 	if(b[j] > 0)
    		 	 	minx = min(minx , b[j] / fac[j].num) ; 
    		printf("%lld
    " , minx) ;
        }
    }
    

    F - The Answer to the Ultimate Question of Life, The Universe, and Everything.

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <unordered_map>
    #include <vector>
    #include <map>
    #include <list>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <set>
    #pragma GCC optimize(3 , "Ofast" , "inline")
    using namespace std ;
    #define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
    #define x first
    #define y second
    typedef long long ll ;
    const double esp = 1e-6 , pi = acos(-1) ;
    typedef pair<int , int> PII ;
    const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
    ll in()
    {
      ll x = 0 , f = 1 ;
      char ch = getchar() ;
      while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
      while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
      return x * f ;
    }
    int a[210][3] = {
      -5000 , 0 , 5000,
      -5000 , 1 , 5000,
      -4373 , -486 , 4375,
      -5 , 4 , 4,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -637 , -205 , 644,
      -169 , 44 , 168,
      -5000 , 2 , 5000,
      -216 , -52 , 217,
      -650 , -353 , 683,
      -695 , -641 , 843,
      -11 , 7 , 10,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -265 , -262 , 332,
      -4114 , -588 , 4118,
      -3331 , 2195 , 2977,
      -1373 , -1276 , 1671,
      -95 , 47 , 91,
      -2816 , -741 , 2833,
      -401 , -287 , 445,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -10 , 8 , 8,
      -2683 , 1839 , 2357,
      -2107 , 237 , 2106,
      -5000 , 3 , 5000,
      -2268 , -249 , 2269,
      -233 , -69 , 235,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -1555 , -244 , 1557,
      -1120 , -509 , 1154,
      -3223 , 2358 , 2731,
      -444 , -84 , 445,
      -27 , 16 , 25,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -823 , -307 , 837,
      -7 , -5 , 8,
      -2369 , 1709 , 2025,
      -758 , -473 , 815,
      -141 , 49 , 139,
      -3950 , -1247 , 3991,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -796 , 602 , 659,
      1061109567 , 1061109567 , 1061109567 ,
      -2370 , 1518 , 2141,
      -3885 , -648 , 3891,
      -3329 , 1837 , 3131,
      -672 , 505 , 559,
      -998 , 361 , 982,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -1201 , -163 , 1202,
      -966 , 668 , 845,
      -2744 , -1561 , 2903,
      -161 , 102 , 146,
      -5000 , 4 , 5000,
      -929 , 403 , 903,
      1 , 1 , 4,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -403 , 134 , 398,
      -2359 , 824 , 2325,
      -533 , 401 , 443,
      -432 , -104 , 434,
      -335 , -146 , 344,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -2080 , -829 , 2123,
      -706 , -196 , 711,
      -1300 , -706 , 1366,
      -2368 , -1719 , 2638,
      -1317 , 847 , 1188,
      -3707 , 1315 , 3651,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -4126 , -1972 , 4271,
      -1390 , -1282 , 1686,
      -2514 , 1953 , 2036,
      -1803 , 365 , 1798,
      -3389 , -2912 , 3992,
      -4052 , 861 , 4039,
      -248 , -98 , 253,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -22 , 14 , 20,
      -3168 , -991 , 3200,
      -2101 , -1638 , 2391,
      -893 , -622 , 984,
      -1797 , -903 , 1870,
      -2327 , 319 , 2325,
      -239 , 118 , 229,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -7 , -4 , 8,
      -2689 , -1165 , 2760,
      -1309 , 947 , 1117,
      -1165 , -948 , 1345,
      -2948 , 853 , 2924,
      1061109567 , 1061109567 , 1061109567 ,
      -4793 , -2312 , 4966,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -12 , 8 , 11,
      -1906 , -757 , 1945,
      -896 , -555 , 962,
      -4328 , 383 , 4327,
      -3677 , -1673 , 3789,
      -2804 , 1219 , 2725,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -37 , -16 , 38,
      -1 , 0 , 5,
      -5000 , 5 , 5000,
      -2212 , -419 , 2217,
      -4034 , -3881 , 4988,
      -3989 , -726 , 3997,
      -1580 , -1238 , 1801,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -1 , 2 , 5,
      -399 , 167 , 389,
      -3013 , -1766 , 3203,
      -1351 , -629 , 1395,
      -1116 , 816 , 946,
      -758 , -428 , 801,
      -86 , -77 , 103,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -139 , 104 , 116,
      -7 , -3 , 8,
      1061109567 , 1061109567 , 1061109567 ,
      -2746 , -2552 , 3342,
      -8 , -7 , 10,
      -327 , -263 , 376,
      -2366 , 1528 , 2131,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
      -367 , 260 , 317,
      -463 , 215 , 447,
      -805 , 486 , 741,
      -3736 , -695 , 3744,
      -2135 , -516 , 2145,
      -3693 , -1049 , 3721,
      1061109567 , 1061109567 , 1061109567 ,
      1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -1534 , 383 , 1526,
    -3874 , -1654 , 3972,
    -4767 , -2476 , 4980,
    -4125 , -1417 , 4180,
    -3423 , -2943 , 4033,
    -66 , -59 , 79,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -802 , -574 , 890,
    -1354 , -1012 , 1521,
    -3834 , -2149 , 4047,
    -1328 , 891 , 1178,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -335 , -170 , 349,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -1168 , -160 , 1169,
    -13 , -10 , 15,
    -2839 , 1503 , 2691,
    1061109567 , 1061109567 , 1061109567 ,
    -4874 , 974 , 4861,
    -90 , -29 , 91,
    -4889 , 976 , 4876,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -4 , 5 , 5,
    -1885 , -1092 , 2000,
    -1639 , 318 , 1635,
    -1702 , -1403 , 1974,
    -4812 , -593 , 4815,
    -377 , -215 , 399,
    -20 , 16 , 16,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    1061109567 , 1061109567 , 1061109567 ,
    -1057 , -579 , 1112,
    -2867 , -1606 , 3026,
    -3752 , -1347 , 3809,
    -2208 , 508 , 2199,
    -2318 , -638 , 2334,
    };
    int main()
    {
      int t = in() ;
      while(t --)
       {
         int x = in() ;
         if(a[x][0] != INF) cout << a[x][0] << " " << a[x][1] << " " << a[x][2] << endl ;
         else puts("impossible") ;
       }
      return 0 ;
    }
    /*
    */
    

    H - Yuuki and a problem

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <unordered_map>
    #include <vector>
    #include <map>
    #include <list>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <set>
    #pragma GCC optimize(3 , "Ofast" , "inline")
    using namespace std ;
    #define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
    #define x first
    #define y second
    typedef long long ll ;
    const double esp = 1e-6 , pi = acos(-1) ;
    typedef pair<int , int> PII ;
    const int N = 2e5 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
    ll in()
    {
      ll x = 0 , f = 1 ;
      char ch = getchar() ;
      while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
      while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
      return x * f ;
    }
    int n , m = 2e5, q , a[N] , L[30][30] , R[30][30] , cl , cr ;
    int lowbit(int x){return x & -x ;}
    struct Seg{
      struct node{
        int ls , rs ;
        ll sum ;
        void init() {ls = rs = sum = 0 ;}
      }t[N * 100] ;
      int rt[N] , tot ;
      ll res ;
      int newnode(){
        ++ tot ;
        t[tot].init() ;
        return tot ;
      }
      void init() {memset(rt , 0 , sizeof rt) ; tot = 0 ;}
      void update(int &rt , int l , int r , int pos , int v) {
        if(!rt) rt = newnode() ;
        t[rt].sum += v ;
        if(l == r) return ;
        int mid = l + r >> 1 ;
        if(pos <= mid) update(t[rt].ls , l , mid , pos , v) ;
        else update(t[rt].rs , mid + 1 , r , pos , v) ;
      }
      void update(int x , int pos , int v){
        while(x <= n)
          update(rt[x] , 1 , m , pos , v) , x += lowbit(x) ;
      }
      void query(int dep , int l , int r , int ql , int qr){
        if(ql > qr) return ;
        if(ql <= l && r <= qr) {
          for(int i = 1; i <= cl ;i ++ ) res -= t[L[dep][i]].sum ;
          for(int i = 1; i <= cr ;i ++ ) res += t[R[dep][i]].sum ;
          return ;
        }
        int mid = l + r >> 1 ;
        if(ql <= mid) {
          for(int i = 1; i <= cl ;i ++ ) L[dep + 1][i] = t[L[dep][i]].ls ;
          for(int i = 1; i <= cr ;i ++ ) R[dep + 1][i] = t[R[dep][i]].ls ;
          query(dep + 1 , l , mid , ql , qr) ;
        }
        if(qr > mid) {
          for(int i = 1; i <= cl ;i ++ ) L[dep + 1][i] = t[L[dep][i]].rs ;
          for(int i = 1; i <= cr ;i ++ ) R[dep + 1][i] = t[R[dep][i]].rs ;
          query(dep + 1 , mid + 1 , r , ql , qr) ;
        }
      }
    }seg;
    int main()
    {
      while(scanf("%d%d" , &n ,&q) != EOF) {
        for(int i = 1;i <= n ;i ++ ) scanf("%d" , &a[i]) ;
        seg.init() ;
        for(int i = 1; i <= n ;i ++ )
         seg.update(i , a[i] , a[i]) ;
        int op , x , y ;
        while(q --) {
          scanf("%d%d%d" , &op , &x , &y) ;
          if(op == 1) {
            seg.update(x , a[x] , -a[x]) ;
            a[x] = y ;
            seg.update(x , a[x] , a[x]) ;
          }else {
            x -- ;
            cl = 0 , cr = 0 ;
            for(int j = x ;j ;j -= lowbit(j)) L[0][++ cl] = seg.rt[j] ;
            for(int j = y ;j ;j -= lowbit(j)) R[0][++ cr] = seg.rt[j] ;
            ll l = 0 , r = 0 ;
            do{
              r = l + 1 ;
              seg.res = 0 ;
              seg.query(0 , 1 , m , 1 , min(1ll * m , r)) ;
              l = seg.res ;
            }while(l >= r) ;
            printf("%lld
    " , l + 1) ;
          }
        }
      }
      return 0 ;
    }
    /*
    */
    

    M - Kill the tree

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <unordered_map>
    #include <vector>
    #include <map>
    #include <list>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <set>
    #pragma GCC optimize(3 , "Ofast" , "inline")
    using namespace std ;
    #define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
    #define x first
    #define y second
    #define pb push_back
    typedef long long ll ;
    const double esp = 1e-6 , pi = acos(-1) ;
    typedef pair<int , int> PII ;
    const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
    ll in()
    {
      ll x = 0 , f = 1 ;
      char ch = getchar() ;
      while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
      while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
      return x * f ;
    }
    int n , size[N] , son[N] ;
    vector<int> res[N] , v[N] ;
    int fa[N] ;
    void dfs(int u , int f){
      size[u] = 1 ;
      fa[u] = f ;
      for(auto x : v[u]) {
        if(x == f) continue ;
        dfs(x , u) ;
        size[u] += size[x] ;
        if(size[x] > size[son[u]])
         son[u] = x ;
      }
      if(size[u] == 1 || size[son[u]] < size[u] - size[son[u]]) {
        res[u].pb(u) ;
        return ;
      }
      for(auto x : res[son[u]]) {
           while(x != u && size[u] - size[x] > size[x]) x = fa[x] ;
           res[u].pb(x) ;
           if(x != u && size[u] - size[x] == size[x]) res[u].pb(fa[x]) ;
      }
      sort(res[u].begin() , res[u].end()) ;
      res[u].erase(unique(res[u].begin() , res[u].end()) , res[u].end()) ;
    }
    int main()
    {
      n = in() ;
      for(int i = 1; i < n ;i ++ ) {
        int a = in() , b = in() ;
        v[a].pb(b) , v[b].pb(a) ;
      }
      dfs(1 , 0) ;
      for(int i = 1; i <= n ;i ++ ) {
        if(res[i].size() == 1)
         cout << res[i][0] << endl ;
        else cout << res[i][0] << " " << res[i][1] << endl ;
      }
      return 0 ;
    }
    /*
    */
    
  • 相关阅读:
    css3中-moz、-ms、-webkit 是什么意思
    自定义AppServer
    自定义AppSession
    分离Command
    创建简单的Telnet实例
    注册表权限设置
    centos root登录password 忘记解决的方法
    ajaxFileUpload+struts2实现多文件上传
    计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
    linux命令的别名alias,unalias
  • 原文地址:https://www.cnblogs.com/spnooyseed/p/13281170.html
Copyright © 2020-2023  润新知