zoukankan      html  css  js  c++  java
  • Codeforces Round #548

    没打,简单补档

    C.Edgy Trees

    容斥,把黑边断掉数联通块,每个联通块贡献$siz^k$

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=200005,mod=1e9+7;
     6 int n,k,t1,t2,t3,tot,aset[N],siz[N];
     7 int Finda(int x)
     8 {
     9     return x==aset[x]?x:aset[x]=Finda(aset[x]);
    10 }
    11 int Qpow(int x,int k)
    12 {
    13     if(k<=1) return k?x:1;
    14     int tmp=Qpow(x,k>>1);
    15     return 1ll*tmp*tmp%mod*((k&1)?x:1)%mod;
    16 }
    17 int main()
    18 {
    19     scanf("%d%d",&n,&k);
    20     for(int i=1;i<=n;i++) aset[i]=i,siz[i]=1;
    21     for(int i=1;i<n;i++) 
    22     {
    23         scanf("%d%d%d",&t1,&t2,&t3);
    24         if(!t3)
    25         {
    26             int nx=Finda(t1),ny=Finda(t2);
    27             aset[nx]=ny,siz[ny]+=siz[nx];
    28         }
    29     }
    30     for(int i=1;i<=n;i++) 
    31         if(aset[i]==i) (tot+=Qpow(siz[i],k))%=mod;
    32     printf("%d",(Qpow(n,k)-tot+mod)%mod);
    33     return 0;
    34 }
    View Code

    D.Steps to One

    我写的辣鸡的$O(nlog nsqrt n)$(其实并不能跑满),太菜了

    设dp[i]表示当前为i的期望步数,暴力DP即枚举1->m从gcd转移,改为枚举gcd(指所有因子),然后莫比乌斯函数统计1->n中和某个数互质的数的个数

     1 #include<cstdio>
     2 #include<vector>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define vint vector<int>
     6 #define vit vector<int>::iterator
     7 using namespace std;
     8 const int N=100005,mod=1e9+7;
     9 int dp[N],pri[N],npr[N],mul[N]; 
    10 int n,t,in,cnt,ans; vint fac[N];
    11 void Add(int &x,int y)
    12 {
    13     x+=y;
    14     if(x>=mod) x-=mod;
    15 }
    16 int Qpow(int x,int k)
    17 {
    18     if(k<=1) return k?x:1;
    19     int tmp=Qpow(x,k>>1);
    20     return 1ll*tmp*tmp%mod*((k&1)?x:1)%mod;
    21 }
    22 void Pre()
    23 {
    24     in=Qpow(n,mod-2);
    25     for(int i=1;i<=n;i++)
    26         for(int j=2*i;j<=n;j+=i)
    27             fac[j].push_back(i);
    28     npr[1]=true,mul[1]=1;
    29     for(int i=2;i<=n;i++)
    30     {
    31         if(!npr[i]) pri[++cnt]=i,mul[i]=-1;
    32         for(int j=1;j<=cnt&&(t=i*pri[j])<=n;j++)
    33         {
    34             npr[t]=true;
    35             if(i%pri[j]==0) break;
    36             else mul[t]=-mul[i];
    37         }
    38     }
    39 }
    40 int Count(int x,int y)//Count:for i=1 to n,gcd(i,x)==y
    41 {
    42     int N=n/y,X=x/y,ret=0;
    43     for(int i=1;i*i<=X;i++)
    44         if(X%i==0)
    45         {
    46             ret+=N/i*mul[i];
    47             if(i*i!=X) ret+=N/(X/i)*mul[X/i];
    48         }
    49     return ret;
    50 }
    51 int main()
    52 {
    53     scanf("%d",&n),Pre(),dp[1]=1;  
    54     for(int i=2;i<=n;i++)
    55     {
    56         int tmp=n/i;
    57         for(vit it=fac[i].begin();it!=fac[i].end();it++)
    58             t=*it,Add(dp[i],1ll*dp[t]*Count(i,t)%mod*in%mod);
    59         dp[i]=1ll*(dp[i]+1)*Qpow(n-tmp,mod-2)%mod*n%mod;
    60     }
    61     for(int i=1;i<=n;i++) Add(ans,dp[i]);
    62     printf("%lld",1ll*ans*in%mod);
    63     return 0;
    64 }
    View Code

    呃,发现题解也不怎么快,他是用2^质因子个数容斥算的,$2^6*6$怕不是跟非常跑不满的根号差不多

    E.Maximize Mex

    显然答案单调不升,把每种潜力值和每个club看做左右部点,倒着加边,每次在上次的基础上继续二分图匹配到没有增广路为止

    注意潜力值是从零开始的,还有每次跑完记得更新dfn

     1 #include<cstdio>
     2 #include<vector>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define vint vector<int>
     6 #define vit vector<int>::iterator
     7 using namespace std;
     8 const int N=5005;
     9 int n,m,q,t1,t2,dfn; 
    10 int val[N],bel[N],lft[N];
    11 int del[N],vis[N],mth[N],ans[N]; vint ve[N];
    12 bool DFS(int nde)
    13 {
    14     int t;
    15     for(vit it=ve[nde].begin();it!=ve[nde].end();it++)
    16         if(vis[t=*it]!=dfn)
    17         {
    18             vis[t]=dfn;
    19             if(mth[t]==-1||DFS(mth[t])) 
    20                 {mth[t]=nde; return true;}
    21         }
    22     return false;
    23 }
    24 int main()
    25 {
    26     scanf("%d%d",&n,&m);  
    27     for(int i=1;i<=n;i++) scanf("%d",&val[i]);
    28     for(int i=1;i<=n;i++) scanf("%d",&bel[i]);
    29     for(int i=1;i<=m;i++) mth[i]=-1; dfn=1;
    30     scanf("%d",&q);
    31     for(int i=1;i<=q;i++) 
    32         scanf("%d",&lft[i]),del[lft[i]]=true;
    33     for(int i=1;i<=n;i++) 
    34         if(!del[i]) ve[val[i]].push_back(bel[i]); 
    35     for(int i=q,mex=-1;i;i--)
    36     {
    37         while(DFS(mex+1)) mex++,dfn++; ans[i]=mex+1,dfn++;
    38         ve[val[lft[i]]].push_back(bel[lft[i]]);
    39     }
    40     for(int i=1;i<=q;i++) printf("%d
    ",ans[i]);
    41     return 0;
    42 }
    View Code

    F.Dish Shopping

  • 相关阅读:
    ERStudio的使用
    AWK文本处理工具(Linux)
    SubSonic3.0.0.4.1源码包与调用Dll
    实现简单微博功能!(上)
    缓冲区溢出攻击
    移动收入超PC端 盛大文学战略转型初见成效
    Windows错误码解析
    获取Windows操作系统的CPU使用率以及内存使用率
    关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)
    API Monitor简介(API监控工具)
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10576959.html
Copyright © 2011-2022 走看看