• 近期的做题总结


    noi2014

    luoguP2114 [NOI2014]起床困难综合症

    luoguP2387 [NOI2014]魔法森林

    luoguP2375 [NOI2014]动物园

    luoguP2354 [NOI2014]随机数生成器

    luoguP2305 [NOI2014]购票

    noi2015

    luoguP1955 [NOI2015]程序自动分析

    luoguP2146 [NOI2015]软件包管理器

    luoguP2150 [NOI2015]寿司晚宴

    luoguP2168 [NOI2015]荷马史诗

    luoguP2178 [NOI2015]品酒大会

    luoguP2304 [NOI2015]小园丁与老司机

    noi2016

    luoguP1117 [NOI2016]优秀的拆分

    luoguP1173 [NOI2016]网格

    luoguP1587 [NOI2016]循环之美

    luoguP1712 [NOI2016]区间

    luoguP1721 [NOI2016]国王饮水记

    luoguP1737 [NOI2016]旷野大计算

    noi2017

    luoguP3822 [NOI2017]整数

    luoguP3823 [NOI2017]蚯蚓排队

    luoguP3824 [NOI2017]泳池

    luoguP3825 [NOI2017]游戏

    luoguP3826 [NOI2017]蔬菜

    luoguP3827 [NOI2017]分身术

    20分

    咕咕咕

    noi2018

    luoguP4768 [NOI2018]归程

    luoguP4769 [NOI2018]冒泡排序

    luoguP4770 [NOI2018]你的名字

    luoguP4774 [NOI2018]屠龙勇士

    luoguP4775 [NOI2018]情报中心

    luoguP4776 [NOI2018]多边形

    50分

    咕咕咕

    gym102028AXu Xiake in Henan Province

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int T;scanf("%d",&T);
     6     while(T--)
     7     {
     8         int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
     9         int t=(a==0)+(b==0)+(c==0)+(d==0);
    10         if(t==4)puts("Typically Otaku");
    11         if(t==3)puts("Eye-opener");
    12         if(t==2)puts("Young Traveller");
    13         if(t==1)puts("Excellent Traveller");
    14         if(t==0)puts("Contemporary Xu Xiake");
    15     }
    16     return 0;
    17 }
    View Code

    gym102028BUltraman vs. Aodzilla and Bodzilla

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=1e5+5;
     5 int ha,hb,ta,tb;ll ans[2];char s[2][N];
     6 int solab(ll &ans,char s[])
     7 {
     8     int i=0;ll sa=0;
     9     while(sa<ha){s[++i]='A';sa+=i;}
    10     ans=(ll)i*ta;ll sb=sa-ha;
    11     while(sb<hb){s[++i]='B';sb+=i;}
    12     ans+=(ll)i*tb;ll x=(sa-ha)-(sb-hb);
    13     if(x>0)s[sa-ha]='B';return i;
    14 }
    15 int solba(ll &ans,char s[])
    16 {
    17     int i=0;ll sb=0;
    18     while(sb<hb){s[++i]='B';sb+=i;}
    19     ans=(ll)i*tb;ll sa=sb-hb;
    20     while(sa<ha){s[++i]='A';sa+=i;}
    21     ans+=(ll)i*ta;ll x=(sb-hb)-(sa-ha);
    22     int j=1;ll t=sb-hb;
    23     while(t>=j){s[j]='A';x-=j;t-=j;j++;}
    24     while(x>0){s[j-1]='B';s[j]='A';x--;j++;}
    25     return i;
    26 }
    27 int main()
    28 {
    29     int T;scanf("%d",&T);
    30     while(T--)
    31     {
    32         scanf("%d%d%d%d",&ha,&hb,&ta,&tb);
    33         int p,n=solab(ans[0],s[0]);solba(ans[1],s[1]);
    34         if(ans[0]!=ans[1])p=ans[0]<ans[1];
    35         else{int i=1;while(i<n&&s[0][i]==s[1][i])++i;p=s[0][i]<s[1][i];}
    36         p^=1;s[p][n+1]=0;printf("%lld %s
    ",ans[p],s[p]+1);
    37     }
    38     return 0;
    39 }
    View Code

    gym102028CSupreme Command

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=300005;
     5 int T,n,m,vis[N];ll LL,LR,RL,RR,C[N];
     6 inline void cal(int i);
     7 struct D
     8 {
     9     int p[N],id[N];ll l,r,d;
    10     void init(){l=1,r=n,d=0;}
    11     void pre(){cal(id[1]);cal(id[n]);}
    12     void stp(int x,int i){p[i]=x;id[x]=i;}
    13     void left(int k){while(l<r&&l+d-k<1)cal(id[++l]);if(l+d-k>=1)d-=k;else d=1-l;}
    14     void right(int k){while(r>l&&r+d+k>n)cal(id[--r]);if(r+d+k<=n)d+=k;else d=n-r;}
    15     int qry(int x){return p[x]<=l?l+d:(p[x]>=r?r+d:p[x]+d);}
    16 }A, B;
    17 inline void cal(int i)
    18 {
    19     if(vis[i])return;
    20     else if(A.p[i]<=A.l&&B.p[i]<=B.l)vis[i]=1,LL++;
    21     else if(A.p[i]<=A.l&&B.p[i]>=B.r)vis[i]=1,LR++;
    22     else if(A.p[i]>=A.r&&B.p[i]<=B.l)vis[i]=1,RL++;
    23     else if(A.p[i]>=A.r&&B.p[i]>=B.r)vis[i]=1,RR++;
    24 }
    25 ll qry()
    26 {
    27     if(A.r-A.l>0&&B.r-B.l>0)return C[LL]+C[RR]+C[LR]+C[RL];
    28     if(A.r-A.l==0&&B.r-B.l>0)return C[LL+RL]+C[LR+RR];
    29     if(B.r-B.l==0&&A.r-A.l>0)return C[LL+LR]+C[RR+RL];
    30     return C[LL+LR+RR+RL];
    31 }
    32 int main()
    33 {
    34     scanf("%d",&T);
    35     for(int i=2;i<N;i++)C[i]=1ll*i*(i-1)/2;
    36     while(T--)
    37     {
    38         scanf("%d%d",&n,&m);LL=LR=RR=RL=0;
    39         for(int i=1,x,y;i<=n;i++)scanf("%d%d",&x,&y),B.stp(x,i),A.stp(y,i);
    40         A.init();B.init();A.pre();B.pre();int k;char s[3];
    41         for(int i=1;i<=m;i++)
    42         {
    43             scanf("%s",s);
    44             if(s[0]=='!')printf("%lld
    ",qry());
    45             else 
    46             {
    47                 scanf("%d",&k);
    48                 if(s[0]=='L') A.left(k);
    49                 else if(s[0]=='R') A.right(k);
    50                 else if(s[0]=='U') B.left(k);
    51                 else if(s[0]=='D') B.right(k);
    52                 else printf("%d %d
    ",B.qry(k),A.qry(k));
    53             }
    54         }
    55         for(int i=1;i<=n;i++)vis[i]=0;
    56     }
    57     return 0;
    58 }
    View Code

    gym102028DKeiichi Tsuchiya the Drift King

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int T;scanf("%d",&T);
     6     while(T--)
     7     {
     8         double a,b,r,d;scanf("%lf%lf%lf%lf",&a,&b,&r,&d);
     9         double l=sqrt(b*b+(a+r)*(a+r)),ang=acos((a+r)/l);d=d/180*acos(-1.0);
    10         if(d>ang||fabs(d-ang)<1e-6)printf("%.9lf
    ",l-r);
    11         else{double l2=(a+r)/cos(d),x=(b-l2*sin(d))*sin(d);printf("%.9lf
    ",l2+x-r);}
    12     }
    13     return 0;
    14 }
    View Code

    gym102028EResistors in Parallel

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 string S[205],s1[205],s2[205]; 
     4 int d[205],f[205][505];
     5 inline void prt(string s)
     6 {
     7     int t=0;while(s[t]=='0')t++;
     8     for(int i=t;i<=200;i++)printf("%c",s[i]);
     9 }
    10 inline string mul(string a,int b){for(int j=200,c=0;j>=0;j--){int t=(a[j]-'0')*b+c;a[j]='0'+t%10;c=t/10;}return a;}
    11 int main()
    12 {
    13     string s="";for(int i=1;i<=200;i++)s+="0";s+="1";
    14     int cc;S[cc=1]=s1[1]=s2[1]=s;
    15     for(int i=2;i<=500;i++)
    16     {
    17         int ff=1;for(int j=2;j<i;j++)if(i%j==0){ff=0;break;}
    18         if(!ff)continue;
    19         int t1=i,t2=i+1,c=0;
    20         for(int j=200;j>=0;j--)
    21         {
    22             int t=(S[cc][j]-'0')*t1+c;
    23             d[j]=t%10;c=t/10; 
    24         }
    25         if(c)break;
    26         S[cc+1]="";
    27         for(int j=0;j<=200;j++)S[cc+1]+=('0'+d[j]);
    28         cc++;
    29         for(int j=2;j<500;j++)f[cc][j]=f[cc-1][j];f[cc][i]++;
    30         for(int j=2;j<500;j++)if(t2%j==0){while(t2%j==0)f[cc][j]--,t2/=j;}
    31         s1[cc]=s2[cc]=s;
    32         for(int j=2;j<500;j++)if(f[cc][j]>0)for(int k=1;k<=f[cc][j];k++)s1[cc]=mul(s1[cc],j);
    33         for(int j=2;j<500;j++)if(f[cc][j]<0)for(int k=1;k<=-f[cc][j];k++)s2[cc]=mul(s2[cc],j);
    34     }
    35     int C;cin>>C; 
    36     while(C--)
    37     {
    38         cin>>s;int n=s.size();while(n<201)s="0"+s,n++;
    39         int t=upper_bound(S+1,S+cc+1,s)-S-1;
    40         prt(s1[t]);putchar('/');prt(s2[t]);putchar('
    ');
    41     }
    42     return 0;
    43 }
    View Code

    gym102028FHoneycomb

     1 #include<bits/stdc++.h>
     2 using namespace std; 
     3 const int N=1005;
     4 int r,c,w,h,vis[N*6][N*6],d[2][6]={{2,-2,1,1,-1,-1},{0,0,3,-3,3,-3}};
     5 char s[N*6][N*6];
     6 struct qq{int x,y,d;}st;
     7 inline bool chk(int x,int y){return x>0&&x<w&&y>0&&y<h;}
     8 inline int bfs()
     9 {
    10     queue<qq>Q;qq u,v;u=st;vis[u.x][u.y]=1;Q.push(u);
    11     while(!Q.empty())
    12     {
    13         v=Q.front();Q.pop();if(s[v.x][v.y]=='T')return v.d;
    14         for(int i=0;i<6;i++)
    15         {
    16             int x=v.x+d[0][i],y=v.y+d[1][i],xx=x+d[0][i],yy=y+d[1][i];
    17             if(s[x][y]==' '&&!vis[xx][yy]&&chk(xx,yy)){vis[xx][yy]=1;u.x=xx;u.y=yy;u.d=v.d+1;Q.push(u);}
    18         }
    19     }
    20     return -1;
    21 }
    22 int main()
    23 {
    24     int T;scanf("%d",&T);
    25     while(T--)
    26     {
    27         scanf("%d%d",&r,&c);getchar();w=4*r+3;h=6*c+3;
    28         for(int i=0;i<w;i++)gets(s[i]);
    29         for(int i=0;i<w;i++)
    30         {
    31             int l=strlen(s[i]);
    32             for(int j=0;j<l;j++)if(s[i][j]=='S'){st.x=i,st.y=j,st.d=1;break;}
    33             if(st.d)break;
    34         }
    35         int ans=bfs();
    36         printf("%d
    ",ans);
    37         for(int i=0;i<w;i++)
    38         {
    39             int l=strlen(s[i]);
    40             for(int j=0;j<l;j++)s[i][j]=vis[i][j]=0;
    41         }
    42         st.x=0;st.y=0;st.d=r=c=w=h=0;
    43     }
    44     return 0;
    45 }
    View Code

    gym102028GShortest Paths on Random Forests

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1000005,P=998244353;
     4 int qn[N],qm[N],fac[N],ifac[N],r[N],f[N],g[N],h[N],c[N],t[N],A[N],B[N],C[N];
     5 inline int pw(int a,int b){int r=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)r=1ll*r*a%P;return r;}
     6 inline void ntt(int n,int*a,int f)
     7 {
     8     int l=1;while((1<<l)<n)l++;
     9     for(int i=1;i<n;i++)r[i]=r[i>>1]>>1|(i&1)<<(l-1);
    10     for(int i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
    11     for(int i=2;i<=n;i<<=1)
    12     {
    13         int wn=pw(3,(P-1)/i);if(f==-1)wn=pw(wn,P-2);
    14         for(int j=0;j<n;j+=i)for(int k=0,w=1;k<(i>>1);k++,w=1ll*w*wn%P){int u=a[j+k],v=1ll*a[j+k+(i>>1)]*w%P;a[j+k]=(u+v)%P;a[j+k+(i>>1)]=(u+P-v)%P;}
    15     }
    16     if(f==-1)for(int i=0,iv=pw(n,P-2);i<n;i++)a[i]=1ll*a[i]*iv%P;
    17 }
    18 void inv(int n,int*a,int*b)
    19 {
    20     if(n==1){b[0]=pw(a[0],P-2);b[1]=0;return;}
    21     inv(n>>1,a,b);int m=n<<1;
    22     for(int i=0;i<m;i++)A[i]=i<n?a[i]:0,b[i]=i<n?b[i]:0;
    23     ntt(m,A,1);ntt(m,b,1);
    24     for(int i=0;i<m;i++)b[i]=1ll*(P+2-1ll*A[i]*b[i]%P)*b[i]%P;
    25     ntt(m,b,-1);for(int i=n;i<m;i++)b[i]=0;
    26 }
    27 void ln(int n,int*a,int*b)
    28 {
    29     inv(n,a,b);int m=n<<1;
    30     for(int i=0;i<n-1;i++)B[i]=1ll*a[i+1]*(i+1)%P;B[n-1]=0;
    31     for(int i=n;i<m;i++)b[i]=B[i]=0;ntt(m,b,1);ntt(m,B,1);
    32     for(int i=0;i<m;i++)b[i]=1ll*b[i]*B[i]%P;
    33     ntt(m,b,-1);for(int i=n-1;i;i--)b[i]=1ll*b[i-1]*pw(i,P-2)%P;b[0]=0;
    34 }
    35 void exp(int n,int*a,int*b)
    36 {
    37     if(n==1){b[0]=1;b[1]=0;return;}
    38     exp(n>>1,a,b);int m=n<<1;ln(n,b,C);
    39     for(int i=0;i<m;i++)C[i]=i<n?(a[i]+P-C[i])%P:0;C[0]++;
    40     ntt(m,b,1);ntt(m,C,1);for(int i=0;i<m;i++)b[i]=1ll*b[i]*C[i]%P;
    41     ntt(m,b,-1);for(int i=n;i<m;i++)b[i]=0;
    42 }
    43 void mul(int n,int*a,int*b,int*c)
    44 {
    45     for(int i=0;i<n;i++)A[i]=a[i],B[i]=b[i];
    46     int m=n<<1;for(int i=n;i<m;i++)A[i]=B[i]=0;
    47     ntt(m,A,1);ntt(m,B,1);
    48     for(int i=0;i<m;i++)c[i]=1ll*A[i]*B[i]%P;
    49     ntt(m,c,-1);for(int i=n;i<m;i++)c[i]=0;
    50 }
    51 int main()
    52 {
    53     int T,n=0,nn=1;scanf("%d",&T);
    54     for(int i=1;i<=T;i++)scanf("%d%d",&qn[i],&qm[i]),n=max(n,qn[i]);
    55     while(nn<=n)nn<<=1;nn<<=1;ifac[1]=fac[0]=ifac[0]=1;
    56     for(int i=2;i<nn;i++)ifac[i]=1ll*ifac[P%i]*(P-P/i)%P;
    57     for(int i=1;i<nn;i++)fac[i]=1ll*fac[i-1]*i%P,ifac[i]=1ll*ifac[i-1]*ifac[i]%P;
    58     c[1]=1;for(int i=2;i<=n;i++)c[i]=1ll*pw(i,i-2)*ifac[i]%P;exp(nn>>1,c,f);
    59     c[1]=0;for(int i=2;i<=n;i++)c[i]=1ll*(i-1)*pw(i,i-1)%P*ifac[2]%P*ifac[i]%P;
    60     mul(nn>>1,f,c,g);for(int i=1;i<=n;i++)c[i]=1ll*pw(i,i)*ifac[i]%P;
    61     mul(nn>>1,c,c,t);c[0]=ifac[2];mul(nn>>1,t,c,h);mul(nn>>1,h,f,h);
    62     for(int i=1;i<=n;i++)f[i]=1ll*f[i]*fac[i]%P,g[i]=1ll*g[i]*fac[i]%P,h[i]=1ll*h[i]*fac[i]%P;
    63     for(int i=1;i<=T;i++)
    64     {
    65         int n=qn[i],m=qm[i],ans=1ll*f[n]*n%P*(n-1)%P*ifac[2]%P;
    66         ans=(ans+P-g[n])%P;ans=1ll*ans*m%P*m%P;ans=(ans+h[n])%P;
    67         printf("%d
    ",1ll*ans*pw(f[n],P-2)%P);
    68     }
    69     return 0;
    70 }
    View Code

    gym102028HCan You Solve the Harder Problem?

     1 #include<bits/stdc++.h>
     2 #include<unordered_map>
     3 using namespace std;
     4 #define ll long long
     5 const int N=2e5+5;
     6 int n,tot,lst,rt,a[N],lk[N<<1],len[N<<1],stk[N],ps[N<<1],f1[N][30];
     7 ll f2[N][30];
     8 unordered_map<int,int>ch[N<<1]; 
     9 inline void extend(int c,int x)
    10 {
    11     int p=lst,np=lst=++tot;len[np]=len[p]+1;ps[np]=x;ch[p].clear();
    12     for(;!ch[p].count(c);p=lk[p])ch[p][c]=np;
    13     if(!p)lk[np]=rt;
    14     else
    15     {
    16         int q=ch[p][c];
    17         if(len[q]==len[p]+1)lk[np]=q;
    18         else
    19         {
    20             int nq=++tot;ps[nq]=ps[q];len[nq]=len[p]+1;lk[nq]=lk[q];lk[q]=lk[np]=nq;ch[nq]=ch[q];
    21             for(;ch[p][c]==q;p=lk[p])ch[p][c]=nq;
    22         }
    23     }
    24 }
    25 long long sol()
    26 {
    27     int tp=0;stk[0]=0;a[0]=1e9+7;ll ans=0;
    28     for(int i=1;i<=n;i++)f1[i][0]=f2[i][0]=0;
    29     for(int i=n;i>=1;stk[++tp]=i--)while(a[stk[tp]]<a[i]){f1[stk[tp]][0]=i;f2[stk[tp]][0]=1ll*(stk[tp]-i)*a[stk[tp]];tp--;}
    30     for(int i=1;i<=18;i++)for(int j=1;j<=n;j++)f1[j][i]=f1[f1[j][i-1]][i-1],f2[j][i]=f2[j][i-1]+f2[f1[j][i-1]][i-1];
    31     for(int i=2;i<=tot;i++)
    32     {
    33         int t1=ps[i]-len[lk[i]]+1,x=ps[i];
    34         for(int j=18;j>=0;j--)if(f1[x][j]>=t1)x=f1[x][j];
    35         int t2=ps[i]-len[i]+1;ans+=1ll*(t1-max(f1[x][0]+1,t2))*a[x];
    36         x=f1[x][0];if(x<t2)continue;
    37         for(int j=18;j>=0;j--)if(f1[x][j]>=t2)ans+=f2[x][j],x=f1[x][j];
    38         ans+=1ll*(x-t2+1)*a[x];
    39     }
    40     return ans;
    41 }
    42 int main()
    43 {
    44     int T;scanf("%d",&T);
    45     while(T--)
    46     {
    47         tot=lst=rt=1;ch[1].clear();scanf("%d",&n);
    48         for(int i=1;i<=n;i++)scanf("%d",&a[i]),extend(a[i],i);
    49         printf("%lld
    ",sol());
    50     }
    51     return 0;
    52 }
    View Code

    gym102028IDistance

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=100005;
     5 int n,a[N];ll s1[N],s2[N];
     6 int main()
     7 {
     8     int T;scanf("%d",&T);
     9     while(T--)
    10     {
    11         scanf("%d",&n);a[1]=0;
    12         for(int i=2;i<=n;i++)scanf("%d",&a[i]),a[i]+=a[i-1];
    13         s1[0]=0;for(int i=1;i<=n;i++)s1[i]=s1[i-1]+a[i];
    14         s2[n+1]=0;for(int i=n;i>=1;i--)s2[i]=s2[i+1]+a[i];
    15         int l=0,r=n+1;ll s=0;
    16         for(int i=1;i<=n;i++)
    17         {
    18             int p;if(i&1)p=l+1;else p=r-1;
    19             s=s+1ll*l*a[p]-s1[l]+s2[r]-1ll*(n-r+1)*a[p];
    20             if(i&1)l++;else r--;printf("%lld",s);if(i<n)putchar(' '); 
    21         }
    22         puts("");
    23     }
    24     return 0;
    25 }
    View Code

    gym102028JCarpets Removal

    咕咕咕

    gym102028KCounting Failures on a Trie

    咕咕咕

    gym102028LConnected Subgraphs

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=100005,P=1e9+7;
     5 int n,m,d[N],c[N],ps[N],id[N],w[N];
     6 vector<int>g[N],e[N];
     7 inline int pw(int a,int b){int r=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)r=1ll*r*a%P;return r;}
     8 inline bool cmp(int x,int y){return d[x]<d[y];}
     9 inline ll f1111(){ll ans=0,iv=pw(24,P-2);for(int i=1;i<=n;i++){ll t=iv;for(int j=0;j<4;j++)t=t*(d[i]-j)%P;ans=(ans+t)%P;}return ans;}
    10 inline ll f112(){ll ans=0;for(int x=1;x<=n;x++)for(int i=0,y;i<e[x].size();i++)y=e[x][i],ans=(ans+1ll*(d[x]-1)*(d[x]-2)/2%P*(d[y]-1))%P;return ans;}
    11 inline ll f22(){ll ans=0;for(int x=1;x<=n;x++)for(int i=0,y,p=0;i<e[x].size();i++)y=e[x][i],ans=(ans+1ll*p*(d[y]-1))%P,p+=d[y]-1;return ans;}
    12 inline int c3()
    13 {
    14     int ans=0;for(int i=1;i<=n;i++)w[i]=0;
    15     for(int x=1;x<=n;x++)
    16     {
    17         for(int i=0;i<g[x].size();i++)w[g[x][i]]=1;
    18         for(int i=0;i<g[x].size();i++)for(int j=0,y=g[x][i],z;j<g[y].size();j++)if(w[z=g[y][j]])ans=(ans+1+e[x].size()+e[y].size()+e[z].size()-6)%P;
    19         for(int i=0;i<g[x].size();i++)w[g[x][i]]=0;
    20     }
    21     return ans;
    22 }
    23 inline int c4()
    24 {
    25     int ans=0;for(int i=1;i<=n;i++)w[i]=0;
    26     for(int x=1;x<=n;x++)
    27     {
    28         for(int i=0;i<e[x].size();i++)for(int j=0,y=e[x][i],z;j<g[y].size();j++)if(ps[x]<ps[z=g[y][j]]){ans=(ans+w[z])%P;w[z]++;}
    29         for(int i=0;i<e[x].size();i++)for(int j=0,y=e[x][i];j<g[y].size();j++)w[g[y][j]]=0;
    30     }
    31     return ans;
    32 }
    33 int main()
    34 {
    35     int T;scanf("%d",&T);
    36     while(T--)
    37     {
    38         scanf("%d%d",&n,&m);
    39         for(int i=1;i<=n;i++)d[i]=0,id[i]=i,e[i].clear(),g[i].clear();
    40         for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);d[u]++;d[v]++;e[u].push_back(v);e[v].push_back(u);}
    41         sort(id+1,id+n+1,cmp);
    42         for(int i=1;i<=n;i++)ps[id[i]]=i;
    43         for(int x=1;x<=n;x++)for(int i=0,y;i<e[x].size();i++)if(ps[x]<ps[y=e[x][i]])g[x].push_back(y);
    44         printf("%d
    ",(1ll*(f1111()+f112()+f22()-3ll*c3()-3ll*c4())%P+P)%P);
    45     }
    46     return 0; 
    47 }
    View Code

    gym102056AExotic … Ancient City

    利用$wleq30$可以模拟Kruskal的过程,每次加入所有边权为w的边,考虑新加入的边数=新减少的连通块数,转化为求解边权$leq w$的连通块数,然后差分。(意义:相当于抹去了边权的影响,Kruskal求MST转化成并查集求连通块数,从而加入边的顺序可以重新定义。)

    考虑将$leq w$的边从左到右一列一列依次加入,维护当前2列的连通性(因为只关心加入边两端是否已经连通),并查集合并时列小的挂列大的下面,考虑如何从1~i-1列的并查集得到1~i列的并查集,显然1~i列的并查集可以认为是1~i-1和2~i两个一样的并查集重叠,考虑在1~i-1(等价于2~i)列的答案上加边:1~i-1的并查集信息相当于在i-1列内部有加边,考虑维护加入的边,显然每次要么加入,则2i个元素的并查集中连通块数减少1,否则这条边对之后的结果无影响,由于连通块数由2n变成1,复杂度$O(malpha(n))$。 

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 #define pp pair<int,int>
     5 #define X first
     6 #define Y second
     7 const int N=200005,W=31;
     8 int n,m,k,fa[N];ll a[N],ans[N];
     9 vector<pp>e[W];
    10 int fnd(int x){return fa[x]==x?x:fa[x]=fnd(fa[x]);}
    11 int main()
    12 {
    13     scanf("%d%d%d",&n,&m,&k);
    14     for(int i=1,u,v,w;i<=k;i++){scanf("%d%d%d",&u,&v,&w);e[w].push_back(make_pair(u,v));}
    15     for(int w=1;w<=30;w++)
    16     {
    17         for(int i=1;i<=n*2;i++)fa[i]=i;
    18         memset(a,0,sizeof(a));vector<pp>g;
    19         for(int i=1;i<=w;i++)for(int j=0;j<e[i].size();j++)
    20         {
    21             int u=fnd(e[i][j].X),v=fnd(e[i][j].Y+n);
    22             if(u==v)continue;if(u>v)swap(u,v);
    23             a[1]++;fa[u]=v;
    24             if(u>n&&v>n)g.push_back(make_pair(u-n,v-n));
    25         }
    26         for(int i=2;i<=m;i++)
    27         {
    28             vector<pp>gg;
    29             for(int j=0;j<g.size();j++)
    30             {
    31                 int u=fnd(g[j].X),v=fnd(g[j].Y);
    32                 if(u==v){a[i]--;continue;}
    33                 if(u>v)swap(u,v);fa[u]=v;
    34                 if(u>n&&v>n)gg.push_back(make_pair(u-n,v-n));
    35             }
    36             g=gg;
    37         } 
    38         for(int i=2;i<=m;i++)a[i]+=a[i-1];
    39         for(int i=2;i<=m;i++)a[i]+=a[i-1];
    40         for(int i=1;i<=m;i++)if(w<30)ans[i]-=a[i];else ans[i]+=w*a[i];
    41     }
    42     for(int i=1;i<=m;i++)printf("%lld
    ",ans[i]);
    43     return 0;
    44 }
    View Code

    gym102056BMysterious … Host

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=5050;
     5 ll n,P,dp[N][5];
     6 int main()
     7 {
     8     scanf("%lld%lld",&n,&P);dp[1][1]=1;
     9     for(int i=2;i<=n;i++)
    10     {
    11         for(int j=1;j<i;j++)for(int k=1;k<=4;k++)(dp[i][min(4,k+1)]+=dp[i-j][k]*dp[j][1])%=P;
    12         dp[i][1]=(dp[i][2]+dp[i][3]+dp[i][4]*2)%P;
    13     }
    14     for(int i=1;i<=n;i++)printf("%lld
    ",dp[i][1]);
    15     return 0;
    16 }
    View Code

    gym102056CHeretical … Möbius

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int M=5e4+10,inf=1e9+7,lcm=901800900;
     5 ll ans=inf,a[210],u[M],p[6],g[6]={4,9,25,49,121,169};
     6 vector<ll>pr,v[6];bool vis[M];map<ll,ll>mp;
     7 inline ll mu(ll x)
     8 {
     9     if(x<M)return u[x];
    10     if(mp.count(x))return mp[x];
    11     for(int i=0;i<pr.size();i++)
    12     {
    13         if(pr[i]*pr[i]>x)break;
    14         if(x%(pr[i]*pr[i])==0)return mp[x]=0;
    15         if(x%pr[i]==0)x/=pr[i];
    16     }
    17     return mp[x]=1;
    18 }
    19 void exgcd(ll a,ll b,ll&x,ll&y){if(!b){x=1;y=0;}else{exgcd(b,a%b,y,x);y-=a/b*x;}}
    20 inline ll crt(int n,ll*a,ll*m)
    21 {
    22     ll M=m[0],R=a[0],x,y;
    23     for(int i=1;i<n;i++)
    24     {
    25         ll c=(a[i]-R%m[i]+m[i])%m[i];exgcd(M,m[i],x,y);
    26         x=(x%m[i])*(c%m[i]);x=(x%m[i]+m[i])%m[i];
    27         R=M*x+R;M*=m[i];R=(R%M+M)%M;
    28     }
    29     return R;
    30 }
    31 void calc()
    32 {
    33     for(ll i=crt(6,p,g);i+199<=1e9;i+=lcm)
    34     {
    35         if(i>=ans)break;int ff=1;
    36         for(ll j=i;j<=i+199;j++)if(mu(j)!=a[j-i+1]){ff=0;break;}
    37         if(ff){ans=min(ans,i);break;}
    38     }
    39 }
    40 void dfs(int x)
    41 {
    42     if(x==6){calc();return;}
    43     random_shuffle(v[x].begin(),v[x].end());
    44     for(int j=0;j<v[x].size();j++){p[x]=v[x][j];dfs(x+1);}
    45 }
    46 int main()
    47 {
    48     for(int i=1;i<M;i++)u[i]=1;
    49     for(int i=2;i<M;i++)
    50     {
    51         if(!vis[i]){pr.push_back(i);for(ll j=1ll*i*i;j<M;j+=1ll*i*i)u[j]=0;}
    52         for(int j=0;j<pr.size();j++)
    53         {
    54             ll t=1ll*i*pr[j];
    55             if(t<M){vis[t]=1;if(i%pr[j]==0)break;}else break;
    56         }
    57     }
    58     int tot=0;
    59     for(int i=0;i<10;i++)
    60     {
    61         char s[30];scanf("%s",s);
    62         for(int j=1;j<=20;j++)a[i*20+j]=s[j-1]-'0',tot+=s[j-1]-'0';
    63     }
    64     if(tot<=70){puts("-1");return 0;}
    65     for(int i=0;i<6;i++)for(int j=1;j<=g[i];j++)
    66     {
    67         int f=1;for(int k=j;k<=200&&f;k+=g[i])f=a[k]^1;
    68         if(f)v[i].push_back((g[i]-j+1)%g[i]);
    69     }
    70     for(int i=0;i<6;i++)if(v[i].size()==0){puts("-1");return 0;}
    71     dfs(0);if(ans!=inf){printf("%d
    ",ans);return 0;}else puts("-1");
    72     return 0;
    73 }
    View Code

    gym102056DDeja vu of … Go Players 

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int T;scanf("%d",&T);
     6     while(T--)
     7     {
     8         int n,m;scanf("%d%d",&n,&m);
     9         puts(n>m?"No":"Yes");
    10         for(int i=0,x;i<n+m;i++)scanf("%d",&x);
    11     }
    12     return 0;
    13 }
    View Code

    gym102056EImmortal … Universe

    咕咕咕

    gym102056FInterstellar … Fantasy

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 struct P{int x,y,z;};
     5 inline P operator+(const P&a,const P&b){return (P){a.x+b.x,a.y+b.y,a.z+b.z};}
     6 inline P operator-(const P&a,const P&b){return (P){a.x-b.x,a.y-b.y,a.z-b.z};}
     7 inline int operator*(const P&a,const P&b){return a.x*b.x+a.y*b.y+a.z*b.z;}
     8 inline double len(const P&a){return sqrt(a*a);}
     9 inline ll sqr(int x){return 1ll*x*x;}
    10 int main()
    11 {
    12     int T;scanf("%d",&T);
    13     while(T--)
    14     {
    15         P o,a,b;int r;scanf("%d%d%d%d%d%d%d%d%d%d",&o.x,&o.y,&o.z,&r,&a.x,&a.y,&a.z,&b.x,&b.y,&b.z);
    16         if((a-b)*(a-b)==0||(o-a)*(b-a)<=0||(o-b)*(a-b)<=0)printf("%.9lf
    ",len(a-b));
    17         else
    18         {
    19             double h=sqrt((o-a)*(o-a)-(double)sqr((o-a)*(b-a))/((a-b)*(a-b)));
    20             if(r<=h)printf("%.9lf
    ",len(a-b));
    21             else
    22             {
    23                 double la=sqrt((o-a)*(o-a)-r*r),lb=sqrt((o-b)*(o-b)-r*r),ang=atan2(sqrt((o-a)*(o-a)-h*h),h)+atan2(sqrt((o-b)*(o-b)-h*h),h)-atan2(la,r)-atan2(lb,r);
    24                 printf("%.9lf
    ",ang*r+la+lb);
    25             }
    26         }
    27     }
    28     return 0;
    29 } 
    View Code 

    gym102056GOmnipotent … Garland

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1000005;
     4 int n,m,k,b[N];char t[N];
     5 vector<int>g[N],ans[N];
     6 struct cmp
     7 {
     8     bool operator()(int x,int y)
     9     {
    10         if((!g[x].size())!=(!g[y].size()))return !g[x].size();
    11         if((!x)!=(!y))return !x;return g[x].size()<g[y].size();
    12     }
    13 };
    14 inline void psh(int i,int l,int r){while(((++l)%=n)!=r)g[i].push_back(l);}
    15 bool sol() 
    16 {
    17     scanf("%d%d%d%s",&n,&m,&k,t);int tp=0;
    18     for(int i=0;i<n;i++)if(t[i]=='B')b[++tp]=i;
    19     if(n%k||n/k<m||tp<2*m)return 0;
    20     if(m==1)
    21     {
    22         for(int i=0;i<n;i++)if(t[i]=='B'&&t[(i+1)%n]=='B'){ans[1].resize(n);for(int j=0;j<n;j++)ans[1][j]=j;return 1;}
    23         return 0;
    24     }
    25     int len=0;for(int i=1;i<=m;i++)len+=b[i*2]-b[i*2-1]-1;
    26     if(len>n-2*m-len){int t=b[2*m];for(int i=2*m;i>=2;i--)b[i]=b[i-1];b[1]=t;}
    27     for(int i=1;i<=m;i++)
    28     {
    29         ans[i].resize(2);ans[i][0]=b[i*2-1];ans[i][1]=b[i*2];
    30         psh(i,b[i*2-1],b[i*2]);psh(0,b[i*2],b[i*2%(2*m)+1]);
    31     }
    32     priority_queue<int,vector<int>,cmp>Q;
    33     for(int i=0;i<=m;i++)Q.push(i);
    34     for(int i=1;i<=m;i++)
    35     {
    36         while(ans[i].size()%k)
    37         {
    38             int x=Q.top();Q.pop();
    39             if(x==i)
    40             {
    41                 int y=Q.top();Q.pop();
    42                 ans[i].push_back(g[y].back());g[y].pop_back();
    43                 Q.push(y);
    44             }
    45             else ans[i].push_back(g[x].back()),g[x].pop_back();
    46             Q.push(x);
    47         }
    48     }
    49     for(int x=m;x>=0;x--)
    50     {
    51         int i=x%m+1;
    52         for(int j=0;j<g[x].size();j++)ans[i].push_back(g[x][j]);
    53         g[x].clear();
    54         while(ans[i].size()%k)ans[i].push_back(g[0].back()),g[0].pop_back();
    55     }
    56     return 1;
    57 }
    58 int main()
    59 {
    60     int T;scanf("%d",&T);
    61     while(T--)
    62     {
    63         if(!sol())puts("No");
    64         else
    65         {
    66             puts("Yes");
    67             for(int i=1;i<=m;i++)
    68             {
    69                 sort(ans[i].begin(),ans[i].end());
    70                 printf("%d",(int)(ans[i].size()));
    71                 for(int j=0;j<ans[i].size();j++)printf(" %d",ans[i][j]);
    72                 puts("");
    73             }
    74         }
    75     }
    76     return 0;
    77 }
    View Code

    gym102056HSaintly … Coins

    咕咕咕

    gym102056IMisunderstood … Missing 

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=105,M=5505;
     5 int n;ll a[N],b[N],c[N],dp[2][N][M];
     6 int main()
     7 {
     8     int T;scanf("%d",&T);
     9     while(T--)
    10     {
    11         scanf("%d",&n);
    12         for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
    13         for(int i=0;i<2;i++)for(int j=0;j<=n;j++)for(int k=0;k<=5050;k++)dp[i][j][k]=-1;
    14         dp[n&1^1][0][0]=0;ll res=0;
    15         for(int i=n;i>=1;i--)for(int j=0;j<=n;j++)for(int k=0;k<=5050;k++)if(~dp[i&1^1][j][k])
    16         {
    17             dp[i&1][j+1][k+i]=max(dp[i&1][j+1][k+i],dp[i&1^1][j][k]+a[i]);
    18             dp[i&1][j][k]=max(dp[i&1][j][k],dp[i&1^1][j][k]+1ll*(k-j*i)*b[i]);
    19             dp[i&1][j][k]=max(dp[i&1][j][k],dp[i&1^1][j][k]+1ll*j*c[i]);
    20         }
    21         for(int i=1;i<=n;i++)for(int j=1;j<=5050;j++)res=max(res,dp[1][i][j]);
    22         printf("%lld
    ",res);
    23     }
    24     return 0;
    25 }
    View Code

    gym102056JPhilosophical … Balance

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=200010;
     5 int n,cc,cnt=1,lst=1,fa[N<<1],len[N<<1],ch[N<<1][26],tg[N<<1],hd[N<<1];char s[N];double dp[N<<1];
     6 struct E{int v,nxt;}e[N<<1];
     7 inline void add(int u,int v){e[++cc]=(E){v,hd[u]};hd[u]=cc;}
     8 inline void extend(int c)
     9 {
    10     int p=lst,np=lst=++cnt;tg[np]=1;len[np]=len[p]+1;
    11     for(;!ch[p][c];p=fa[p])ch[p][c]=np;
    12     if(!p)fa[np]=1;
    13     else
    14     {
    15         int q=ch[p][c];
    16         if(len[q]==len[p]+1)fa[np]=q;
    17         else
    18         {
    19             int nq=++cnt;len[nq]=len[p]+1;tg[nq]=0;fa[nq]=fa[q];fa[q]=fa[np]=nq;memcpy(ch[nq],ch[q],sizeof(ch[q]));
    20             for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
    21         } 
    22     }
    23 }
    24 void dfs(int x)
    25 {
    26     if(tg[x]){dp[x]=len[x];return;}double s=0;
    27     for(int i=hd[x];i;i=e[i].nxt)dfs(e[i].v),s+=1.0/(dp[e[i].v]-len[x]);
    28     dp[x]=1.0/s+len[x];
    29 }
    30 void sol()
    31 {
    32     scanf("%s",s+1);n=strlen(s+1);cc=0;lst=cnt=1;
    33     for(int i=0;i<=2*n+5;i++)hd[i]=0,memset(ch[i],0,sizeof(ch[i]));
    34     for(int i=n;i>=1;i--)extend(s[i]-'a');
    35     for(int i=2;i<=cnt;i++)add(fa[i],i);
    36     dfs(1);printf("%.10lf
    ",dp[1]);
    37 } 
    38 int main(){int T;scanf("%d",&T);while(T--)sol();return 0;}
    View Code

    gym102056KDesperate … Fire Survive

    咕咕咕

    gym102056LEventual … Journey

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=100005;
     4 int n,m,a[N],c[2],d[N],f[N];
     5 int main()
     6 {
     7     scanf("%d%d",&n,&m);
     8     for(int i=0;i<n;i++)scanf("%d",&a[i]),c[a[i]]++;
     9     for(int i=0,u,v;i<m;i++)
    10     {
    11         scanf("%d%d",&u,&v);u--;v--;
    12         if(a[u]!=a[v])d[u]++,d[v]++;
    13     }
    14     for(int i=0;i<n;i++)if(d[i])f[a[i]]++;
    15     for(int i=0;i<n;i++)
    16     {
    17         int ans=0;
    18         if(!d[i])
    19         {
    20             ans+=c[a[i]]-1;
    21             ans+=2*f[a[i]^1];
    22             ans+=3*(c[a[i]^1]-f[a[i]^1]);
    23         }
    24         else
    25         {
    26             ans+=c[a[i]]-1;
    27             ans+=d[i];
    28             ans+=2*(c[a[i]^1]-d[i]);
    29         }
    30         printf("%d%c",ans,i<n-1?' ':'
    ');
    31     }
    32     return 0;
    33 }
    View Code

    gym102012ARikka with Minimum Spanning Trees

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll unsigned long long
     4 const int N=200500,M=200500,P=1e9+7;
     5 int n,m,tot,f[N];ll k1,k2;
     6 struct E{ll u,v,w;}e[N];
     7 inline void add(ll u,ll v,ll w){e[tot++]=(E){u,v,w};}
     8 inline bool cmp(E a,E b){return a.w<b.w;}
     9 inline ll fnd(ll x){return f[x]==-1?x:f[x]=fnd(f[x]);}
    10 inline ll gt(){ll k3=k1,k4=k2;k1=k4;k3^=k3<<23;k2=k3^k4^(k3>>17)^(k4>>26);return k2+k4;}
    11 inline void gen()
    12 {
    13     scanf("%d%d%llu%llu",&n,&m,&k1,&k2);
    14     for(int i=1;i<=m;i++){ll u=gt()%n+1,v=gt()%n+1,w=gt();add(u,v,w);add(v,u,w);}
    15 }
    16 ll sol()
    17 {
    18     memset(f,-1,sizeof(f));sort(e,e+tot,cmp);ll cnt=0,ans=0;
    19     for(int i=0;i<tot;i++)
    20     {
    21         ll u=e[i].u,v=e[i].v,w=e[i].w,f1=fnd(u),f2=fnd(v);
    22         if(f1!=f2){ans=(ans+w)%P;f[f1]=f2;cnt++;}
    23         if(cnt==n-1)break;
    24     }
    25     if(cnt<n-1)return 0;else return ans%P;
    26 }
    27 int main()
    28 {
    29     int T;scanf("%d",&T);
    30     while(T--){tot=0;gen();ll ans=sol();printf("%lld
    ",ans);}
    31     return 0;
    32 }
    View Code

    gym102012BRikka with Line Graphs

    咕咕咕

    gym102012CRikka with Consistency

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define db double
     4 const int N=55;
     5 int n,a[N],vis[N][N][N];db b[N][N],d[N][N][N];
     6 struct D{double d;int x,y,z;};
     7 bool operator<(D a,D b){return a.d>b.d;}
     8 priority_queue<D>Q;
     9 inline void upd(int x,int y,int z,db w){if(d[x][y][z]>w)d[x][y][z]=w;Q.push((D){w,x,y,z});}
    10 int main()
    11 {
    12     int T;scanf("%d",&T);
    13     for(int i=0;i<=50;i++)for(int j=0;j<=50;j++)if(i!=j)b[i][j]=sqrt((i-j)*(i-j)+1)/abs(i-j);
    14     while(T--)
    15     {
    16         scanf("%d",&n);
    17         for(int i=0;i<=n;i++)scanf("%d",&a[i]);
    18         for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)for(int k=0;k<=50;k++)d[i][j][k]=1e9,vis[i][j][k]=0;
    19         d[0][n][0]=0;Q.push((D){0,0,n,0});
    20         while(!Q.empty())
    21         {
    22             int x=Q.top().x,y=Q.top().y,z=Q.top().z;Q.pop();
    23             if(vis[x][y][z])continue;vis[x][y][z]=1;
    24             if(x&&a[x]==z)upd(x-1,y,z,d[x][y][z]+(a[x-1]==a[x]));
    25             if(x<n&&a[x+1]==z)upd(x+1,y,z,d[x][y][z]+(a[x+1]==a[x]));
    26             if(y&&a[y]==z)upd(x,y-1,z,d[x][y][z]+(a[y-1]==a[y]));
    27             if(y<n&&a[y+1]==z)upd(x,y+1,z,d[x][y][z]+(a[y+1]==a[y]));
    28             if(x<n&&y<n)
    29             {
    30                 if(min(a[x+1],a[x])<=z-1&&max(a[x+1],a[x])>=z-1&&min(a[y+1],a[y])<=z-1&&max(a[y+1],a[y])>=z-1)upd(x,y,z-1,d[x][y][z]+b[a[x+1]][a[x]]+b[a[y+1]][a[y]]);
    31                 if(min(a[x+1],a[x])<=z+1&&max(a[x+1],a[x])>=z+1&&min(a[y+1],a[y])<=z+1&&max(a[y+1],a[y])>=z+1)upd(x,y,z+1,d[x][y][z]+b[a[x+1]][a[x]]+b[a[y+1]][a[y]]);
    32             }
    33         }
    34         printf("%.10lf
    ",d[n][0][0]);
    35     }
    36     return 0;
    37 }
    View Code

    gym102012DRikka with Subsequences

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=250,P=1e9+7;
     4 int n,a[N],f[N][N],s[N][N];char c[N][N];
     5 int main()
     6 {
     7     int T;scanf("%d",&T);
     8     while(T--)
     9     {
    10         scanf("%d",&n);
    11         for(int i=0;i<n;i++)scanf("%d",&a[i]),a[i]--;
    12         for(int i=0;i<n;i++)scanf("%s",c[i]);
    13         for(int i=0;i<n;i++)for(int j=0;j<n;j++)f[i][j]=0;
    14         int ans=0;
    15         for(int i=0;i<n;i++)
    16         {
    17             for(int j=0;j<n;j++)for(int k=0;k<n;k++)
    18             {
    19                 s[j+1][k+1]=c[a[j]][a[i]]=='1'?f[j][k]:0;
    20                 s[j+1][k+1]=(s[j+1][k+1]+s[j+1][k])%P;
    21                 s[j+1][k+1]=(s[j+1][k+1]+s[j][k+1])%P;
    22                 s[j+1][k+1]=(s[j+1][k+1]+P-s[j][k])%P;
    23             }
    24             for(int j=0;j<n;j++)for(int k=0;k<n;k++)if(a[i]==a[j]&&a[i]==a[k]){ans=(ans+s[j][k]+1)%P;f[j][k]=(f[j][k]+s[j][k]+1)%P;}
    25         }
    26         printf("%d
    ",ans);
    27     }
    28     return 0;
    29 } 
    View Code

    gym102012ERikka with Data Structures

    咕咕咕

    gym102012FRikka with Nice Counting Striking Back

    咕咕咕

    gym102012GRikka with Intersections of Paths

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=400005,P=1e9+7;
     4 int n,m,k,ans,fac[N],ifac[N],fa[N][22],dep[N],f1[N],f2[N];
     5 vector<int>g[N];
     6 inline int pw(int a,int b){int r=1;for(;b;b>>=1,a=1ll*a*a%P)if(b&1)r=1ll*r*a%P;return r;}
     7 inline int C(int a,int b){return a<b||a<0||b<0?0:1ll*fac[a]*ifac[b]%P*ifac[a-b]%P;}
     8 void dfs(int x,int p)
     9 {
    10     fa[x][0]=p;dep[x]=dep[p]+1;
    11     for(int i=0;i<g[x].size();i++)if(g[x][i]!=p){int y=g[x][i];dfs(y,x);}
    12 }
    13 void dfss(int x,int p)
    14 {
    15     for(int i=0;i<g[x].size();i++)if(g[x][i]!=p){int y=g[x][i];dfss(y,x);f1[x]+=f1[y];f2[x]+=f2[y];}
    16     if(x!=1)ans=(ans+P-C(f1[x],k))%P;ans=(ans+C(f2[x],k))%P;
    17 }
    18 inline int lca(int u,int v)
    19 {
    20     if(dep[u]<dep[v])swap(u,v);int sub=dep[u]-dep[v];
    21     for(int i=20;i>=0;i--)if(sub>>i&1)u=fa[u][i];
    22     if(u==v)return u;
    23     for(int i=20;i>=0;i--)if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];
    24     return fa[u][0];
    25 }
    26 int main()
    27 {
    28     for(int i=fac[0]=1;i<N;i++)fac[i]=1ll*fac[i-1]*i%P;
    29     ifac[N-1]=pw(fac[N-1],P-2);
    30     for(int i=N-1;i;i--)ifac[i-1]=1ll*ifac[i]*i%P;
    31     int T;scanf("%d",&T);
    32     while(T--)
    33     {
    34         scanf("%d%d%d",&n,&m,&k);ans=0;
    35         for(int i=1;i<=n;i++)g[i].clear();
    36         for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}
    37         dfs(1,0);for(int i=1;i<=n;i++)f1[i]=f2[i]=0;
    38         for(int i=1;i<=20;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
    39         for(int i=1;i<=m;i++)
    40         {
    41             int u,v;scanf("%d%d",&u,&v);int t=lca(u,v);
    42             f1[u]++;f1[v]++;f1[t]-=2;f2[u]++;f2[v]++;f2[t]--;f2[fa[t][0]]--;
    43         }
    44         dfss(1,0);printf("%d
    ",ans);
    45     }
    46     return 0;
    47 }
    View Code

    gym102012HRikka with A Long Colour Palette

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define X first
     4 #define Y second
     5 const int N=300005;
     6 int n,m,ans[N];
     7 pair<pair<int,int>,int>a[N];
     8 int main()
     9 {
    10     int T;scanf("%d",&T);
    11     while(T--)
    12     {
    13         scanf("%d%d",&n,&m);int len=0,nw=0;
    14         for(int i=0;i<n;i++)scanf("%d%d",&a[i].X.X,&a[i].X.Y),a[i].Y=i;
    15         if(n<m)
    16         {
    17             printf("%d
    ",0);
    18             for(int i=0;i<n;i++)printf("%d%c",1,i==n-1?'
    ':' ');
    19             continue;
    20         }
    21         sort(a,a+n);priority_queue<pair<int,int> >q;
    22         for(int i=0;i<m;i++)q.push(make_pair(0,i));
    23         for(int i=0;i<n;i++)
    24         {
    25             int l=a[i].X.X;pair<int,int>p=q.top();q.pop();
    26             len+=max(min(l,-p.X)-nw,0);nw=l;
    27             p.X=-max(-p.X,a[i].X.Y);ans[a[i].Y]=p.Y;q.push(p);
    28         }
    29         len+=max(-q.top().X-nw,0);printf("%d
    ",len);
    30         for(int i=0;i<n;i++)printf("%d%c",ans[i]+1,i==n-1?'
    ':' ');
    31     }
    32     return 0;
    33 }
    View Code

    gym102012IRikka with Sorting Networks

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=55;
     4 int n,m,p,ans,a[N],u[N],v[N];
     5 void dfs(int x,int t)
     6 {
     7     if(x==0){ans+=t;return;}
     8     if(a[u[x]]<a[v[x]]){dfs(x-1,t);swap(a[u[x]],a[v[x]]);dfs(x-1,t);swap(a[u[x]],a[v[x]]);}
     9 }
    10 int main()
    11 {
    12     int T;scanf("%d",&T);
    13     while(T--)
    14     {
    15         scanf("%d%d%d",&n,&m,&p);ans=0;
    16         for(int i=1;i<=m;i++)scanf("%d%d",&u[i],&v[i]),u[i]--,v[i]--;
    17         for(int i=0;i<n;i++)a[i]=i;dfs(m,1);
    18         for(int i=0;i<n-1;i++){swap(a[i],a[i+1]);dfs(m,-1);swap(a[i],a[i+1]);}
    19         for(int t=0;t<n;t++)for(int i=0;i<n;i++)if(i!=t)
    20         {
    21             int c=0;
    22             for(int j=0;j<n;j++)if(j==i)a[j]=t;else{if(c==t)c++;a[j]=c++;}
    23             dfs(m,1);
    24         }
    25         printf("%d
    ",ans);
    26     }
    27     return 0;
    28 }
    View Code

    gym102012JRikka with An Unnamed Temple

    咕咕咕

    gym102012KRikka with Ants

    咕咕咕

    gym102012LRikka with Grid Graphs 

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 int main()
     5 {
     6     int T,n,m;scanf("%d",&T);
     7     while(T--)
     8     {
     9         cin>>n>>m;vector<string>mp(2*n-1);getline(cin,mp[0]);
    10         for(int i=0;i<2*n-1;i++){getline(cin,mp[i]);while((int)mp[i].size()<2*m-1)mp[i]+=' ';}
    11         unordered_map<ll,ll>dp[2];
    12         int p=0,q=1;dp[p][0]=1;
    13         for(int x=0;x<n;x++)for(int y=0;y<m;y++)
    14         {
    15             swap(p,q);dp[p].clear();
    16             int cu=(x>0&&mp[2*x-1][2*y]=='|'),cl=(y>0&&mp[2*x][2*y-1]=='-');
    17             for(unordered_map<ll,ll>::iterator it=dp[q].begin();it!=dp[q].end();it++)
    18             {
    19                 ll st1=it->first;vector<int>g(m);
    20                 for(int i=0,k=0;i<m;i++)for(int j=0;j<m;j++,k++)g[i]|=(st1>>k&1)<<j;
    21                 for(int u=0;u<=cu;u++)for(int l=0;l<=cl;l++)
    22                 {
    23                     vector<int>h=g;h.push_back(0);
    24                     h[m]|=u<<y,h[y]|=(cu-u)<<m;
    25                     if(y)h[m]|=l<<(y-1),h[y-1]|=(cl-l)<<m;
    26                     for(int k=0;k<=m;k++)for(int i=0;i<=m;i++)if(h[i]>>k&1)h[i]|=h[k];
    27                     bool ff=1;for(int i=0;i<=m;i++)ff&=h[i]>>i&1^1;
    28                     if(!ff)continue;ll st2=0;
    29                     for(int i=0,k=0;i<m;i++)for(int j=0;j<m;j++,k++)st2|=(ll)(h[(i==y?m:i)]>>(j==y?m:j)&1)<<k;
    30                     dp[p][st2]+=it->second;
    31                 }
    32             }
    33         }
    34         ll res=0;for(unordered_map<ll,ll>::iterator it=dp[p].begin();it!=dp[p].end();it++)res+=it->second;printf("%lld
    ",res);
    35     }
    36     return 0;
    37 }
    View Code

    gym102012MRikka with Illuminations 

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=2010;
     5 int T,n,m,L,R,ans,t[N],f[N],po[N],res[N];
     6 struct P
     7 {
     8     ll x,y;int i;
     9     bool operator<(const P &b)const{return x*b.y-y*b.x>0;}
    10     P operator-(const P &b)const{return (P){x-b.x,y-b.y,i};}
    11 }ps,p[N],s[N];
    12 int main()
    13 {
    14     scanf("%d",&T);
    15     while(T--)
    16     {
    17         int n,m;scanf("%d%d",&n,&m);ans=m+1;
    18         memset(f,0,sizeof(f));memset(t,0,sizeof(t));
    19         for(int i=1;i<=n;i++)scanf("%lld%lld",&s[i].x,&s[i].y),s[i].i=i;
    20         for(int i=1;i<=m;i++)
    21         {
    22             ll x,y;scanf("%lld%lld",&x,&y);ps=(P){x,y,0};
    23             for(int j=1;j<=n;j++)p[j]=s[j]-ps;
    24             sort(p+1,p+n+1);L=p[n].i;R=p[1].i-1;
    25             if(R<L)R+=n;if(R>f[L])f[L]=R,t[L]=i;
    26             if(R<=n&&n+R>f[n+L])f[n+L]=n+R,t[n+L]=i;
    27         }
    28         for(int i=1;i<=2*n;i++)if(f[i-1]>f[i])f[i]=f[i-1],t[i]=t[i-1];
    29         for(int i=1;i<=n;i++)
    30         {
    31             int ff=0,cc=0;
    32             for(int j=i;j<n+i;j=f[j]+1)if(f[j]+1<=j){ff=1;break;}else po[++cc]=t[j];
    33             if(!ff&&cc<ans){ans=cc;for(int j=1;j<=cc;j++)res[j]=po[j];}
    34         }
    35         if(ans==m+1)ans=-1;printf("%d
    ",ans);
    36         if(ans>0){for(int i=1;i<ans;i++)printf("%d ",res[i]);printf("%d
    ",res[ans]);}
    37     }
    38     return 0;
    39 }
    View Code

    gym101955ASockpuppets

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=100005,P=1e9+7;
     4 int n,m,tot=0,f[N][12][22],g[N][12][22];char c[N];
     5 struct st
     6 {
     7     int ch[26],o;
     8     void init(){o=0;memset(ch,0,sizeof(ch));} 
     9 }p[N];
    10 inline void init(){tot=1;p[1].init();}
    11 void ins(char*s,int o)
    12 {
    13     int l=strlen(s+1),x=1;
    14     for(int i=1,c;i<=l;x=p[x].ch[c],i++)if(!p[x].ch[c=s[i]-'a'])p[p[x].ch[c]=++tot].init();
    15     p[x].o=o;
    16 }
    17 void dfs(int x)
    18 {
    19     for(int i=0;i<=10;i++)for(int j=0;j<=20;j++)f[x][i][j]=g[x][i][j]=0;
    20     f[x][0][0]=1;
    21     for(int i=0;i<26;i++)
    22     {
    23         int v=p[x].ch[i];if(!v)continue;dfs(v);
    24         for(int j=10;~j;j--)for(int k=20;~k;k--)if(f[x][j][k])for(int l=0;l<=10-j;l++)for(int t=0;t<=20-k;t++)g[x][j+l][k+t]=(g[x][j+l][k+t]+1ll*f[x][j][k]*f[v][l][t])%P;
    25         for(int j=0;j<=10;j++)for(int k=0;k<=20;k++)f[x][j][k]=g[x][j][k],g[x][j][k]=0;
    26     }
    27     if(!p[x].o)return;
    28     for(int i=0;i<=10;i++)for(int j=0;j<=20;j++)if(f[x][i][j])
    29     {
    30         if(p[x].o==1)
    31         {
    32             if(i+1<=10)g[x][i+1][j]=(g[x][i+1][j]+f[x][i][j])%P;
    33             if(j-1>=0)g[x][i][j-1]=(g[x][i][j-1]+1ll*f[x][i][j]*j)%P;
    34             if(i+2<=10)g[x][i+2][j]=(g[x][i+2][j]+1ll*f[x][i][j]*(P+1)/2)%P;
    35             if(j-2>=0)g[x][i][j-2]=(g[x][i][j-2]+1ll*f[x][i][j]*j*(j-1)/2)%P;
    36             if(i+1<=10&&j-1>=0)g[x][i+1][j-1]=(g[x][i+1][j-1]+1ll*f[x][i][j]*j)%P;
    37         }
    38         else
    39         {
    40             if(i-1>=0)g[x][i-1][j]=(g[x][i-1][j]+1ll*f[x][i][j]*i)%P;
    41             if(j+1<=20)g[x][i][j+1]=(g[x][i][j+1]+f[x][i][j])%P;
    42         }
    43     }
    44     for(int i=0;i<=10;i++)for(int j=0;j<=20;j++)f[x][i][j]=(f[x][i][j]+g[x][i][j])%P;
    45 }
    46 int main()
    47 {
    48     int T,Cs=0;scanf("%d",&T);
    49     while(T--)
    50     {
    51         init();scanf("%d%d",&n,&m);
    52         for(int i=1;i<=n;i++)scanf("%s",c+1),ins(c,1);
    53         for(int i=1;i<=m;i++)scanf("%s",c+1),ins(c,2);
    54         dfs(1);printf("Case #%d: %d
    ",++Cs,f[1][0][0]);
    55     }
    56     return 0;
    57 }
    View Code

    gym101955BSequences Generator

    咕咕咕

    gym101955CInsertion Sort

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=55;
     5 ll fac[N];
     6 int main()
     7 {
     8     int T,Cs=0;scanf("%d",&T);
     9     while(T--)
    10     {
    11         ll n,k,q;scanf("%lld%lld%lld",&n,&k,&q);
    12         for(int i=fac[0]=1;i<N;i++)fac[i]=fac[i-1]*i%q;
    13         if(n<=k){printf("Case #%d: %lld
    ",++Cs,fac[n]);continue;}
    14         ll ans=((n-1)*(n-k)%q+1)%q*fac[k]%q;
    15         printf("Case #%d: %lld
    ",++Cs,ans);
    16     }
    17     return 0;
    18 }
    View Code

    gym101955DDiameter of a Tree

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=1000005;
     5 int n,m,S,tt,cc,cnt,res,rt,s1,s2,vis[N<<1],hd[N],sz[N],v[N];ll ans[N];double P[N],Q[N];
     6 struct E{int v,nxt,a,b;}e[N];
     7 inline void add(int u,int v,int a,int b){e[++tt]=(E){v,hd[u],a,b};hd[u]=tt;vis[tt]=0;e[++tt]=(E){u,hd[v],a,b};hd[v]=tt;vis[tt]=0;}
     8 struct G{int u,v,a,b;}g[N];
     9 struct st{ll k,b;}p[N],q[N],r[N*50];
    10 inline bool operator<(const st&a,const st&b){return a.k==b.k?a.b>b.b:a.k<b.k;}
    11 inline bool chk(st&a,st&b,st&c){return 1.0*(c.b-b.b)/(b.k-c.k)<=1.0*(b.b-a.b)/(a.k-b.k);}
    12 struct qq{ll w;int i;}W[N];
    13 inline bool cmp(qq a,qq b){return a.w<b.w;}
    14 void dfs(int x,int p)
    15 {
    16     for(int i=hd[x];i;i=e[i].nxt)if(e[i].v!=p)dfs(e[i].v,x);
    17     int t=0,lst=x;for(int i=hd[x];i;i=e[i].nxt)if(e[i].v!=p)v[++t]=i;
    18     if(!t)return;g[++cc]=(G){e[v[1]].v,x,e[v[1]].a,e[v[1]].b};
    19     for(int i=2;i<t;i++)g[++cc]=(G){lst,++n,0,0},g[++cc]=(G){e[v[i]].v,lst=n,e[v[i]].a,e[v[i]].b};
    20     if(t>1)g[++cc]=(G){e[v[t]].v,lst,e[v[t]].a,e[v[t]].b};
    21 }
    22 void gtrt(int x,int p){sz[x]=1;for(int i=hd[x],y,t;i;i=e[i].nxt)if((y=e[i].v)!=p&&!vis[i]){gtrt(y,x);sz[x]+=sz[y];if((t=max(sz[y],S-sz[y]))<res)res=t,rt=i;}}
    23 void gt(int x,int p,int t,st*s,int&tp,ll s1,ll s2){if(t)s[++tp]=(st){s1,s2};for(int i=hd[x],y;i;i=e[i].nxt)if((y=e[i].v)!=p&&!vis[i])gt(y,x,e[i].a+e[i].b,s,tp,s1+e[i].a,s2+e[i].b);}
    24 inline void build(st*s,int&tp,double*S,int f)
    25 {
    26     int t=0;sort(s+1,s+tp+1);
    27     for(int i=1;i<=tp;i++)if(i==1||s[i].k!=s[i-1].k){while(t>1&&chk(s[t-1],s[t],s[i]))t--;s[++t]=s[i];}
    28     tp=t;if(f)for(int i=1;i<=tp;i++)if(i<tp)S[i]=1.0*(s[i].b-s[i+1].b)/(s[i+1].k-s[i].k);
    29 }
    30 void sol(int x)
    31 {
    32     if(sz[x]==1)return;S=sz[x];res=1<<30;gtrt(x,0);
    33     int A=e[rt].v,B=e[rt^1].v;vis[rt]=vis[rt^1]=1;s1=s2=0;
    34     if(sz[A]>sz[B])sz[A]=S-sz[B];else sz[B]=S-sz[A];
    35     gt(A,B,1,p,s1,e[rt].a,e[rt].b);gt(B,A,1,q,s2,0,0);build(p,s1,P,1);build(q,s2,Q,1);
    36     for(int i=1,j=1;i<=s1;i++)
    37     {
    38         while(true)
    39         {
    40             r[++cnt]=(st){p[i].k+q[j].k,p[i].b+q[j].b};
    41             if(j==s2||(i<s1&&P[i]<Q[j]))break;j++;
    42         }
    43     }
    44     sol(A);sol(B);
    45 }
    46 int main()
    47 {
    48     int T,Cs=0;scanf("%d",&T);
    49     while(T--)
    50     {
    51         scanf("%d%d",&n,&m);tt=0;cc=0;cnt=0;
    52         for(int i=1,u,v,w;i<n;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,1,w);
    53         dfs(1,0);tt=1;for(int i=1;i<=n;i++)hd[i]=0;
    54         for(int i=1;i<=cc;i++)add(g[i].u,g[i].v,g[i].a,g[i].b);
    55         sz[1]=n;sol(1);build(r,cnt,P,0);
    56         for(int i=1;i<=n;i++)hd[i]=0;
    57         for(int i=1;i<=m;i++)scanf("%lld",&W[i].w),W[i].i=i;
    58         sort(W+1,W+m+1,cmp);
    59         for(int i=1,j=1;i<=m;i++)
    60         {
    61             while(j<cnt&&r[j].k*W[i].w+r[j].b<r[j+1].k*W[i].w+r[j+1].b)j++;
    62             ans[W[i].i]=r[j].k*W[i].w+r[j].b;
    63         }
    64         printf("Case #%d:
    ",++Cs);
    65         for(int i=1;i<=m;i++)printf("%lld
    ",ans[i]);
    66     }
    67     return 0;
    68 }
    View Code

    gym101955EThe Kouga Ninja Scrolls

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=100005;
     5 const ll inf=1ll<<50;
     6 int n,m,ac[N];ll ax[N],ay[N];
     7 struct st
     8 {
     9     ll f,s,c;
    10     inline ll operator+(const st&b){return c==b.c?max(f+b.s,s+b.f):f+b.f;}
    11     inline st operator*(const st&b){return (c==b.c)?(st){max(f,b.f),max(s,b.s),c}:(f<b.f?(st){b.f,max(f,b.s),b.c}:(st){f,max(s,b.f),c});} 
    12     inline void stv(ll x,int w){f=x;s=-inf;c=w;}
    13 };
    14 struct D
    15 {
    16     st a[4];
    17     inline D operator+(const D&b){D r;for(int i=0;i<4;i++)r.a[i]=a[i]*b.a[i];return r;}
    18     inline void stv(int l){for(int i=0;i<4;i++)a[i].stv(ax[l]*(i&1?1:-1)+ay[l]*(i&2?1:-1),ac[l]);}
    19     inline ll calc(){ll r=0;for(int i=0;i<4;i++)r=max(r,a[i]+a[3^i]);return r;}
    20 };
    21 struct tr{int l,r,m;D s;}T[N<<2];
    22 inline void up(int x){T[x].s=T[x<<1].s+T[x<<1|1].s;}
    23 void build(int x,int l,int r)
    24 {
    25     T[x].l=l;T[x].r=r;T[x].m=l+r>>1;if(l==r){T[x].s.stv(l);return;}
    26     build(x<<1,l,T[x].m);build(x<<1|1,T[x].m+1,r);up(x);
    27 }
    28 void upd(int x,int p){if(T[x].l==T[x].r){T[x].s.stv(T[x].l);return;}p<=T[x].m?upd(x<<1,p):upd(x<<1|1,p);up(x);}
    29 D qry(int x,int l,int r)
    30 {
    31     if(l<=T[x].l&&T[x].r<=r)return T[x].s;
    32     if(l>T[x].m)return qry(x<<1|1,l,r);
    33     if(r<=T[x].m)return qry(x<<1,l,r);
    34     return qry(x<<1,l,r)+qry(x<<1|1,l,r);
    35 }
    36 int main()
    37 {
    38     int T,Cs=0;scanf("%d",&T);
    39     while(T--)
    40     {
    41         printf("Case #%d:
    ",++Cs);scanf("%d%d",&n,&m);
    42         for(int i=1;i<=n;i++)scanf("%lld%lld%d",&ax[i],&ay[i],&ac[i]);
    43         build(1,1,n);
    44         while(m--)
    45         {
    46             int o,k,x,y;scanf("%d%d%d",&o,&k,&x);
    47             if(o==1)scanf("%d",&y),ax[k]+=x,ay[k]+=y;
    48             if(o==2)ac[k]=x;
    49             if(o==3)printf("%lld
    ",max(0ll,qry(1,k,x).calc()));
    50             else upd(1,k);
    51         }
    52     }
    53     return 0;
    54 }
    View Code

    gym101955FCounting Sheep in Ami Dongsuo

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=10005,M=1205,P=1e9+7; 
     4 int inv[M],ifac[M],n,m,w,to[N*3],nxt[N*3],hd[N],d[N],Q[N],pw[M][M],f[N][3][M],tot[M],tmp[M],ans[M];
     5 int main()
     6 {
     7     inv[1]=ifac[0]=1;
     8     for(int i=2;i<M;i++)inv[i]=1ll*inv[P%i]*(P-P/i)%P;
     9     for(int i=1;i<M;i++)ifac[i]=1ll*ifac[i-1]*inv[i]%P;
    10     for(int i=1;i<M;i++)for(int j=pw[i][0]=1;j<M;j++)pw[i][j]=1ll*pw[i][j-1]*i%P;
    11     int T,Cs=0;scanf("%d",&T);
    12     while(T--)
    13     {
    14         scanf("%d%d%d",&n,&m,&w);w*=3;
    15         for(int i=1;i<=n;i++)
    16         {
    17             int v;scanf("%d",&v);hd[i]=d[i]=0;
    18             for(int j=0;j<3;j++)for(int k=1;k<=w;k++)f[i][j][k]=pw[k][v*(j+1)];
    19         }
    20         for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);to[i]=v;nxt[i]=hd[u];hd[u]=i;d[v]++;}
    21         int L=0,R=0;for(int i=1;i<=n;i++)if(!d[i])Q[++R]=i;
    22         while(L<R)for(int x=Q[++L],i=hd[x];i;i=nxt[i])if(!--d[to[i]])Q[++R]=to[i];
    23         memset(tot,0,sizeof(tot));
    24         for(int i=n;i;i--)
    25         {
    26             int x=Q[i];
    27             for(int t=hd[x];t;t=nxt[t])
    28             {
    29                 int y=to[t];
    30                 for(int j=0;j<3;j++)for(int k=0;k<=w;k++)f[x][j][k]=(f[x][j][k]+f[y][j][k])%P;
    31             }
    32             for(int j=0;j<=w;j++)
    33             {
    34                 int res=1ll*f[x][0][j]*f[x][0][j]%P*f[x][0][j]%P;
    35                 res=(res-3ll*f[x][0][j]*f[x][1][j]%P+P)%P;
    36                 res=(res+2ll*f[x][2][j])%P;tot[j]=(tot[j]+res)%P;
    37             }
    38         }
    39         for(int i=1;i<=w;i++)tot[i]=1ll*tot[i]*inv[6]%P;
    40         memset(tmp,0,sizeof(tmp));memset(ans,0,sizeof(ans));tmp[1]=1;
    41         for(int i=1;i<=w;i++)for(int j=i+1;j;j--)tmp[j]=(1ll*tmp[j]*(P-i)+tmp[j-1])%P;
    42         for(int i=1;i<=w;i++)
    43         {
    44             for(int j=1;j<=w;j++)tmp[j]=1ll*(tmp[j]-tmp[j-1]+P)*(P-inv[i])%P;
    45             int c=1ll*tot[i]*ifac[i]%P*ifac[w-i]%P*(w-i&1?P-1:1)%P;
    46             for(int j=1;j<=w;j++)ans[j]=(ans[j]+1ll*tmp[j]*c)%P;
    47             for(int j=w;j;j--)tmp[j]=(1ll*tmp[j]*(P-i)+tmp[j-1])%P;
    48         }
    49         printf("Case #%d:",++Cs);
    50         for(int i=1;i<=w;i++)printf(" %d",ans[i]);puts("");
    51     }
    52     return 0;
    53 }
    View Code

    gym101955GBest ACMer Solves the Hardest Problem

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=13000005,M=6005;
     4 int n,m,px[200005],py[200005],w[M][M];
     5 vector<pair<int,int> >g[N];
     6 inline void chk(int x,int y,int v){if(x>=1&&x<=6000&&y>=1&&y<=6000&&w[x][y])w[x][y]+=v;}
     7 inline void qry(int x,int y,ll&v){if(x>=1&&x<=6000&&y>=1&&y<=6000&&w[x][y])v+=w[x][y];}
     8 int main()
     9 {
    10     for(int i=0;i<=6000;i++)for(int j=0;j<=6000;j++)if(i*i+j*j<=10000000)g[i*i+j*j].push_back(make_pair(i,j));else break;
    11     int T,Cs=0;scanf("%d",&T);
    12     while(T--)
    13     {
    14         printf("Case #%d:
    ",++Cs);
    15         scanf("%d%d",&n,&m);ll ans=0;
    16         for(int i=1;i<=n;i++)scanf("%d%d",&px[i],&py[i]),scanf("%d",&w[px[i]][py[i]]);
    17         while(m--)
    18         {
    19             int o,x,y;scanf("%d%d%d",&o,&x,&y);
    20             x=(x+ans)%6000+1;y=(y+ans)%6000+1;
    21             if(o==1){scanf("%d",&w[x][y]);n++;px[n]=x;py[n]=y;}
    22             else if(o==2)w[x][y]=0;
    23             else if(o==3)
    24             {
    25                 int d,v;scanf("%d%d",&d,&v);
    26                 for(int i=0;i<g[d].size();i++)
    27                 {
    28                     int dx=g[d][i].first,dy=g[d][i].second;
    29                     if(!dx&&!dy)chk(x,y,v);
    30                     else if(!dx)chk(x,y+dy,v),chk(x,y-dy,v);
    31                     else if(!dy)chk(x+dx,y,v),chk(x-dx,y,v);
    32                     else chk(x+dx,y+dy,v),chk(x+dx,y-dy,v),chk(x-dx,y+dy,v),chk(x-dx,y-dy,v);
    33                 }
    34             }
    35             else
    36             {
    37                 int d;scanf("%d",&d);ans=0;
    38                 for(int i=0;i<g[d].size();i++)
    39                 {
    40                     int dx=g[d][i].first,dy=g[d][i].second;
    41                     if(!dx&&!dy)qry(x,y,ans);
    42                     else if(!dx)qry(x,y+dy,ans),qry(x,y-dy,ans);
    43                     else if(!dy)qry(x+dx,y,ans),qry(x-dx,y,ans);
    44                     else qry(x+dx,y+dy,ans),qry(x+dx,y-dy,ans),qry(x-dx,y+dy,ans),qry(x-dx,y-dy,ans);
    45                 }
    46                 printf("%lld
    ",ans); 
    47             }
    48         }
    49         for(int i=1;i<=n;i++)w[px[i]][py[i]]=0;
    50     }
    51     return 0;
    52 }
    View Code

    gym101955HRainbow Graph

    咕咕咕

    gym101955IDistance Between Sweethearts

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=2049;
     5 int mx,sz,p=0,q=1,A[3],B[3],f[3][N][N];ll g[2][N];
     6 inline void fwt(int n,int*a,int f){int w=f==1?0:1;for(int t=1;t<n;t<<=1)for(int i=0;i<n;i+=(t<<1))for(int j=0;j<t;j++){int u=a[i+j],v=a[i+j+t];a[i+j]=(u+v)>>w;a[i+j+t]=(u-v)>>w;}}
     7 inline void fwt(int n,ll*a,int f){int w=f==1?0:1;for(int t=1;t<n;t<<=1)for(int i=0;i<n;i+=(t<<1))for(int j=0;j<t;j++){ll u=a[i+j],v=a[i+j+t];a[i+j]=(u+v)>>w;a[i+j+t]=(u-v)>>w;}}
     8 int main()
     9 {
    10     int T,Cs=0;scanf("%d",&T);
    11     while(T--)
    12     {
    13         mx=0;sz=1;memset(f,0,sizeof(f));memset(g[p],0,sizeof(g[0]));
    14         for(int i=0;i<3;i++)scanf("%d",&A[i]);
    15         for(int i=0;i<3;i++)scanf("%d",&B[i]);
    16         for(int i=0;i<3;i++)
    17         {
    18             mx=max(mx,max(A[i],B[i]));for(;sz<=mx;sz<<=1);
    19             for(int x=0;x<=A[i];x++)for(int y=0;y<=B[i];y++)f[i][abs(x-y)][x^y]++;
    20         } 
    21         ll ans=0;
    22         for(int i=0;i<=mx;i++)
    23         {
    24             for(int j=0;j<3;j++)
    25             {
    26                 fwt(sz,f[j][i],1);
    27                 if(i)for(int k=0;k<sz;k++)f[j][i][k]+=f[j][i-1][k];
    28             }
    29             swap(p,q);
    30             for(int j=0;j<sz;j++)g[p][j]=1ll*f[0][i][j]*f[1][i][j]*f[2][i][j];
    31             fwt(sz,g[p],-1);ll res=0;
    32             for(int j=sz-1;j>0;j--){int k=i^j;res+=g[p][k]-g[q][k];ans+=res;}
    33         }
    34         printf("Case #%d: %llu
    ",++Cs,ans);
    35     }
    36     return 0;
    37 }
    View Code

    gym101955JHow Much Memory Your Code Is Using?

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int T,Cs=0;scanf("%d",&T);
     6     while(T--)
     7     {
     8         int n,ans=0,c;cin>>n;string s;getline(cin,s);
     9         for(int i=0;i<n;i++)
    10         {
    11             string s;int t;getline(cin,s);string str=s;
    12             if(s[0]=='b'||s[0]=='c')t=1;
    13             else if(s[0]=='i'||s[0]=='f')t=4;
    14             else if(s[0]=='d')t=8;else if(s[0]=='_')t=16;
    15             else if(s[0]=='l'){if(s[5]=='l')t=8;else if(s[5]=='d')t=16;}
    16             int p1=str.find("[");c=0;
    17             if(p1!=-1){int p2=str.find("]");for(int i=p1+1;i<p2;i++)c=c*10+s[i]-'0';}
    18             if(c)t*=c;ans+=t;
    19         }
    20         ans=ans/1024+(ans%1024>0);
    21         cout<<"Case #"<<++Cs<<": "<<ans<<endl;
    22     }
    23     return 0;
    24 }
    View Code

    gym101955KLet the Flames Begin

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 int main()
     5 {
     6     int T,Cs=0;ll n,m,k;scanf("%d",&T);
     7     while(T--)
     8     {
     9         scanf("%lld%lld%lld",&n,&m,&k);
    10         if(k==1)printf("Case #%d: %lld
    ",++Cs,m);
    11         else
    12         {
    13             ll c=n-m+1,res=(k-1)%c;
    14             while(c<n){ll d=min(max((c-res)/(k-1),1ll),n-c);c+=d;res=(res+d*K)%c;} 
    15             printf("Case #%d: %lld
    ",++Cs,res+1);
    16         }
    17     }
    18     return 0;
    19 }
    View Code

    gym101955LMachining Disc Rotors

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=205;
     4 const double eps=1e-9,pi=acos(-1.0);
     5 double ans,X[N],Y[N],L[N],R[N],a[N];
     6 inline int sgn(double x){return x>eps?1:(x<-eps?-1:0);}
     7 int main()
     8 {
     9     int T,Cs=0,n,cc,Ra;scanf("%d",&T);
    10     while(T--)
    11     {
    12         scanf("%d%d",&n,&Ra);cc=0;ans=0;
    13         for(int i=1;i<=n;i++)
    14         {
    15             int x,y,r;scanf("%d%d%d",&x,&y,&r);int t=x*x+y*y;
    16             if(t>=(r+Ra)*(r+Ra)||(Ra>r&&t<=(Ra-r)*(Ra-r)))continue;
    17             double a1=atan2(y,x),a2=acos((Ra*Ra+t-r*r)/(2*Ra*sqrt(t)));
    18             X[++cc]=Ra*cos(a1-a2);Y[cc]=Ra*sin(a1-a2);L[cc]=a1-a2;R[cc]=a1+a2;a[cc]=a1-a2;
    19             X[++cc]=Ra*cos(a1+a2);Y[cc]=Ra*sin(a1+a2);a[cc]=a1+a2;
    20         }
    21         for(int i=1,j;i<=cc;i++)
    22         {
    23             for(j=1;j<=cc;j+=2)if((sgn(L[j]-a[i]-pi)<0&&sgn(R[j]-a[i]-pi)>0)||(sgn(L[j]-a[i]+pi)<0&&sgn(R[j]-a[i]+pi)>0))break;
    24             if(j>cc)ans=Ra*2;
    25         }
    26         for(int i=1;i<=cc;i++)for(int j=i+1;j<=cc;j++)ans=max(ans,sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j])));
    27         printf("Case #%d: %.10f
    ",++Cs,ans);
    28     }
    29     return 0;
    30 }
    View Code

    gym101955MRenaissance Past in Nancy

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=10005,M=1005,P=1e9+7;
     4 int n,m,ans,f[N][M],g[N][M];
     5 inline void ins(int*f,int x){for(int i=M-1;i>=x;i--)f[i]=(f[i]-f[i-x]+P)%P;}
     6 inline void del(int*f,int x){for(int i=x;i<M;i++)f[i]=(f[i]+f[i-x])%P;}
     7 int main()
     8 {
     9     int T,Cs=0;scanf("%d",&T);
    10     while(T--)
    11     {
    12         printf("Case #%d:
    ",++Cs);scanf("%d%d",&n,&m);ans=0;
    13         memset(f[0],0,sizeof(f[0]));f[0][0]=1;
    14         memset(g[0],0,sizeof(g[0]));g[0][0]=1;
    15         for(int i=1;i<=n;i++)
    16         {
    17             int a,b;scanf("%d%d",&a,&b);a++;
    18             memcpy(f[i],f[i-1],sizeof(f[i]));
    19             memcpy(g[i],g[i-1],sizeof(g[i]));
    20             del(f[i],b);ins(g[i],b);
    21             if(a*b<M)ins(f[i],a*b),del(g[i],a*b);
    22         }
    23         for(int i=1;i<=n;i++)for(int j=1;j<M;j++)f[i][j]=(f[i][j]+f[i][j-1])%P;
    24         while(m--)
    25         {
    26             int l,r,c;scanf("%d%d%d",&l,&r,&c);l=(l+ans)%n+1;r=(r+ans)%n+1;if(l>r)swap(l,r);l--;ans=0;
    27             for(int i=0;i<=c;i++)ans=(ans+1ll*f[r][i]*g[l][c-i])%P;printf("%d
    ",ans);
    28         }
    29     }
    30     return 0;
    31 }
    View Code 

    loj#507. 「LibreOJ NOI Round #1」接竹竿

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=1000005;
     5 ll n,k,a[N],s[N],f[N],g[N];
     6 int main()
     7 {
     8     scanf("%lld%lld",&n,&k);
     9     for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    10     for(int i=1;i<=n;i++)scanf("%lld",&s[i]),s[i]+=s[i-1];
    11     for(int i=n;i;i--)f[i]=max(f[i+1],g[a[i]]-s[i-1]),g[a[i]]=max(g[a[i]],s[i]+f[i+1]);
    12     printf("%lld
    ",f[1]);
    13     return 0;
    14 }
    View Code

    loj#508. 「LibreOJ NOI Round #1」失控的未来交通工具

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=1000005;
     5 int n,m,q,f[N],d[N],g[N];
     6 inline int rd()
     7 {
     8     int x=0;char c=getchar();while(!isdigit(c))c=getchar();
     9     while(isdigit(c))x=x*10+c-48,c=getchar();return x;
    10 }
    11 inline int fnd(int x){if(f[x]==x)return x;fnd(f[x]);d[x]=(d[x]+d[f[x]])%m;return f[x]=f[f[x]];}
    12 inline void exgcd(int a,int b,int&x,int&y){if(!b){x=1;y=0;}else {exgcd(b,a%b,y,x);y-=a/b*x;}}
    13 inline int inv(int a,int b){int x,y;exgcd(a,b,x,y);return (x%b+b)%b;}
    14 int main()
    15 {
    16     n=rd();m=rd();q=rd();
    17     for(int i=1;i<=n;i++)f[i]=i,g[i]=m;
    18     while(q--)
    19     {
    20         int o,u,v,x,y,z,w,t;o=rd();u=rd();v=rd();x=rd();
    21         if(o==1)
    22         {
    23             if((y=fnd(u))^(z=fnd(v)))d[z]=((d[u]+d[v])%m+x)%m,g[y]=__gcd(__gcd(g[y],g[z]),x*2),f[z]=y;
    24             else g[y]=__gcd(g[y],((d[u]+d[v])%m+x)%m);
    25         }
    26         else
    27         {
    28             y=rd();z=rd();if(fnd(u)!=fnd(v)){puts("0");continue;}
    29             w=g[fnd(u)];t=__gcd(w,y);x=((d[u]+d[v])%m+x)%m;if(x%t){puts("0");continue;}
    30             x/=t;y/=t;w/=t;printf("%d
    ",(int)((z-1ll*x*(w-inv(y%w,w))%w+w-1)/w));
    31         }
    32     }
    33     return 0;
    34 }
    View Code

    loj#509. 「LibreOJ NOI Round #1」动态几何问题

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=130000000;
     5 int cc,pr[10000005],g[N];char mu[N];short f[N];
     6 bitset<N>vis;
     7 inline ll sqr(ll n){return sqrt(n+0.5);}
     8 inline ll qry(ll n)
     9 {
    10     if(n<N&&g[n])return g[n];
    11     ll i=1,s=0;for(;i*i*i<=n;i++)s+=n/(i*i)*mu[i];
    12     while(i*i<=n){ll j=sqr(n/(n/(i*i)));s+=n/(i*i)*(f[j]-f[i-1]);i=j+1;}return s;
    13 }
    14 inline void init(int n)
    15 {
    16     mu[1]=f[1]=g[1]=1;
    17     for(int i=2;i<=n;i++)
    18     {
    19         if(!vis[i]){pr[cc++]=i;f[i]=-1;}
    20         for(int j=0;j<cc;j++)
    21         {
    22             int t=pr[j];if(i*t>n)break;
    23             vis[i*t]=1;if(i%t==0)break;
    24             f[i*t]=-f[i];
    25         }
    26         mu[i]=f[i];g[i]=g[i-1]+!!f[i];f[i]+=f[i-1];
    27     }
    28 }
    29 int main()
    30 {
    31     ll n,m,ans=0;scanf("%lld%lld",&n,&m);if(n>m)swap(n,m);init(sqr(n));
    32     for(ll i=1,j,s,t;i<=n;i=j+1,s=t){ll x=sqr(n/i),y=sqr(m/i);j=min(n/(x*x),m/(y*y));t=qry(j);ans+=x*y*(t-s);}
    33     printf("%lld
    ",ans);return 0;
    34 }
    View Code

     

     

     

     

  • 相关阅读:
    spring cloud stream定时器 配置rabbitmq插件安装
    字母、单词统计
    动手动脑
    原码补码反码
    ATM
    开学第一课
    周进度报告8
    周进度报告7
    JavaWeb进度报告1
    周进度报告6
  • 原文地址:https://www.cnblogs.com/alonefight/p/10927412.html
Copyright © 2020-2023  润新知