[题意]给定n*m的数字矩阵,要求横着切A-1刀,对每块再分别竖着切B-1刀,是最小子矩阵最大. [算法]二分+贪心 [题解]还记得提高组2015跳石头吗?这道题做法一致,只不过拓展到二维而已. 二分最小子矩阵值,考虑行,对于每一刀贪心一行一行拓展到能切马上切. 对于行贪心中得到的若干行,通过列贪心确定是否能切(一列一列拓展). #include<cstdio> #include<cstring> #include<cctype> #include<cmath&g…
二分答案就可以了.... ----------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cctype>   using namespace std;   typedef long long ll;  …
[题意]给定有向图,边严格从大编号指向小编号,求前k短路.n<=1000,m<=10000,k<=100. [算法]归并+拓扑排序||A*求第k短路 [题解]因为此题自带拓扑序的特殊性,可以用归并写. f[i][j]表示从i出发的第j短路,将i出去的点的前k短路依次归并. 复杂度O(m*k). #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> us…
[算法]贪心+线段树 [题意]给定n个数字ci,m个区间[a,b](1<=a,b<=10^5),每个位置最多被ci个区间覆盖,求最多选择多少区间. 附加退化问题:全部ci=1,即求最多的不相交的区间. [题解]本题是区间和点之间的经典贪心,有两种经典做法,本质思想都是通过排序实现扫描线,细节根据题目不同而不同. 一.从区间角度出发,按区间右端点从小到大排序 然后再按左端点从大到小排序,从左到右能加就加. 感性理解:在对右影响一致的情况下,选择对左影响最小的. 证明:假设有最优决策序列S和当前决…
[算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土地x和y,若满足a[x]<=a[y]&&b[x]<=b[y],则x土地可无条件包含在y土地中,所以x土地可以忽略. 于是对长度从小到大排序,第二关键字对宽度从小到大排序,处理掉可被包…
[题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spfa,加slf优化后可过,但是这道题就没意思了. 理论上,最短路问题用spfa是不能保证复杂度的,但dijkstra的问题是不能处理负权边. 因为题目保证不能返回,实际上有向边将全图分成了几个部分.如果把仅由无向边连接的连通块看成点,则原图变成DAG. 对连通块内部进行dijkstra,在DAG上用拓…
[题意]n头牛,一些向前一些向后,每次可以使连续k头牛转身,求使旋转次数最小的k. [算法]贪心 [题解]这题题解很迷,大概思想是k没有单调性,故枚举k,从左到右扫描遇到一只向后的牛就旋转一次. 贪心正确性易证:旋转前面已经好的显然不可能更优,故往后旋转. 然后还有结尾不足k头牛算错……为什么?不知道. 实际数据好像k是有单调性的,可能数据太水. #include<cstdio> #include<cstring> #include<algorithm> using n…
[题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点未被删除且不能到达结点1,求最少的删除点个数. [算法]最小割 [题解]本题和1的区别是:1求的是最少的不能到达1的结点数,那么就把损坏点圈缩在不可达点的邻点. 本体求的是删除最少的点使c个点不可达,这样的要求就是典型的最小割. 每个点x连向x',容量为1,若是未被删除点则容量为inf. 将1的设为S,将报告点的出点连向T,问题转化为S-T最小割.…
[题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i][j]表示前i头牛特色为j的数量,则区间i~j平衡需要满足: sum[j][1]-sum[i-1][1]=sum[j][2]-sum[i-1][2]=sum[j][3]-sum[i-1][3]=... 移项可得,只须 sum[j][1]-sum[j][2]=sum[i-1][1]-sum[i-1][…
[题意]给定n头牛和m对大小关系,求最坏情况下至少还需要比较几对奶牛的大小(在未确定顺序的奶牛对中随机比较) [算法]floyd求传递闭包 [题解]可达说明大小已知,则不可达点对数量就是最少比较次数. 使用bitset优化传递闭包,复杂度O(n^3 /32). #include<cstdio> #include<bitset> #include<algorithm> using namespace std; ; int n,m; bitset<maxn>b[…
[算法]DP+数学优化 [题意]把n个1~m的数字分成k段,每段的价值为段内不同数字个数的平方,求最小总价值.n,m,ai<=40000 [题解] 参考自:WerKeyTom_FTD 令f[i]表示把前i个数分成若干段的最小价值. 转移中我们定义,从i开始往前到有j个不同的数的最小位置为b[j]. f[i]=f[b[j]-1]+j^2. 考虑最坏情况,每个数自成一段,则总价值为n. 所以当段内不同的数个数>√n时,就不可能是最优解了(此时价值>n). 所以f[i]=f[b[j]-1]+j…
[算法]动态规划 [题解] 万物皆动规,每时每刻都要想着DP!特别是这种明显可以序列递推的题目. 一个简单的思路是f[i]表示前i个选择合法方案(第i个可选可不选)的最大效率 f[i]=max(f[i-1],f[j-2]+sum[j~i]),j=i-k+1~i. 然后就可以把f[j]-sum[j+1]加入单调队列了. 单调队列其实很好写的,每次先弹出超限的,然后对于每个i把对应的东西比较队尾后加入队列就可以了. 当然DP优化肯定要先写普通DP来对照和对拍的. #include<cstdio>…
[算法]树型DP||树的重心(贪心) [题解] 两遍DFS,第一次得到所有节点子树的路径和,第二次给出除了该子树外其它部分的路径和,时时计算答案. long long!!! #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #define ll long long using namespace std; ; ];//边数组开大! int first[maxn],t…
http://www.lydsy.com/JudgeOnline/problem.php?id=1657 这一题一开始我想到了nlog^2n的做法...显然可做,但是麻烦.(就是二分+rmq) 然后我仔细的想了想,恩,对,单调栈可以完成...他们有传递性的.. 然后你懂的.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostrea…
http://www.lydsy.com/JudgeOnline/problem.php?id=1617 裸dp,很好做. 设f[i]表示i头牛到对岸所需最小时间.sum[i]表示运i头牛到对岸的时间(包括自己) 则 f[i]=min(f[j]+sum[i-j]+m) 0<=j<i #include <cstdio> #include <cstring> #include <cmath> #include <string> #include &l…
http://www.lydsy.com/JudgeOnline/problem.php?id=1616 我觉得bfs是可过的,但是交bfs上去是wa? 然后没办法看dp,原来这bfs能和dp联系在一起.. 很简单 f[i][x][y]表示i秒到(x, y)的方案数,那么累计四周的方案数即可 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <…
http://www.lydsy.com/JudgeOnline/problem.php?id=1681 太裸了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #de…
http://www.lydsy.com/JudgeOnline/problem.php?id=1638 一条边(u, v)经过的数量=度0到u的数量×v到n的数量 两次记忆化dfs算出他们即可 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include…
http://www.lydsy.com/JudgeOnline/problem.php?id=1615 这种题..... #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std;…
http://www.lydsy.com/JudgeOnline/problem.php?id=1637 很神思想.. 前缀和应用到了极点... 我们可以发现当数量一定时,这个区间最前边的牛的前边一个牛的前缀和等于这个区间最后边的牛的前缀和..(将0的牛变成-1,然后维护前缀和) 然后扫过去就行了... orz #include <cstdio> #include <cstring> #include <cmath> #include <string> #i…
http://www.lydsy.com/JudgeOnline/problem.php?id=1682 最小生成树裸题.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std;…
http://www.lydsy.com/JudgeOnline/problem.php?id=1639 同tyvj1359,http://www.cnblogs.com/iwtwiioi/p/3942145.html #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm&…
这题算是01分数规划吧2333 sum-a[i]*x[i]=c*(n-x[i]) 化简一下就是sum-(a[i]-c)*x[i]-nc=0,每次找最大的(a[i]-c)*x[i](子段和),如果结果<=0就是存在方案使sum-a[i]*x[i]=c*(n-x[i]). 注意要至少选一个…… #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define max…
http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开,然后拖到今天才来看看... sad.. 从不知道那里来的文档里边抄的: 康托展开就是一种特殊的哈希函数,它的使用范围是对于n个数的排列进行状态的压缩和存储.X=a[n]*(n-1)!+a[n-1]*(n-2)!+…+a[i]*(i-1)!+…+a[2]*1!+a[1]*0! 其中,a为整数,并且0<…
http://www.lydsy.com/JudgeOnline/problem.php?id=1827 仔细想想就好了,, 每个点维护两个值,一个是子树的费用,一个是除了子树和自己的费用.都可以用dfs做. 维护第一个就是简单的dp.d1[i]=sum{d1[j]+w(i, j)*son1[j]},j是i的子女 第二个就有些麻烦,因为要考虑的不只是这个点的父亲,还要考虑这个点父亲的子树. 那么 d2[i]=d2[fa]+w(fa, i)*son1[i]+d1[fa]-d1[i] 而在处理这些方…
http://www.lydsy.com/JudgeOnline/problem.php?id=3297 这题拖了很久呢... 很久以前写了个dfs,,但是tle了..... 然后一直想dp想不出来,写出来了又wa了.. 然后看到一英文题解,暂时就只会这样了.. 其实dp方程很简单...... f[i]=min(f[i], f[j]+a[x]),f[i]是个字符串,所以用cpp自带的string处理字典序.. #include <cstdio> #include <cstring>…
http://www.lydsy.com/JudgeOnline/problem.php?id=3400 既然是倍数我们转换成mod.. 设状态f[i][j]表示前i头牛modj的方案 那么答案显然是f[n][0] 其实这样就和背包差不多了,对于每个数 但是转移比较难理解?(自己好好想吧..) f[i][a%p]=1 (初始化自身状态 f[i][j]=f[i-1][j] (继承前边的状态 f[i][(j+a)%p]=(f[i][(j+a)%p]+f[i-1][j])从上一个阶段转移过来 #inc…
http://www.lydsy.com/JudgeOnline/problem.php?id=3399 贪心就是将两组排序,然后直接模拟即可.. 如果我们用a去匹配一个绝对值和它差不多的值,那么去匹配的那个位置显然要和它这个位置匹配,同样的高度差... 自己理解吧.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream&g…
http://www.lydsy.com/JudgeOnline/problem.php?id=1680 看不懂英文.. 题意是有n天,第i天生产的费用是c[i],要生产y[i]个产品,可以用当天的也可以用以前的(多生产的).每单位产品保存一天的费用是s.求最小费用 显然贪心,每次查找之前有没有哪一天保存到现在的价值最小,然后比较更新.. #include <cstdio> #include <cstring> #include <cmath> #include <…
http://www.lydsy.com/JudgeOnline/problem.php?id=3296 显然,每群能交流的群是个强联通块 然后求出scc的数量,答案就是scc-1 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <qu…