题目 WOJ5078WOJ5081

T1 Problem A \(\color{green}{100}\)

由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成环。然后要求边权和最大的最大的。那么题意就是求 \(k\) 颗最大生成树。

先把边按边权从大到小排,考虑朴素 Kruscal ,维护 \(k\) 次并查集,复杂度 \(O(km)\) 过不去。考虑同时维护 \(k\) 个并查集,那么枚举每条边,将其加入到第一个 \(u,v\) 不连通的并查集中。由于每次都要求加入到最前面的并查集,那么任意 \(u,v\) 的连通性一定是单调的,也就是前面不连通,后面联通,所以每次二分找这个并查集。

下面是我赛时的做法。

我赛时写的神秘优化也跑的飞快,估计是出题人没有想到这种优化,没有刻意卡。是对每次 \(O(k)\) 找加入的并查集的优化。有点像 Dinic 的当前弧优化,就是从上一次对 \(u,v\) 边找到的并查集的下一个开始找,显然重边越多跑的越快。

code:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define in read()
  4. inline int read(){
  5. int p=0,f=1;
  6. char c=getchar();
  7. while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
  8. while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
  9. return p*f;
  10. }
  11. const int N=1e3+5;
  12. const int M=3e5+5;
  13. const int K=1e4+5;
  14. struct edge{
  15. int u,v,w,o;
  16. }e[M];
  17. int n,m,k;
  18. inline bool cmp(edge a,edge b){
  19. return a.w>b.w;
  20. }
  21. int vis[M];
  22. int fa[N][K];
  23. inline int getf(int x,int tk){
  24. if(fa[x][tk]==x)return x;
  25. return fa[x][tk]=getf(fa[x][tk],tk);
  26. }
  27. int cur[N][N];
  28. signed main(){
  29. // freopen("a.in","r",stdin);
  30. // freopen("a.out","w",stdout);
  31. register int i;
  32. n=in,m=in,k=in;
  33. for(i=1;i<=m;++i)
  34. e[i].u=in,e[i].v=in,
  35. e[i].w=in,e[i].o=i;
  36. sort(e+1,e+1+m,cmp);
  37. for(i=1;i<=n;++i)
  38. for(int j=1;j<=k;j++)
  39. fa[i][j]=i;
  40. for(i=1;i<=m;++i){
  41. int u=e[i].u,v=e[i].v;
  42. int t=cur[u][v]+1,f1=getf(u,t),f2=getf(v,t);
  43. while(f1==f2&&t<k)
  44. t++,f1=getf(u,t),f2=getf(v,t);
  45. if(f1==f2)continue;
  46. vis[e[i].o]=t;
  47. fa[f2][t]=f1;
  48. cur[u][v]=cur[v][u]=t;
  49. }
  50. for(i=1;i<=m;++i)
  51. cout<<vis[i]<<'\n';
  52. return 0;
  53. }

T2 Problem B \(\color{red}{98}\)

由于操作只能用行来更新列,所以正确的构造方案一定是先构造出一整行黑色,然后再逐列修改。

先考虑无解,当且仅当图中没有黑色时无解。因为只要有一个黑色,将黑色对应行修改每列一定能构造出一整行黑。

判断无解之后图中一定有黑色。

考虑将每行作为要构造的整行黑之后取最小值。

如果第 \(i\) 列有黑,那么那么用这个黑一定可以构造出全黑的第 \(i\) 行;如果第 \(i\) 列没有黑,那么随便找一个有黑的行操作一次就可以让第 \(i\) 列有黑。

然后考虑第 \(i\) 行的操作数,按上述操作让第 \(i\) 列有黑。然后遍历一行,有一个白就算一次操作。将整行染黑之后再遍历每列,如果这一列全是黑就不操作,否则算一次操作。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=505;
  4. int n;
  5. int mp[N][N];
  6. int line[N];
  7. bool OK[N];
  8. bool cisb[N];
  9. int tans=0x7fffffff;
  10. bool NO=true;
  11. signed main(){
  12. // freopen("b.in","r",stdin);
  13. // freopen("b.out","w",stdout);
  14. cin>>n;
  15. for(int i=1;i<=n;i++)
  16. for(int j=1;j<=n;j++){
  17. char c;cin>>c;
  18. mp[i][j]=(c=='#');
  19. if(mp[i][j])OK[j]=1;
  20. if(mp[i][j])NO=false;
  21. }
  22. if(NO){cout<<-1;return 0;}
  23. for(int i=1;i<=n;i++){
  24. cisb[i]=1;
  25. for(int j=1;j<=n;j++)
  26. if(!mp[j][i])cisb[i]=0;
  27. }
  28. for(int i=1;i<=n;i++){
  29. int ans=n;
  30. if(!OK[i])ans++;
  31. for(int j=1;j<=n;j++){
  32. if(cisb[j])ans--;
  33. if(!mp[i][j])ans++;
  34. }
  35. tans=min(ans,tans);
  36. }
  37. cout<<tans;
  38. return 0;
  39. }

T3 Problem C \(\color{red}{60}\)

想了一堆关于 \(\sqrt n\) 的无用性质,终究没有注意到正解的性质。

乘积大于 \(n^m\) 的方案数等于乘积小于 \(n^m\) 的方案数。

考虑一个序列 \(p_1,p_2,\cdots,p_{2m}\),且\(p_1p_2\cdots p_{2m}=t<n^m\)

那么有 \(\frac{n}{p_1},\frac{n}{p_2},\cdots,\frac{n}{p_{2m}}\),且\(\frac{n}{p_1}\frac{n}{p_2}\cdots\frac{n}{p_{2m}}=\frac{n^{2m}}{t}>n^m\)

所以每一个乘积小于 \(n^m\) 的序列对应一个乘积大于 \(n^m\) 的序列,所以我们只需要算出乘积等于 \(n^m\) 的序列数就好了。

对于乘积等于 \(n^m\) 的数量,可以用 dp 做。题解曰,经典背包

考虑求出 \(n^m\) 的质因子也就是 \(n\) 的质因子且个数乘以 \(m\)。那么问题就是这些质因子分配到 \(2m\) 个位置的方案数。

考虑将每个质因子单独做最后乘起来就是答案。

记 \(n\) 的一个质因子为 \(p\),有 \(c\) 个。

设 \(f[i][j]\) 表示前 \(i\) 个位置一共分配了 \(j\) 个 \(p\)。显然 \(f\) 的范围是 \(2m*c*m\),\(c\) 的期望个数是 \(\log n\) ,所以状态数是 \(m^2\log n\)。

由于要求每个位置整除 \(n\),所以每个位置最多分配 \(c\) 个\(p\) ,于是转移时枚举当前位置分配了几个 \(p\),方程为:

\[f[i][j]=\sum\limits_{k=0}^{c}f[i-1][j-k]
\]

可以滚动数组滚掉第一维。

时间复杂度分析:\(p\) 的种类约为 \(\log n\),个数约为 \(\log n\),外层循环每个 \(p\),内层 dp 状态数 \(m^2\log n\),转移 \(p\) 的个数,所以总复杂度大概是 \(O(m^2(\log n)^3)\)。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define in read()
  5. inline int read(){
  6. int p=0,f=1;
  7. char c=getchar();
  8. while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
  9. while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
  10. return p*f;
  11. }
  12. const int mod=998244353;
  13. int inv2=499122177;
  14. int qpow(int a,int b){
  15. int ans=1;
  16. while(b){
  17. if(b&1)ans=ans*a%mod;
  18. a=a*a%mod;
  19. b>>=1;
  20. }
  21. return ans;
  22. }
  23. int n,m;
  24. int p[100],pn;
  25. int cnt[100];
  26. void getp(int x){
  27. int ans=x;
  28. for(int i=2;i*i<=x;i++){
  29. if(x%i==0)p[++pn]=i;
  30. while(x%i==0)cnt[pn]++,x/=i;
  31. }
  32. if(x!=1)p[++pn]=x,cnt[pn]=1;
  33. }
  34. int f[205][6005];
  35. int ans=1,res=1;
  36. signed main(){
  37. cin>>n>>m;
  38. getp(n);
  39. for(int i=1;i<=pn;i++)
  40. res=res*(cnt[i]+1)%mod;
  41. for(int l=1;l<=pn;l++){
  42. memset(f,0,sizeof(f));
  43. for(int i=0;i<=cnt[l];i++)
  44. f[1][i]=1;
  45. for(int i=2;i<=m<<1;i++){
  46. for(int j=0;j<=cnt[l]*m;j++){
  47. for(int k=0;k<=cnt[l];k++){
  48. f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
  49. }
  50. }
  51. }
  52. ans=ans*f[m<<1][cnt[l]*m]%mod;
  53. }
  54. ans=(qpow(res,(m<<1))+ans+mod)%mod*inv2%mod;
  55. cout<<ans;
  56. return 0;
  57. }

有个想法是用经典 dp 求出把 \(n\) 个数分配到 \(m\) 个方案数,然后容斥掉不合法的分配,但是写挂了。


T4 Problem D \(\color{purple}{0}\)

freoepn,虽然改过来也是挂的

明天改。

21.10.14 test的更多相关文章

  1. Capture One 21 Pro 14.0.2.36中文版安装教程

    Capture One 21 Pro 14.0.2.36 for windows是一款由丹麦PHASE ONE飞思公司推出的.非常专业强大的图像处理编辑工具. 下载 Capture One 21 Pr ...

  2. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  3. 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画

    [源码下载] 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 线性动画 - ColorAnimatio ...

  4. 2016年12月15日 星期四 --出埃及记 Exodus 21:10

    2016年12月15日 星期四 --出埃及记 Exodus 21:10 If he marries another woman, he must not deprive the first one o ...

  5. Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置

    Thinkpad W520 + Ubuntu 12.04LTS, 13.10, 14.04LTS安装Nvidia显卡驱动设置 http://henzhai.com/tech/2012/07/w520- ...

  6. macOS 10.14虚拟机安装教程

    windows10下安装vmware14.0以及macOS 10.14图文详解 工具/原料   windows10 vmware 14.0 macOS 10.14懒人版 mac补丁unlocker工具 ...

  7. OS + macOS Mojave 10.14.4 / sushi / ssh-keygen / ssh-copy-id

    s 系统版本: macOS 10.14.4 (18E226) 内核版本: Darwin 18.5.0 型号名称: Mac mini 2014 型号标识符: Macmini7,1 处理器名称: Inte ...

  8. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

      目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...

  9. APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4,Security Update 2019-002 High Sierra, Security Update 2019-002 Sierra

    APPLE-SA-2019-3-25-2 macOS Mojave 10.14.4, Security Update2019-002 High Sierra, Security Update 2019 ...

随机推荐

  1. Java XXE漏洞典型场景分析

    本文首发于oppo安全应急响应中心: https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247485488&idx=1&am ...

  2. IIS中配置WCF站点

    http://msdn.microsoft.com/zh-cn/library/aa751852.aspx http://blog.csdn.net/hsg77/article/details/389 ...

  3. vue 工作随笔

    现在工作要做一个电商项目,将工3作的笔记记在这儿,以后方便结总 本套项目用的前端方案 是: vue vue-router Element -ui Axios Echarts 后端技术采用node.js ...

  4. Linux上安装服务器监视工具,名为Scout_Realtime。

    如何从浏览器监视Linux服务器和进程指标 在服务器上安装Ruby 1.9.3+ sudo yum -y install rubygems-devel 在Linux系统上安装了Ruby之后,现在可以使 ...

  5. 网站URL如何SEO优化

    前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL. 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站搜索你网站相关内容时 ...

  6. 记一次k8s pod频繁重启的优化之旅

    关键词:k8s.jvm.高可用 1.背景 最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下. 听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次.对于技术人员来说, ...

  7. Groovy系列(2)- Groovy与Java的不同之处

    Groovy与Java的不同之处 默认 imports 所有这些包和类都是默认导入的,不必使用显式import语句来使用它们 java.io.* java.lang.* java.math.BigDe ...

  8. Shell系列(34) - 多分支case语句简介及实例

    多分支case条件语句 概念 case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关 ...

  9. ☕【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了!

    JPA的介绍分析 Java持久化API (JPA) 显著简化了Java Bean的持久性并提供了一个对象关系映射方法,该方法使您可以采用声明方式定义如何通过一种标准的可移植方式,将Java 对象映射到 ...

  10. css布局宽度自适应

    随着各种终端的不断涌现,网页中的元素适应不同的分辨率变得特别重要,根据经验,涉及到宽度自适应的一共有四种情况: 左端固定,右边自适应:右端固定,左边自适应:两端固定,中间自适应:中间固定,两端自适应. ...