10 2018 档案
摘要:最小值最大,就二分判断。 map[i] = '0'+map[i];这样更方便 每个点拆成i,i’, S连i,cap为a[i],i’连T,cap为1(保证至少剩一个)或mid。 i,i’ ,a[i] i->j’, inf //把i连到j就WA了...所以题目的意思大概是只能移动到相邻点? 判断一下bo
阅读全文
摘要:init 一开始搞成2*n+2了...囧 所以初始化很重要! 然后提交的时候忘了删调试的数据了。。囧 技巧:设立虚拟节点 建图比较麻烦(非常)。 要考虑到保养完了的车可以免费再用 设立S,T ,1-N, N+1-2N S连1-N,cap为ri,cost为0,表示用了的还没维护的车,还要链i,i+1
阅读全文
摘要:点连通度:最少删除几个点使图不连通 拆点就变成了最小割 注意编号。画图就知道u’连v,v’连u。 技巧:不需要枚举S,T。固定S,枚举T即可 这种输入很烦, scanf(" (%d,%d)", &u, &v); Scanf中添加 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或
阅读全文
摘要:题外话:很多混合图问题可以转化为有向图问题(将无向边拆为两条有向边) 本题不行,因为只能经过一次 这种问题能想到网络流。。 复习欧拉回路:入度==出度 和uva1380有点相似,要先给无向边定向。原图为G,定向的边单独组成另一个G’ 定向后对任意点,入度==出度,则有了回路。 否则调整原来的无向边。
阅读全文
摘要:这里就想到了lrj说的理解EK但是使用Dinic 因为图较大,所以采用Dinic而不是EdmondsKarp 得益于接口一致性,无须理解Dinic就能使用它。 看到最小费用,又有隔开的操作(割),就是最小割,就想到了最大流(想了想用不到MCMF,这里挺需要注意的,所有网络流的题首先判断是MCMF还是
阅读全文
摘要:证明: 对于每一个X节点,都是只有一个入流,多个出流(分别流向每一个Y节点),显然多个出流的和正好等于入流;同理,对于每一个Y节点,有多个入流(分别来自每一个X节点),只有一个出流,显然多个入流的和等于出流。第一类弧,以每一行所有元素之和为容量;第三类弧,以每一列所有元素之和为容量;第二类弧,最终流
阅读全文
摘要:拆点法是很套路的方法,将一个点拆为i和i',连边,cap为1,cost为0. 编号:点2~n-1拆成弧i->i',前者编号为0~n-1,后者编号为n~2n-3 (i+n-2) 本题拆点后从1-v求流量为2的最小费用流 while(flow < flow_limit && BellmanFord(s,
阅读全文
摘要:网络流的问题一般都会加S,T! 网络流init参数一般为节点数(包括S,T) maxn为点数+一点(注意可能加点,拆点...) 把插头看做结点,增加S,T链接设备和插头(容量为1),转换器作为边(容量无穷大),套模板。用的是紫书第二种方法,因为更喜欢思维直接一点的方式。 读取输入时用一个ID函数方便
阅读全文
摘要:白书第一章例题4 思维。 先固定一点不动,假设最后一共N个点,那么编号为0,1,...N-1, 0不动,原来的n个点分别占据i/n*N的位置(记为pos),移动到pos四舍五入的位置即可。 证明一:有一个坐标未移动,见例题3(UVA11300) 证明二:没有点移动到相同位置。 假设x,y移动到相同位
阅读全文
摘要:白书第一章例题6 构造。思维。几何。 分别从几个角度去看,有矛盾就删掉,最后遍历一下统计个数 方法证明:第一个方块肯定要删除。假设前k个必须删除,第k+1个矛盾出现,假如不删掉,矛盾将持续存在,故必须删掉。 代码有很多细节。 比如注意宏定义加() //#define REP(i,n) for(int
阅读全文
摘要:白书第一章例题7 很套路了。枚举第一行,可以直接算出之后的几行。 #include <iostream> using namespace std; #include <stdio.h> #include <cstring> #define INF 10000000 int grid[20][20];
阅读全文
摘要:白书第一章例题8 好麻烦! 正方体每面编号为0-5,那么根据顶点和正面,就能确定形态。一共6*4=24种形态。 P[i]表示编号i所在位置。比如P[1]=3,表示第二面转到了第四面。 就可以表示出所有形态。 这时候可以手算或者写个函数找出所有形态。 注意选择函数计算,要放到main外面,方便调。 注
阅读全文
摘要:习题9-9 注意前提是最小值最大。很少做两次dp的题。 初始化要细心。
阅读全文
摘要:状压dp 要再看看 例题9-17
阅读全文
摘要:最短路算法的复杂度考虑 书上已经做了优化,用的是优先队列;用优先队列实现堆优化 V为点集,E为边集 从O(V^2)优化到O(ElogV) 然后再记忆一下inf 0x3f3f3f3f的十进制是1061109567,是10^9级别的而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现
阅读全文
摘要:#include #include using namespace std; const int maxk = 100; const int maxa = 63; unsigned long long d[maxk+1][maxa+1]; int main() { memset(d, 0, sizeof(d)); for(int i = 1; i > k >> n && k) { ...
阅读全文
摘要:感觉这道题读题有点难。。似乎和现实联系的比较密切1.每个process的两个资源可以顺序反一下2.p->q,q->s不可以同时进行 p->q,p->s可以 输出最长等待链输出每个process的资源调用顺序 (注意按输入顺序输出,并不意味着按输入顺序先后执行,只是输出方便看) 把资源看成点,一个pr
阅读全文
摘要:这道题思维很灵活。也有点套路的意思。 首先规定0,1分别按照原来的顺序接收,只是01换位。这样简化了思维。(否则并不会有更优结果它。,比较好想)最大值和最小值可以贪心得到。那么接下来就是给定一个整数P,判断能不能得到它。贪心法,从左到右判断P的每一位,从K中最左边的0或1取。这样会发现任意时刻k中已
阅读全文
摘要:注意这题要求互相认识不认识的人之间连一条线一个人在组1,那么不认识(互相认识)的人就在组0;同时这些人不认识的人就在组1.每个联通分量都可以独立推导,遇到矛盾则无解一个联通分量有一个核心,其他的点是分支我感觉紫书写的样例又是有点问题,应该是4在0,那么135在1,反正则反;而不是1在0,345在1然
阅读全文
摘要:fixing great wall 的变形dp(i,j,k,p)不考虑i-j的客人,还要送k个人,目前位置在p起点i和总数量k都要枚举dp(i,j,k,p)=max(dp(m,j,k-1,p)+valm,dp(i,d,k-1,p)+vald) 画一下图,就发现每个点罚时是当前k*abs【pi】
阅读全文
摘要:常见思路枚举最后一个方块A【j】何时消除 对于dp(i,j,k)就两种决策:转移到dp(i,p-1,0)+(j-p+1+k)^2 枚举q<p,A【q】=A【j】,A【q】!=A【q+1】,转移到d(q+1,p-1,0)+dp(i,q,j-p+k)
阅读全文
摘要:这道题超经典。dp和优化都值得看一看。因为i+1只和i有关,用滚动数组节省空间暑假第一次做感觉很困难,现在看就清晰了很多
阅读全文
摘要:按紫书来注意这道题的题目给了很大的方便,就相当于验证k是不是答案,不是的话就是k+1
阅读全文
摘要:我觉得这个题挺难的......首先这个题的结论 hp+kd我没有证明出来(范围肯定没有问题,根据数量少的时候和感觉就觉得是对的,但是没有严格的证明) dp[i][x]就是在dp[i-1][x-d x+d]中找一个最小值转移,再加上常数|h[i]-x|,这样就可以用优先队列来优化。虽然说是用单调队列来
阅读全文
摘要:用到了kase避免memset超时
阅读全文
摘要:更简单的做法:定义状态dp[i][j]表示在已经用了i根火柴的情况下拼出来了剩余部分(是剩余部分,不是已经拼出来了的)为j(需要%m)的最大长度,一个辅助数组p[i][j]表示状态[i][j]的最高位是往后添加kdp[i][j]=max(dp[i][j],dp[i-c[k]][(j*10+k)%m]
阅读全文
摘要:第k大的题一般都有点麻烦 pbds库的tree,需要研究一下https://codeforces.com/blog/entry/11080find_by_order() and order_of_key(). The first returns an iterator to the k-th lar
阅读全文
摘要:Dreamoon and MRT 题目链接: http://codeforces.com/group/gRkn7bDfsN/contest/212299/problem/B 只需要考虑相对位置,设a0位置为0枚举由于对称性,可以设第一步向右,这样总时间减少一半递归的话省去了cnt部分,直接从O(N2
阅读全文
摘要:见紫书。(c,h)的更新策略://前面的高度为0了,直接插入因为ans c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从左到右扫描一遍 #include<cstdio> #include<cstring> #include<
阅读全文
摘要:每次找到两边离中心最高的板,如果等,再找外围的最高版...画图便于理解两边先找到距离(-1,1)最近的最大值L和R,因为可能存在多个最高的挡板。接着比较两个L和R的大小,相等的话分别分析两边,取最小值注意L和R一边高的话两边都会流,所以这块的时间要乘2。比如分析右边,从最外围开始,顶部画平行线往内部
阅读全文
摘要:单调队列,滑动窗口 int t=0; while(scanf("%d",&n)==1){ if(t) printf("\n"); //有点方便 单调队列用deque很方便 for(int i=1;i<=n;i++){ 维护单调队列 while(!q.empty()&&a[i]<=a[q.back()
阅读全文
摘要:边读入边处理 优化了速度一开始有想错了的地方。处理输入有点想用stringstream, 的问题在于他把字符串连续的数字作为一个整体,遇到空格才分开,所以不适用
阅读全文
摘要:先证明把每次i放到i位置最后次数最少:感觉,可以,用归纳法? //在序列后再加一个相同的序列,就可以模拟用各个数字开头的情况了每个位置不对的只需要换一次54123 ,5固定->41235变成12345 任何一个数固定不变,都相当于从这种情况对应的1所在的位置开始排一遍12345.(例如54123 ,
阅读全文
摘要:贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可。再处理一下空队列的情况。很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成所需时间排序首先队列里的都是能完成的策略:新加入的,如果在前面的完成后仍能完成,就直接加进去;不能,
阅读全文
摘要:画图,每个给出点都有对应区间;先sort,再尽量靠右选;很常见的套路了..//注意不要越界(0,L) struct Q //复习结构{ double l,r; Q(double _l,double _r):l(_l),r(_r){} bool operator < (const Q &a) cons
阅读全文
摘要:贪心部分的理论依据:前i个数可以凑出1~sum[i]的所有整数。 证明:第二类数学归纳,n=1时成立,假设n=k之前所有项都成立,当n=k+1时。sum[k+1]=sum[k]+a[k+1]。只需证明能凑出sum[k]+1~sum[k+1]间的整数即可。设1≤p≤a[k+1],sum[k]+p=su
阅读全文
摘要:题目要求k>=最大度数;观察,颜色数量和度数的关系,得颜色数=最大度数+1(偶数)//最大度数(奇数) 可以满足染色关系一个点和周围的点的颜色数加起来最大为它的度数+1; k=所有点中最大的度。如果最大入度是偶数,则k+1。证明:当最大度数为奇数n,设点u所连n个点,点u为1,n-1个点不一样,1个
阅读全文
摘要:和cf的打分有点像啊 因为一共只有三道题,所以每个人的得分最多有8种可能性。把这8种可能性都算出来,存在数组里,排好序备用排名就是一个天然的链表,给出了扫描的顺序扫描时,维护两个变量:前一个player的最大得分 recd 和他的ID recdID扫描到每个player时,从大到小遍历他的8种得分,
阅读全文
摘要:逆序做,逆序输出 紫书上的描述有点问题 感觉很经典 ans.push_back(2); a.insert(a.begin(),a[n-1]); a.erase(a.end()-1); a.push_back(k);vector 的操作 没有证明这样做的复杂度要求...
阅读全文
摘要:类似煎饼,先把1放到1,之后是子问题 (先放到前一半,再放到开头,两次操作)(任何位置,最多一次就可以放到前一半))
阅读全文
摘要:首先根据题意,既然0能变1,问号能变任何。那么不能变成T串的情况只能是S串中的1大于T串中1的个数。 然后考虑能够成为T串的情况。首先,不相同的0和不相同的1首先进行置换,因为这样置换只需进行一次操作,比其它任何情况都优。交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0
阅读全文
摘要:细节值得注意 注意vector<string>是可以直接sort的!
阅读全文
摘要:连通器向左向右扫描两次即可每一段有水的连通区域,高度必须相同,且不超过最低天花板高度if(p[i] > level) level = p[i]; 被隔断,要上升(隔断后,之前的就不变了,之后的从p【i】开始) if(s[i] < level) level = s[i]; h[i] = level;左
阅读全文
摘要:思维 创造条件使一轮比赛之后仍满足1号打败至少一半,并剩下至少一个t' 紫书上的思路很清晰阶段1,3保证黑色至少消灭1半 #include<cstdio> #include<vector> using namespace std; const int maxn = 1024 + 5; char ta
阅读全文
摘要:某个序列找到唯一元素后,判断被分成的两边的序列即可问题在于找到唯一元素连续序列,重复元素的问题;感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置复杂度计算有点思考;记录last,next,那么对于一个元素,判断是否独立O(1)从头开始查找,最坏情况T(n)=T(n-1)
阅读全文
摘要:注意理解题意,不是排列种类,而是下一个排序出现的时间滑动窗口,具体见代码,写了很多注释(紫书的思路1理解有点麻烦...)注:可以画一个轴来方便理解
阅读全文
摘要:思路:枚举点t,寻找满足条件的点t'; 计sum[i]为前i项合,平均值即为sum[t]-sum[t'-1]/t-t'+1 设(Pi=(i,Si),表示点在s中的位置,那么就可以画出坐标图,问题就转化为斜率最大; 于是画图分析。 几个点之间只有上凸下凸两种情况,取3个点为符合条件(t-t'>=L)的
阅读全文