解题:CTSC 2008 祭祀】的更多相关文章

题面 洛谷要求输出方案,懒得写了,但是还是放一下链接看看吧 (虽然现在二分图已经过气了=.=) 要求最长反链,最长反链=最小链覆盖,先Floyd传递闭包之后链覆盖就变成了边覆盖,然后最小边覆盖=总点数-最大匹配 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=,inf=1e9; int n,m,s,f,b,t,t1,t2,t3,cnt,ans; *M],goal…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1143 [算法] 答案为最小路径可重复点覆盖所包含的路径数,将原图G进行弗洛伊德传递闭包,得到一张新图G',然后求出拆点二分图G2'的最大匹配,N - 最大匹配 即为答案,我们尝试证明上述结论 : 设祭祀点集合为S,最小路径可重复点覆盖的边集为Path,由于Path覆盖了所有节点,故每条路径上至多选一个点,有 : |S| <= |Path| , 因此,如果我们能构造出一组解,使得|…
题目链接 戳我 \(Solution\) 第一问 这道题要知道一个叫做\(Dilworth\)的定理 最长反链\(=\)最小链覆盖 证明(\(from\ r\_64\)): 所以我们只要求一个最小链覆盖即可 这个很好求 对于每个点拆点,拆成\((x,x')\),\(s->x\)流量为\(1\),\(x'->t\),流量为\(1\) 对于每个相连通的边\((x,y)\),将\(x->y'\)流量为\(1\) 最后用\(n-Dinic()\)即可 但是注意不能根据输入的边连边,需要用传递闭包…
一句话题意,树链上带改动区间第k大 感觉能够dfs+主席树O(nlog2n)过掉,但我不会写= = 于是写的线段树套平衡树+链剖+二分(改动O(nlog3n),查询O(nlog4n)慢了好多啊QAQ) 这里简介一下区间第K大做法.对于每一个线段树所"管辖"的范围,建一棵相应范围内的平衡树(我用的Treap):改动时,改动每一个包括被改动节点的线段树节点所相应的Treap.查询时.二分 答案.统计每一个区间内比当前答案小的数就可以(为了保证是序列里的数.我们能够二分答案在原序列中排名)…
P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. 已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份. 然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼…
题面 概率生成函数 对于菜鸡博主来说好难啊 其一般形式为$F(x)=\sum\limits_{i=0}^∞[x==i]x_i$,第i项的系数表示离散变量x取值为i的概率 一般的两个性质:$F(1)=1,E(x)=F'(1)$ 这里用$F(x)$表示结束时的串长的概率生成函数,$G(x)$表示到长度到达...而串未结束的概率生成函数,字符串长为len,那么有: ①$F(x)+G(x)=x*G(x)+1$,含义是长度达到x的概率:左边就是字面意思,右边$x*G(x)$表示x-1时未结束的概率,然后加…
题面 用双向链表把相邻两项的差串起来,用大根堆维护价值,每次贪心取最大的$x$.取完之后打标记删掉$pre[x]$和$nxt[x]$,之后用$val[pre[x]]+val[nxt[x]]-val[x]$替换这个$x$塞进堆里去,注意边界要连上一个极值 #include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; struct a{l…
题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会T炸,考虑优化 我们先预处理每个状态中$1$的数目和连边的状态,然后压缩状态初始让一边集合为空,一边集合为全集,这样每次从已有的点的前面$\frac{n}{2}$个点中枚举一个加入另一边,就可以边搜边更新边数而不用最后$O(n)$检查了.另一个问题是数组可能非常大,这里我们可以把状态拆成前后两半,然…
题面 如果没有两个数不能相同这个限制就两个数组排序后贪心即可.现在加上这个限制,注意到每个数组中的数是两两不同的,所以每次一定能在前面或后面一个数中找一个换过来,这样每次考虑相邻三个数转移就可以了,注意特判一下边界. #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; long long a[N],b[N],dp[N],n,…
题面 原来看过然后没做,结果板板把这道题改了改考掉了,血亏=.= 首先看看有没有符合条件的点.如果没有开始寻找解,先把所有的大于$2*k$的点设为坏点,然后求最大子矩形,只要一个最大子矩形的权值和超过$2*k$则它的一个子矩形一定可以成为解.因为这时所有点都小于$k$,这个最大子矩形既然权值和超过$2*k$那么一定是有一部分落在所求的区间中,然后逐行/列枚举切一下是一定有解的. 注意最大子矩形的边界(为什么你们的最大子矩形都要做两遍啊=.=) #include<cstdio> #include…