04 2016 档案

摘要:容斥原理。 算出不限制硬币数量的方案,-限制1+限制2-限制3+限制4。 限制就是用d+1个硬币。 #include #include #include using namespace std; const int maxn = 100000+10; long long f[maxn],res; int t,c[5],d[5]; void dfs(int dep,int sum,in... 阅读全文
posted @ 2016-04-30 12:24 invoid 阅读(138) 评论(0) 推荐(0)
摘要:spaly. #include #include #include using namespace std; const int maxn = 100000 + 10; int n,m,q; char op[10]; struct Splay { int f[maxn],l[maxn],r[maxn],s[maxn],a[maxn],fa[maxn]; int root;... 阅读全文
posted @ 2016-04-30 11:08 invoid 阅读(175) 评论(0) 推荐(0)
摘要:ac自动机,bit,dfs序。 本文所有的stl都是因为自己懒得实现。 首先x在y里面出现,就意味y节点可以顺着fail回去。 反向建出一个fail数,然后搞出dfs序列。找出x对应的区间有多少个y。 再用离线操作,把每个y需要计算的x事先保存下来。 #include #include #include #include #include using namespace st... 阅读全文
posted @ 2016-04-28 23:51 invoid 阅读(204) 评论(0) 推荐(0)
摘要:st表。 st[i][j]表示[i,i+2^j-1]的最小的s的下标。 #include #include #include #include using namespace std; const int maxn = 500000 + 10; int n,k,L,R; int s[maxn],st[maxn][20],log[maxn]; struct Status { int... 阅读全文
posted @ 2016-04-26 23:49 invoid 阅读(185) 评论(0) 推荐(0)
摘要:最小费用最大流。 拆点法建模,一个点分为u0,u1。 虚拟源点S与每个u0连一条容量为1,费用为a[u]的边,与每个u1连一条容量为1,费用为0的边。 每个u0与虚拟汇点T连一条容量为1,费用为0的边。 每个u能到达v的点u1和v0连一条容量为1,费用为w的边。 为什么? 1.如果一个点是用瞬间移动到达的,就相当与从S点瞬间移动。 2.如果一个点是航路连去的,相当于从另一个点的... 阅读全文
posted @ 2016-04-26 20:46 invoid 阅读(182) 评论(0) 推荐(0)
摘要:2维bit。每个颜色建一个。 #include #include #include using namespace std; const int maxn = 300+10; struct Bit2D { int a[maxn][maxn],n,m; inline int lowbit(int x) { return x&-x; } ... 阅读全文
posted @ 2016-04-25 22:56 invoid 阅读(180) 评论(0) 推荐(0)
摘要:差分约束,dag最长路。 坑点在于有一个100000 长的链,虚拟节点倒序加就a了。 用queue是太懒,tyvj上过不了。 #include #include #include #include using namespace std; const int maxn = 100000 + 10; const int maxm = 400000 + 10; int n,k; i... 阅读全文
posted @ 2016-04-25 22:21 invoid 阅读(153) 评论(0) 推荐(0)
摘要:一定要想到是最小割。 虚拟源点S连支持者容量为1,反对者连虚拟汇点容量为1,支持者连反对者容量为1。 割俩面的点,一面是支持,一面是反对,冲突数就是割(哥。。雾)。 最小冲突数就是最小割。 #include #include #include using namespace std; const int maxn = 300 + 10; const int maxm = 100000... 阅读全文
posted @ 2016-04-25 20:54 invoid 阅读(172) 评论(0) 推荐(0)
摘要:欧拉函数。 首先设k为n的约数,则res+=(k*s(k))。s(k)为满足gcd(m,n)=k的m的个数。 因为gcd(m,n)=k,所以gcd(m/k,n/k)=1,则s(k) = phi(n/k)。 边界判断要注意。 每次加的为i和n/i。 如果i*i=n,要特判,否则会重复。 阅读全文
posted @ 2016-04-25 20:19 invoid 阅读(228) 评论(0) 推荐(0)
摘要:其实我觉得有些题不会做见见世面也是挺好的。。//蒟蒻本性 用一个T,在T范围的暴力求出,T范围之外的因为比较小所以近似。 #include #include #include #include using namespace std; const int maxn = 100000 + 10; const int T = 100; const double eps = 1e-8; in... 阅读全文
posted @ 2016-04-24 10:49 invoid 阅读(171) 评论(0) 推荐(0)
摘要:dp。方型棋盘不用说,矩形棋盘每个点先维护先上能达到的最大距离v。然后dp找出以自己的v最小时向左向右能达到最大的距离l,r。 因为最大矩形棋盘的宽度肯定等于某个点的v,我们又求出了每个v对应的最长距离(r-l+1),所以正确性得以保证。 还有一个小技巧,把横纵坐标和为奇数的点异或。就可以把原问题转化为求最大的01矩阵了。 #include #include #include usin... 阅读全文
posted @ 2016-04-24 09:54 invoid 阅读(280) 评论(0) 推荐(0)
摘要:cdq分治,dp。这道题太难了,我看了一上午一点头绪也没有//蒟蒻本性 连这篇题解都是边做边写的,要不就忘了(雾)。。 维护的是上凸包。 2.30 pm 终于过了,照着人家的题解打,居然都交了10多遍。//蒟蒻本性 首先,不难得到这样的结论:如果买就要把所有的钱都用完(买能挣钱,就要多买,不如其他的 阅读全文
posted @ 2016-04-16 17:03 invoid 阅读(177) 评论(0) 推荐(0)
摘要:AC自动机和DP。 f[i][j] 表示在匹配到第i位置,处于ac自动机的j节点。决策第(i+1)个字母,计算出转移到第j2节点。 f[i+1][j2] += f[i][j]; #include #include #include using namespace std; const int maxl = 100 + 10; const int maxn = 6000; const i... 阅读全文
posted @ 2016-04-15 20:17 invoid 阅读(253) 评论(0) 推荐(0)
摘要:DP,状态为f[i][j][k1][k2],表示第i个人,用了j个男孩,后缀中男生比女生多的数量最大值为k1,女生比男生多的数量最大值为k2.k1,k2 #include #include using namespace std; const int MOD = 12345678; const int maxn = 150 + 10; const int maxk = 20 + 10; long... 阅读全文
posted @ 2016-04-13 23:19 invoid 阅读(163) 评论(0) 推荐(0)
摘要:区间型splay,需要很多种操作。 #include #include #include using namespace std; const int maxn = 4000000 + 10; struct Editor { int l[maxn],r[maxn],f[maxn],s[maxn]; char c[maxn]; int pos,root,cnt; ... 阅读全文
posted @ 2016-04-13 22:52 invoid 阅读(146) 评论(0) 推荐(0)
摘要:DP。 每种排法的长度对应所有循环节长度的最小公倍数。 所以排法总数为和为n的几个数的最小公倍数的总数。 #include #include #include using namespace std; const int maxn = 1000 + 10; int cnt,n; long long f[maxn][maxn]; int prime[maxn]; bool not_pr... 阅读全文
posted @ 2016-04-13 21:45 invoid 阅读(142) 评论(0) 推荐(0)
摘要:最小割,边max为60w条! 虚拟源点连狼,容量为INF,羊连虚拟汇点,容量为INF。 狼和空格向旁边的空格和羊连容量为1的边 #include #include #include using namespace std; const int maxn = 100 + 10; const int maxm = 60000 + 10; const int maxv = 10000 + 1... 阅读全文
posted @ 2016-04-13 13:03 invoid 阅读(165) 评论(0) 推荐(0)
摘要:田忌赛马。 原理:(假设a队最大得分,得分为res) 1.如果a最小 > b最小,res += 2。 这样没必要用更大的a来解决这个b。 else 2.如果a最大 > b最小,res += 2。 这样没必要用更小的a解决这个b,这个b反正都要被解决,如果更小的a能解决这个b,那也能解决别的b。 else 3.上述两种情况不成立,就用a最小消耗b最大,b最大没人能打过,就用最弱的,a最小打... 阅读全文
posted @ 2016-04-12 23:26 invoid 阅读(141) 评论(0) 推荐(0)
摘要:二分图最大顺序匹配。 拿题目编号和锦囊编号建二分图,跑匈牙利算法。 #include #include #include using namespace std; const int maxn = 2000 + 10; const int maxm = 4000 + 10; int n,m,e; int v[maxn],next[maxm],h[maxn]; int p[maxn]; b... 阅读全文
posted @ 2016-04-12 21:59 invoid 阅读(288) 评论(0) 推荐(0)
摘要:二分图的最大匹配。将每个武器的俩个属性与这个武器连边。枚举属性,无法匹配就输出。 基本概念:(口述非官方) 二分图:把一个图的顶点分为俩部分,每部分的每个点之间都没有边相连。 匹配:在二分图中,找出一些边,每个边都没有公共点。 最大匹配:最大的匹配。 完美匹配:每个点都用上的匹配,2*边数 = 点数。 其实二分图的最大匹配可以用最大流算法来解释。每个边容量为1。但效率不高。 匈牙利算... 阅读全文
posted @ 2016-04-12 14:01 invoid 阅读(188) 评论(0) 推荐(0)
摘要:读入以后想枚举j,用个maxv[i][j]数组表示在第i行,从第j个开始n个的最大值。 后来再枚举i,记录最大值。 最小值同理。 复杂度O(abn)。 #include #include #include using namespace std; const int maxn = 1000; const int INF = 0x3f3f3f3f; int n,m,k,ans = ... 阅读全文
posted @ 2016-04-11 21:47 invoid 阅读(161) 评论(0) 推荐(0)
摘要:二分分值最大值lid,把所有的分值小于lid的边加入,如果图联通,证明可以。 #include #include #include using namespace std; const int maxn = 100000 + 10; const int maxm = 200000 + 10; int h[maxn],p = -1; int n,m,l,r,lid; int v[maxm]... 阅读全文
posted @ 2016-04-11 21:14 invoid 阅读(186) 评论(0) 推荐(0)
摘要:这道题分为俩步,第一是求最大流,第二是在第一问的残量网络上求最小费用流。 建图时俩个点直接连2条边,一条容量为f[i],费用为0,另一条容量为inf,费用为c[i].这样就可以跑俩个算法了 第二问设一个虚拟源点S与1连容量为k,费用为0的边,n与一个虚拟汇点T连容量为k,费用为0的边。这样一直跑,最 阅读全文
posted @ 2016-04-11 21:07 invoid 阅读(202) 评论(0) 推荐(0)
摘要:首先是O(nlogn) 的最长上升子序列,我居然一直不会。。。。(雾)。 用一个maxv[i] 数组表示长度为i的上升子序列的第一个数的最大值,这样就可以二分求当前上升子序列的长度了。 注意这道题字典序最小是指下标。 #include #include #include using namespace std; const int maxn = 10000 + 10; const in... 阅读全文
posted @ 2016-04-10 21:18 invoid 阅读(170) 评论(0) 推荐(0)
摘要:弦图最小染色。MCS(最大势)算法。定理为最小染色数 等于 最大团(最大完全子图(任意俩个节点都有一条边相连))。 1.必须是弦图。 弦图:对于任意长度大于3的环都存在弦的图。 弦:连接环上俩个不相邻节点的边。 反例:比方说5边形,它的最大团的节点数为2,但需要3种颜色才能染。 2.贪心,每回选已经被染色的邻接点数目最多的节点(编号最小)染色。 反例: 1——4——3——2,染完1以后应该... 阅读全文
posted @ 2016-04-10 18:14 invoid 阅读(376) 评论(0) 推荐(0)
摘要:最大流,首先建模。 设每个石柱分为出节点和入节点。 1.设一个虚拟源点,与每个初始有蜥蜴的石柱连一条容量为1的边。 2.设一个虚拟汇点,与每个能跳出来的石柱连一条容量为INF的边。 3.每一对距离小于d的点,出节点和入节点连一条容量为INF的边。 4.每个点的入节点和出节点连一条容量为石柱高度的边。 #include #include #include using namespac... 阅读全文
posted @ 2016-04-10 10:03 invoid 阅读(205) 评论(0) 推荐(0)
摘要:我抄的,lct。 转疯了。。 先建图保存父节点。剩下我也看不懂。。。先留个坑日后再补吧//能补上。。?。。。 #include #include #include using namespace std; const int maxn = 100000 + 10; char op[10]; int a,b,c,n,m; struct Edge { int to,next; } ... 阅读全文
posted @ 2016-04-09 21:34 invoid 阅读(171) 评论(0) 推荐(0)