• 2019银川F,ccpc威海D - Sternhalma 2022


    1401D - Maximum Distributed Tree

    求每个边经过的次数,假设求u,v这条边的次数,边的左端是u这个集合一共有n-siz[v]个点,右端是v这个集合有siz[v]个端点,经过这条边的次数就是siz[v]*(n-siz[v]),然后再按照次数多的乘以大的质因数就可以了,注意m可能大于n-1

    D. Maximum Distributed Tree(贪心+树dfs)_小菜鸡加油的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define pause system("pause")
    5. #define int long long
    6. const int mod=1e9+7;
    7. const int inf=1e18;
    8. const int N = 4e5+100;
    9. const double eps=1e-10;
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a%mod;
    16. a=a*a%mod;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. int sgn(double x)
    22. {
    23. if(fabs(x)return 0;
    24. else if(x<0) return -1;
    25. else return 1;
    26. }
    27. int getinv(int a){return qpow(a,mod-2LL);}
    28. int head[N],cnt;
    29. struct Edge
    30. {
    31. int next,to;
    32. }e[N];
    33. void addedge(int from,int to)
    34. {
    35. e[++cnt].next=head[from];
    36. e[cnt].to=to;
    37. head[from]=cnt;
    38. }
    39. int siz[N],t,n,m,p[N],a[N],ct;
    40. bool cmp(int a,int b){return a>b;}
    41. void dfs(int u,int fa)
    42. {
    43. siz[u]=1;
    44. for(int i=head[u];i;i=e[i].next)
    45. {
    46. int j=e[i].to;
    47. if(j==fa) continue;
    48. dfs(j,u);
    49. siz[u]+=siz[j];
    50. a[++ct]=siz[j]*(n-siz[j]);
    51. }
    52. }
    53. signed main()
    54. {
    55. //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    56. //freopen("in.txt","r",stdin);
    57. cin>>t;
    58. while(t--)
    59. {
    60. cin>>n;
    61. for(int i=1;i<=n;i++) siz[i]=head[i]=0;cnt=ct=0;
    62. for(int i=1;i
    63. {
    64. int u,v;cin>>u>>v;
    65. addedge(u,v);addedge(v,u);
    66. }
    67. dfs(1,0);
    68. cin>>m;
    69. for(int i=1;i<=m;i++) cin>>p[i];
    70. int ans=0;
    71. if(m<=ct)
    72. {
    73. sort(a+1,a+ct+1,cmp);
    74. sort(p+1,p+m+1,cmp);
    75. for(int i=m+1;i<=ct;i++) p[i]=1;
    76. for(int i=1;i<=ct;i++)
    77. {
    78. ans=(ans+(p[i]*a[i]%mod))%mod;
    79. //cout<
    80. }
    81. }
    82. else
    83. {
    84. //cout<<"sss"<
    85. sort(a+1,a+ct+1);
    86. sort(p+1,p+m+1);
    87. int tmp=1;
    88. for(int i=ct+1;i<=m;i++) tmp=tmp*p[i]%mod;
    89. p[ct]=p[ct]*tmp%mod;
    90. for(int i=ct;i>=1;i--)
    91. {
    92. ans=(ans+(p[i]*a[i]%mod))%mod;
    93. // cout<
    94. }
    95. }
    96. cout<
    97. for(int i=1;i<=max(ct,m);i++) p[i]=a[i]=0;
    98. }
    99. pause;
    100. return 0;
    101. }

    F. Function! 2019银川,类似整除分块

    因为当b>a的时候,\log_{b}{a}都是小于1的,上取整之后就是1,所以整个式子就变成

    \sum_{a}^{n}a\sum_{b=a}^{n}\log_{a}{b},当a>\sqrt{n}时,1<=\log_{a}{b}<2=>\log_{a}{b}=1,所以右边的求和其实就是(n-a+1),这玩意是可以化简得,\sum_{a}^{n}a(n-a+1)=\sum_{a}^{n}(n+1)a-a^{2}=(n+1)\sum_{a}^{n}a-\sum_{a}^{n}a^{2},

    一个是等差数列求和,一个是平方和,这就可以o(1)得算出来了;

    然后a<=\sqrt{n}时直接暴力算,但发现对于一个b,会有一段连续的a log值时一样的,所以可以利用类似整除分块的思想来优化一下;

    2019ICPC(银川) - Function!(数论+数学分块)_Frozen_Guardian的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define pause system("pause")
    5. #define int long long
    6. const int mod=998244353;
    7. const int inf=1e18;
    8. const int N = 4e5+100;
    9. const double eps=1e-10;
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a%mod;
    16. a=a*a%mod;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. int sgn(double x)
    22. {
    23. if(fabs(x)return 0;
    24. else if(x<0) return -1;
    25. else return 1;
    26. }
    27. int getinv(int a){return qpow(a,mod-2LL);}
    28. int n;
    29. int cal(double a,double b)
    30. {
    31. return floor(log2(b)/log2(a));
    32. }
    33. signed main()
    34. {
    35. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    36. //freopen("in.txt","r",stdin);
    37. cin>>n;
    38. int ans=0,a;
    39. for(a=2;a*a<=n;a++)
    40. {
    41. int tmp=0;
    42. int qp=a;
    43. int x=1;
    44. for(int b=a;b<=n;b++)
    45. {
    46. int d=min(n,qp*a-1LL);
    47. tmp=(tmp+x*((d-b+1)%mod)%mod)%mod;
    48. b=d;
    49. qp*=a;x++;
    50. //cout<
    51. }
    52. ans=(ans+tmp*a%mod)%mod;
    53. }
    54. //cout<
    55. a--;
    56. int x1=((n%mod)*((n+1)%mod)%mod)*getinv(2)%mod;
    57. int x2=((a%mod)*((a+1)%mod)%mod)*getinv(2)%mod;
    58. int y1=(((n%mod)*((n+1)%mod)%mod)*(((n%mod)*2LL%mod+1)%mod)%mod)*getinv(6)%mod;
    59. int y2=(((a%mod)*((a+1)%mod)%mod)*(((a%mod)*2LL%mod+1)%mod)%mod)*getinv(6)%mod;
    60. int x=((n+1)%mod)*((x1-x2+mod)%mod)%mod;
    61. int y=(y1-y2+mod)%mod;
    62. int res=(x-y+mod)%mod;
    63. ans=(ans+res)%mod;
    64. //cout<
    65. cout<
    66. pause;
    67. return 0;
    68. }

    D - Sternhalma 2022ccpc威海

    一共就19个格子,并且每个格子的权值是不会变的,所以可以记忆化加状压,这题就是一个带状压的记忆化搜索,但是实现雀氏有点难,直接看代码就可以

    2022CCPC威海站 铜牌题解 A C D E G I J - 知乎 (zhihu.com)

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define lowbit(x) ((x)&(-x))
    5. #define int long long
    6. #define pause system("pause")
    7. const int mod=998244353;
    8. const int inf=1e18;
    9. const int N = 1e6+100;
    10. const double eps=1e-10;
    11. int qpow(int a,int b)
    12. {
    13. int res=1;
    14. while(b)
    15. {
    16. if(b&1) res=res*a%mod;
    17. a=a*a%mod;
    18. b>>=1;
    19. }
    20. return res;
    21. }
    22. int sgn(double x)
    23. {
    24. if(fabs(x)return 0;
    25. else if(x<0) return -1;
    26. else return 1;
    27. }
    28. int getinv(int a){return qpow(a,mod-2LL);}
    29. int d[][2]={1,1,-1,-1,1,-1,-1,1,0,2,0,-2,2,0,-2,0};
    30. int d2[][2]={-1,-1,1,1,-1,1,1,-1,0,-2,0,2,-2,0,2,0};
    31. vectorint,int>>coord=
    32. {
    33. {1,3},{1,5},{1,7},
    34. {2,2},{2,4},{2,6},{2,8},
    35. {3,1},{3,3},{3,5},{3,7},{3,9},
    36. {4,2},{4,4},{4,6},{4,8},
    37. {5,3},{5,5},{5,7}
    38. };
    39. int s[10][10],id[10][10],vis[N],f[N],n;
    40. int tran(string s)
    41. {
    42. int res=0;
    43. for(int i=0;ilength();i++)
    44. {
    45. int x=0;
    46. if(s[i]=='#') x=1;
    47. res+=x*(1<
    48. }
    49. return res;
    50. }
    51. int dfs(int state)
    52. {
    53. if(vis[state]) return f[state];
    54. int val=f[state];
    55. for(int i=0;i<19;i++)
    56. {
    57. int x=(state>>i)&1;
    58. if(x==0) continue;
    59. int nstate=state&(~(1<
    60. val=max(val,dfs(nstate));
    61. }
    62. int g[10][10];
    63. for(int i=0;i<19;i++)
    64. {
    65. auto [x,y]=coord[i];
    66. g[x][y]=state>>i&1;
    67. }
    68. for(int i=0;i<19;i++)
    69. {
    70. if((state>>i&1)==0) continue;
    71. auto [x,y]=coord[i];
    72. for(int j=0;j<6;j++)
    73. {
    74. int ax=x+d[j][0],ay=y+d[j][1];
    75. int bx=x+d2[j][0],by=y+d2[j][1];
    76. if(ax<0||ay<0||bx<0||by<0) continue;
    77. if(id[ax][ay]==-1||id[bx][by]==-1) continue;
    78. if(g[ax][ay]==0||g[bx][by]==1) continue;
    79. int nstate=state;g[ax][ay]=g[x][y]=0;g[bx][by]=1;
    80. nstate=nstate&(~(1<
    81. nstate=nstate&(~(1<
    82. nstate=nstate|(1<
    83. val=max(val,dfs(nstate)+s[x][y]);
    84. g[ax][ay]=g[x][y]=1;g[bx][by]=0;
    85. }
    86. }
    87. vis[state]=1;
    88. return f[state]=val;
    89. }
    90. signed main()
    91. {
    92. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    93. //freopen("in.txt","r",stdin);
    94. memset(id,-1,sizeof(id));
    95. for(int i=0;i<19;i++)
    96. {
    97. auto [x,y]=coord[i];
    98. id[x][y]=i;
    99. cin>>s[x][y];
    100. }
    101. vis[0]=1;
    102. f[0]=0;
    103. cin>>n;
    104. for(int i=1;i<=n;i++)
    105. {
    106. string t="",g;
    107. for(int j=1;j<=5;j++) cin>>g,t+=g;
    108. int ans=dfs(tran(t));
    109. cout<
    110. }
    111. pause;
    112. return 0;
    113. }

  • 相关阅读:
    【JKI SMO】框架讲解(二)
    WPS/Word参考文献格式规范及引用的方法
    35岁危机来临前,程序员如何未雨绸缪?
    C#,人工智能,机器人路径规划(Robotics Pathfinding)DStarLite(D* Lite Algorithm)优化算法与C#源程序
    【FFmpeg】AVFrame结构体
    从无到有的基于QT软件的DIY桌面番茄钟(上)
    裁员潮血洗硅谷,推特、Meta、亚麻都扛不住了!
    C/C++基础
    Mysql高级——性能分析工具(1)
    做UI设计师是否需要美术功底?
  • 原文地址:https://blog.csdn.net/weixin_52621204/article/details/127790266