https://www.zybuluo.com/ysner/note/1329304

题面

有一张\(n\)点\(m\)边的、不一定联通的无向图。

如果选了一条边,就不能选其两个端点。

现在同时选点和边,那么最多能够选的点边数量和为多少。

同时,回答使点边数最大的方案数。

  • \(n\leq10^5,m\leq3*10^5\)

解析

设答案为\(ans\),方案数为\(tot\)。

讨论一下联通块的形态:

  • \(m=n-1\):\(ans=n,tot=1\)
  • \(m=n\):\(ans=m\),环中\(tot=2\),树的部分\(tot\)值可以通过\(dp\)求出
  • \(m>n\):\(ans=m\),强连通分量\(tot=1\),树的部分\(tot\)值可以通过\(dp\)求出

树的部分的\(dp\):

设\(dp[i][0/1]\)表示统计到\(i\)号点,选不选该点的方案数。

然后从儿子转移,讨论一下就行。

综上,其实把强联通分量缩点后直接树形\(DP\)就行了。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;++i)
  11. #define fq(i,a,b) for(re int i=a;i>=b;--i)
  12. using namespace std;
  13. const int N=5e5+100,mod=998244353;
  14. int n,m,h[N],cnt=1,ans,dfn[N],low[N],sta[N],top,tot,sz[N],bl[N],scc,Esz[N],f[2][N],g[2][N];
  15. bool vis[N];
  16. struct dat{int u,v;}a[N<<1];
  17. struct Edge{int to,nxt;}e[N<<1];
  18. il void add(re int u,re int v)
  19. {
  20. e[++cnt]=(Edge){v,h[u]};h[u]=cnt;
  21. e[++cnt]=(Edge){u,h[v]};h[v]=cnt;
  22. }
  23. il ll gi()
  24. {
  25. re ll x=0,t=1;
  26. re char ch=getchar();
  27. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  28. if(ch=='-') t=-1,ch=getchar();
  29. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  30. return x*t;
  31. }
  32. il void Tarjan(re int u,re int las)
  33. {
  34. dfn[u]=low[u]=++tot;sta[++top]=u;vis[u]=1;
  35. re int v;
  36. for(re int i=h[u];i+1;i=e[i].nxt)
  37. if((i^1)^las)
  38. {
  39. re int v=e[i].to;
  40. if(!dfn[v]) Tarjan(v,i),low[u]=min(low[u],low[v]);
  41. else if(vis[v]) low[u]=min(low[u],dfn[v]);
  42. }
  43. if(dfn[u]==low[u])
  44. {
  45. ++scc;
  46. do{v=sta[top--];vis[v]=0;++sz[scc];bl[v]=scc;}while(u^v);
  47. }
  48. }
  49. il void dfs(re int u)
  50. {
  51. f[0][u]=sz[u];f[1][u]=Esz[u];g[0][u]=g[1][u]=1;vis[u]=1;
  52. for(re int i=h[u];i+1;i=e[i].nxt)
  53. {
  54. re int v=e[i].to;
  55. if(vis[v]) continue;
  56. dfs(v);
  57. if(f[0][v]>f[1][v]) f[0][u]+=f[0][v],g[0][u]=1ll*g[0][u]*g[0][v]%mod;
  58. if(f[0][v]==f[1][v]) f[0][u]+=f[0][v],g[0][u]=1ll*g[0][u]*(g[0][v]+g[1][v])%mod;
  59. if(f[0][v]<f[1][v]) f[0][u]+=f[1][v],g[0][u]=1ll*g[0][u]*g[1][v]%mod;
  60. if(f[0][v]>f[1][v]+1) f[1][u]+=f[0][v],g[1][u]=1ll*g[1][u]*g[0][v]%mod;
  61. if(f[0][v]==f[1][v]+1) f[1][u]+=f[0][v],g[1][u]=1ll*g[1][u]*(g[0][v]+g[1][v])%mod;
  62. if(f[0][v]<f[1][v]+1) f[1][u]+=f[1][v]+1,g[1][u]=1ll*g[1][u]*g[1][v]%mod;
  63. }
  64. }
  65. int main()
  66. {
  67. memset(h,-1,sizeof(h));
  68. n=gi();m=gi();
  69. fp(i,1,m) a[i].u=gi(),a[i].v=gi(),add(a[i].u,a[i].v);
  70. fp(i,1,n) if(!dfn[i]) Tarjan(i,0);
  71. memset(h,-1,sizeof(h));cnt=0;
  72. fp(i,1,m)
  73. {
  74. re int u=a[i].u,v=a[i].v;
  75. if(bl[u]^bl[v]) add(bl[u],bl[v]);
  76. else ++Esz[bl[u]];
  77. }
  78. n=scc;tot=1;
  79. fp(i,1,n)
  80. if(!vis[i])
  81. {
  82. dfs(i);
  83. if(f[0][i]<f[1][i]) ans+=f[1][i],tot=1ll*tot*g[1][i]%mod;
  84. if(f[0][i]==f[1][i]) ans+=f[1][i],tot=1ll*tot*(g[0][i]+g[1][i])%mod;
  85. if(f[0][i]>f[1][i]) ans+=f[0][i],tot=1ll*tot*g[0][i]%mod;
  86. }
  87. printf("%d\n%d\n",ans,tot);
  88. return 0;
  89. }

[noip模拟赛]小U的女装的更多相关文章

  1. noip模拟赛 小Y的问题

    [问题描述]有个孩子叫小 Y,一天,小 Y 拿到了一个包含 n 个点和 n-1 条边的无向连通图, 图中的点用 1~n 的整数编号.小 Y 突发奇想,想要数出图中有多少个“Y 字形”.一个“Y 字形” ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. CH Round #55 - Streaming #6 (NOIP模拟赛day2)

    A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...

  5. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

  8. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  9. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

随机推荐

  1. [HDU2157]How many ways??(DP + 矩阵优化)

    传送门 k < 20 k这么小,随便dp一下就好了... dp[i][j][k]表示从i到j经过k个点的方案数 4重循环.. 但是如果k很大就不好弄了 把给定的图转为邻接矩阵,即A(i,j)=1 ...

  2. java中filter的用法

    filter过滤器主要使用于前台向后台传递数据是的过滤操作.程度很简单就不说明了,直接给几个已经写好的代码: 一.使浏览器不缓存页面的过滤器 Java代码   import javax.servlet ...

  3. ORACLE备份、恢复、常用查询

    --第一,启动服务,(如果数据库处于启动状态,那么略过这一步) 打开命令行执行以下语句  net start OracleServiceORCL  net start  OracleOraDb10g_ ...

  4. C#路径,文件,目录,I/O常见操作汇总

    原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 路径,文件,目录,I/O常见操作汇总 摘要:     文件操作是程序中非常基础和重要的内容,而路径、文件、目录以及 ...

  5. MYSQL Explain语法

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

  6. webstorm初始化

    1.皮肤设置,重启后Terminal皮肤生效 2.排除目录 2.1全局排除 2.2局部排除 选中文件夹 右击Make Directroy As 选择 Excluded 3.代码自定义 3.1 cons ...

  7. Maven查看依赖树

    1.命令行,但是只能查看一层的引用 mvn dependency:tree 如图所示: 2.使用Eclipse的Dependency Hierarchy查看,这个就比较深层次的查看,如图所示: 3.使 ...

  8. ArcGIS中Shapefile和Geodatabase坐标容差的问题

    转自原文 ArcGIS中Shapefile和Geodatabase坐标容差的问题 ArcGIS中,Shapefile文件是没有容差设置的,所以无论什么单位的坐标写入shapefile文件,都不存在容差 ...

  9. Python pandas学习笔记

    参考文献:<Python金融大数据分析> #导入模块 import pandas as pd #生成dataframe df = pd.DataFrame([10,20,30,40], c ...

  10. 【APUE】信号量、互斥体和自旋锁

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-205 ...