\(\rm Link\)

然而泥萌没有权限是看不了题目的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\)

先说自己的做法。

发现其实就是在凑一个式子:

\[\frac{\sum a_ik_i}{M\sum k_i}=\frac{N}{M}
\]

然后稍微变个形:

\[\sum a_ik_i=N\cdot \sum k_i
\]

于是发现只要暴力背包就完了,最后判断一下\(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。

考虑把式子转化一下,就变成了

\[\sum k_i(a_i-N)=0
\]

大概就是考虑用已经凑出的和当做状态,那么实际上是在找一个环。于是每次转移的时候枚举放哪个新物品(新物品权值为\(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的更多相关文章

  1. [题解向] 正睿Round435

    10.14 Link 唔,这一场打得不好.获得了\(\rm 75pts/300pts\)的得分,但是居然可以获得\(\rm 27/69\)的名次,也不至于不满意--毕竟是真不会233 \(\rm T1 ...

  2. 11.6 正睿停课训练 Day17

    目录 2018.11.6 正睿停课训练 Day17 A chinese(思路 计数) B physics(单调队列/剪枝 DP) C chemistry(期望 DP) 考试代码 A B C 2018. ...

  3. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  4. 10.31 正睿停课训练 Day13

    目录 2018.10.31 正睿停课训练 Day13 A Poker(期望) B Label(高斯消元) C Coin(二分图染色 博弈) 考试代码 A(打表) B 2018.10.31 正睿停课训练 ...

  5. 11.5 正睿停课训练 Day16

    目录 2018.11.5 正睿停课训练 Day16 A 道路规划(思路) B 逻辑判断(枚举 位运算/DP 高维前缀和) C 区间(贪心/树状数组) 考试代码 A B C 2018.11.5 正睿停课 ...

  6. 11.2 正睿停课训练 Day15

    目录 2018.11.2 正睿停课训练 Day15 A 郁闷的小G(二分) B 小G的树(树形DP) C 数的距离(思路) 考试代码 B C 2018.11.2 正睿停课训练 Day15 时间:3.5 ...

  7. 11.1 正睿停课训练 Day14

    目录 2018.11.1 正睿停课训练 Day14 A 字符串 B 取数游戏(贪心) C 魔方(模拟) 考试代码 B C 2018.11.1 正睿停课训练 Day14 时间:3.5h 期望得分:100 ...

  8. 10.29 正睿停课训练 Day11

    目录 2018.10.29 正睿停课训练 Day11 A 线段树什么的最讨厌了(思路 DFS) B 已经没有什么好害怕的了(差分 前缀和) C 我才不是萝莉控呢(DP 贪心 哈夫曼树) 考试代码 A ...

  9. 10.30 正睿停课训练 Day12

    目录 2018.10.30 正睿停课训练 Day12 A 强军战歌(DP 树状数组 容斥) B 当那一天来临(思路) C 假如战争今天爆发(贪心) 考试代码 B C 2018.10.30 正睿停课训练 ...

随机推荐

  1. python 中in 的 用法

    1.   作用为 成员运算符   在字符串内操作,如果字符串包含相关字符 则返回True,如果不包含则返回False   当然处理不单单是只有单个字符,多个连续的字符也是可以处理的 # 单个字符 a= ...

  2. SourceTree 版本跳过bitbucket注册方法

    1.安装sourcetree时 需要选择 bitbucket账号,这个令人头疼 当然肯定有办法来跳过这一步 2.关闭当前安装界面 进入   C:\Users\Administrator\AppData ...

  3. 解锁云原生 AI 技能|在 Kubernetes 上构建机器学习系统

    本系列将利用阿里云容器服务,帮助您上手 Kubeflow Pipelines. 介绍 机器学习的工程复杂度,除了来自于常见的软件开发问题外,还和机器学习数据驱动的特点相关.而这就带来了其工作流程链路更 ...

  4. virsh 查看信息

    获取域网络接口信息 virsh domiflist debian8 获取vcpu信息 virsh vcpuinfo debian8 设定内存最大内存 virsh setmaxmem debian8 9 ...

  5. 简单的python GUI例子

    写一个简单的界面很容易,即使是什么都不了解的情况下,这个文本转载了最简单的界面编写,下个文本介绍了TK的简单但具体的应用 在python中创建一个窗口,然后显示出来. from Tkinter imp ...

  6. java socket通信:聊天器(1)

    目的:实现多个客户之间的通信 首先,这个聊天器的框架是这样的: 对于服务器端:建立socket,连接到服务器,并且开始监听. import java.io.*; import java.util.Ar ...

  7. 深入java8的集合:ArrayList的实现原理

    一.概述 一上来,先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implem ...

  8. 【设计模式】Prototype

    前言 这篇讲设计模式的部分相对较少.Prototype设计模式,它提供一种复制对象的思路.使用Prototype就可以在不需要了解类结构的前提下,复制一个现有对象.写了一个代码片段,讲解使用Objec ...

  9. numpy,matplotlib,pandas

    目录 numpy模块 numpy简介 numpy使用 matplotlib模块 条形图 直方图 折线图 散点图+直线图 pandas模块 numpy模块 numpy简介 numpy官方文档:https ...

  10. SQL注入:盲注

    盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击. 服务器没有错误回显,对于攻击者来说缺少了非常重要的"调试信息". 盲注分类 1.布尔盲注 布尔很明显Ture和F ...