[题解向] 正睿Round409
然而泥萌没有权限是看不了题目的233.
\(\rm T1\)
大概就是个map,脑残出题人认为(x,x)不属于有序二元组,我可qtmd。于是只拿了\(\rm 60pts\)
int main(){
ios_base :: sync_with_stdio(false) ;
cin.tie(0), cout.tie(0) ; cin >> N >> P ; int i ;
for (i = 1 ; i <= N ; ++ i) cin >> base[i], base[i] %= P ;
for (i = 1 ; i <= N ; ++ i) if (base[i]) M[expow(4 * base[i] % P, P - 2)] ++ ;
for (i = 1 ; i <= N ; ++ i){
int now = 1ll * base[i] * base[i] % P ;
ans += M[now] ; if (4ll * now % P * base[i] % P == 1) -- ans ;
}
cout << ans << endl ; return 0 ;
}
\(\rm T2\)
先说自己的做法。
发现其实就是在凑一个式子:
\]
然后稍微变个形:
\]
于是发现只要暴力背包就完了,最后判断一下\(f_{k,N}\)是不是\(=k\)就做完了。
int main(){
cin >> K >> N >> M ; int i, j ; dp[0] = 0 ;
for (i = 1 ; i <= K ; ++ i) cin >> base[i] ;
for (i = 1 ; i <= N * N ; ++ i) dp[i] = Inf ;
for (i = 1 ; i <= K ; ++ i)
for (j = base[i] ; j <= N * N ; ++ j)
dp[j] = min(dp[j - base[i]] + 1, dp[j]) ;
for (i = 1 ; i <= N ; ++ i) if (dp[i * N] == i) return cout << i, 0 ;
return -1 ;
}
于是获得了\(\rm 70pts\)……但是用头想一想,发现并不对。因为可能\(f_{k,N}\)这个状态的\(\rm cost\)可能是5,但是背包转移的时候只能记录最优状态,于是假设会记录4,那这个状态就挂掉了……对每个状态都开了个std :: set发现T掉了……
正解是BFS。
考虑把式子转化一下,就变成了
\]
大概就是考虑用已经凑出的和当做状态,那么实际上是在找一个环。于是每次转移的时候枚举放哪个新物品(新物品权值为\(a_i-N\))就完了。
#define MAX 50000
cin >> K >> N >> M ; q.push(MAX) ; vis[MAX] = 1 ; int i ;
for (i = 1 ; i <= K ; ++ i) cin >> base[i], base[i] -= N ;
while (!q.empty()){
int now = q.front() ; q.pop() ;
if (now > M + MAX) continue ;
for (i = 1 ; i <= K ; ++ i){
if (now + base[i] == MAX){
cout << ans[now] + 1 << endl ;
return 0 ;
}
else if (!vis[now + base[i]])
vis[now + base[i]] = 1, ans[now + base[i]] = ans[now] + 1, q.push(now + base[i]) ;
}
}
cout << -1 << endl ;
正 解 暴 力, 菜 鸡 退 役。
\(\rm T3\)
sb题,每个连通块都产生\(\rm 1\)的贡献当且仅当没有任何一个连通块是树。
于是就变成了找树的问题……忘记前驱思考了nm老久,趁早退役算了= =
void dfs(int now, int pre){
vis[now] = 1 ;
for (int k = head[now] ; k ; k = E[k].next){
if (to(k) == pre) continue ;
if (to(k) == now) continue ;
if (!vis[to(k)]) dfs(to(k), now) ; else ++ o ;
}
}
int main(){
cin >> N ; int i ; p = 1 ;
for (i = 1 ; i <= N ; ++ i) fa[i] = i ;
for (i = 1 ; i <= N ; ++ i) cin >> base[i], add(i, base[i]) ;
for (i = 1 ; i <= N ; ++ i) if (fa[i] == i) ++ ans ;// cout << ans << endl ;
for (i = 1 ; i <= N ; ++ i) if (!vis[i]) o = 0, dfs(i, 0), p = min(o, p) ;
if (p) cout << ans << endl ; else cout << ans - 1 << endl ;
\(\rm T4\)
BZOJ4160.
不可做题233
题面:
给定一张无向图,求给这张图定向成\(\rm DAG\)之后最长路最短是多少。\(n\leq 16\)
\(\rm{Sol~1}\)
考虑直接\(dp\)。\(f_{s,u,v}\)表示考虑了点集\(s\),最长路端点是\(u,v\)的最小值。每次转移的时候枚举\(u,v,w\),从\((u,v),(v,w)\)两个状态转移到\((u,w)\)。复杂度\(O(3^nn^3)\)
1h没调出来
\(\rm Sol~2\)
考虑证明一个二级定理:
定理 \(1.1\)
- 一张无向图定向成的\(\rm DAG\),当其最长路最短时,其最长路为\(\rm X-1\),其中\(\rm X\)表示不连通集覆盖数。也就是对于一张有向图图\(\rm \{V,E\}\),定义一种划分\(P\),使得划分出的每个集合中所有点不连通。
考虑一种证明:
- 首先一定有\(\rm X-1\geq maxL\)。因为其上的每个点是连通的。
- 其次我们考虑,如果每次删除全部出度为\(0\)点,放到一个集合里,那么一定合法,并且可以满足\(\rm X=maxL+1\)。
但其实这东西也可以直接用\(\rm dilworth\)定理的对偶定理证出来:
定理 \(2.1\)(\(\rm dilworth\)定理)
令\(\rm (X,≤)\)是一个有限偏序集,并令\(m\)是反链的最大的大小。则\(\rm X\)可以被划分成\(m\)个但不能再少的链。
对偶一下:
定理 \(2.2\):
令\(\rm (X,≤)\)是一个有限偏序集,并令\(r\)是其最大链的大小。则\(X\)可以被划分成\(r\)个但不能再少的反链。
然后”反链“连接的是”不可比的点“,也就是本题中”不连通的点“。
于是我们就可以快乐地状压了。
int *g, *f ;
int main(){
cin >> N >> M ;
memset(f, 63, sizeof(f)) ;
int u, v, i, j ; T = (1 << N) - 1 ;
for (i = 1 ; i <= M ; ++ i)
cin >> u >> v, -- u, -- v, E[u] |= (1 << v), E[v] |= (1 << u) ;
f[0] = 0, g[0] = 1 ;
for (i = 0 ; i <= N ; ++ i) Sz[1 << i] = i ;
for (i = 1 ; i <= T ; ++ i){
j = (i & (-i)) ;
if (!g[i ^ j]) continue ;
if (E[Sz[j]] & (i ^ j)) continue ;
g[i] = 1 ;
}
for (i = 1 ; i <= T ; ++ i)
for (j = i ; j ; j = (j - 1) & i)
if (g[j]) f[i] = min(f[i], f[i ^ j] + 1) ;
cout << f[T] - 1 << endl ; return 0 ;
}
[题解向] 正睿Round409的更多相关文章
- [题解向] 正睿Round435
10.14 Link 唔,这一场打得不好.获得了\(\rm 75pts/300pts\)的得分,但是居然可以获得\(\rm 27/69\)的名次,也不至于不满意--毕竟是真不会233 \(\rm T1 ...
- 11.6 正睿停课训练 Day17
目录 2018.11.6 正睿停课训练 Day17 A chinese(思路 计数) B physics(单调队列/剪枝 DP) C chemistry(期望 DP) 考试代码 A B C 2018. ...
- 8.10 正睿暑期集训营 Day7
目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...
- 10.31 正睿停课训练 Day13
目录 2018.10.31 正睿停课训练 Day13 A Poker(期望) B Label(高斯消元) C Coin(二分图染色 博弈) 考试代码 A(打表) B 2018.10.31 正睿停课训练 ...
- 11.5 正睿停课训练 Day16
目录 2018.11.5 正睿停课训练 Day16 A 道路规划(思路) B 逻辑判断(枚举 位运算/DP 高维前缀和) C 区间(贪心/树状数组) 考试代码 A B C 2018.11.5 正睿停课 ...
- 11.2 正睿停课训练 Day15
目录 2018.11.2 正睿停课训练 Day15 A 郁闷的小G(二分) B 小G的树(树形DP) C 数的距离(思路) 考试代码 B C 2018.11.2 正睿停课训练 Day15 时间:3.5 ...
- 11.1 正睿停课训练 Day14
目录 2018.11.1 正睿停课训练 Day14 A 字符串 B 取数游戏(贪心) C 魔方(模拟) 考试代码 B C 2018.11.1 正睿停课训练 Day14 时间:3.5h 期望得分:100 ...
- 10.29 正睿停课训练 Day11
目录 2018.10.29 正睿停课训练 Day11 A 线段树什么的最讨厌了(思路 DFS) B 已经没有什么好害怕的了(差分 前缀和) C 我才不是萝莉控呢(DP 贪心 哈夫曼树) 考试代码 A ...
- 10.30 正睿停课训练 Day12
目录 2018.10.30 正睿停课训练 Day12 A 强军战歌(DP 树状数组 容斥) B 当那一天来临(思路) C 假如战争今天爆发(贪心) 考试代码 B C 2018.10.30 正睿停课训练 ...
随机推荐
- 海边拾贝-F-第三方项目
第三方网站,不定期更新: 陈浩个人博客: https://coolshell.cn/ 阮一峰个人博客:http://www.ruanyifeng.com/blog/2015/02/make.html ...
- 转载-用excel批量生成insert语句
用excel批量生成insert语句 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/h ...
- Composer 的安装
最近在家休息了两个月,本来打算看看书,结果和朋友做了个小项目.项目也差不多接近尾声了,就准备找工作了,朋友推荐我去他们公司做事,不过是使用 PHP 进行开发了.我这一年来使用 Java 进行开发,今后 ...
- Python字典(Dictionary)update()方法
原文连接:https://www.runoob.com/python/att-dictionary-update.html Python字典(dictionary)update()函数把字典dict2 ...
- 一个简单的利用 WebClient 异步下载的示例(一)
继上一篇文章 一个简单的利用 HttpClient 异步下载的示例 ,我们知道不管是 HttpClient,还算 WebClient,都不建议每次调用都 new HttpClient,或 new We ...
- mockjs 在项目中vue项目中使用
一.为什么要使用mockjs 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回的数据,并将随机的模 ...
- java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket
A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...
- GSOAP服务卡住?
很久以前参考了https://www.genivia.com/doc/soapdoc2.html 中的一段: How to Create a Multi-Threaded Stand-Alone Se ...
- F5部署SSL证书
查找中间证书 为了保证可以兼容所有浏览器,我们必须在服务器上安装中间证书,请到 中间证书下载工具,输入您的Server.cer,然后下载中间证书,请将中间证书保存为Chain.cer. 证书文件的上传 ...
- mysql数据库之用户管理和权限
mysql服务器进程在启动的时候会读取这6张表,并在内存中生成授权表,所以这几个文件是直接加载进内存的. 以后后续的任何用户登录及其访问权限的检查都通过检查这6张表来实现的.通过访问内存上所生成的结构 ...