二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. --------------------------------------------------------------------------- #include<bits/stdc++.h>   #define rep(i, n) for(int i = 0; i < n; ++i) #define clr(x, c) memset(x, c, sizeof(x)) #defi…
1486: [HNOI2009]最小圈 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1022  Solved: 487[Submit][Status] Description 最开始写floyd求负环结果TLE了,改成dfs后速度变成原来的100+倍.反正还是比较神奇. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&…
Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Sample Output 3.66666667 HINT Source 额...APIO2017极限弱化版... 做法的话直接上分数规划的套路即可,没什么好说的; 二分后,相当判断有没有小于等于0的环,直接spfa判负环即可 但zz选手竟然T了两回,一次因为memset,一次是把进队次数卡的是n!!!(差不多只要100) #include<cstdio…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的环那就最好不过了,说明我们找到了这个环,但如果存在负环,则说明我们的x还可以更小,如果不存在负环,则说明我们的x大了.所以接下来的问题是如何判断负环了.可以用spfa,但bfs做的会TLE,因为每个点的松弛不具有连续性,如果用dfs写的话则效率会大大提高.2009集训队论文中有涉及.…
裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef long long ll; ,M=1e4+; ; inline int read(){ ,…
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46348771"); } 题解: 分数规划Qwq. 然而它卡判点入n次的那种spfa推断负环. 于是有了一种黑科技: 我们从枚举点 i 開始 dfs .然后扫到点 j 时.保持 i~j 这一条链上的点被标记,然后强行推…
Description 找出一个平均边权最小的圈. Solution 经典问题,二分答案判断有无负环. 但数据范围大,普通spfa会超时,于是用dfs判负环(快多了). 思路是dis设为0,枚举每个点u,如果d(u)+w<d(v)就搜v,如果搜到的节点曾搜到过说明找到了负环. 为什么是对的呢?对于一个负环,一定可以找到一个节点从这里开始走一直累加权值,权值一直为负. Code #include<cstdio> #include<algorithm> #include<c…
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v),b[i]=1\),问题转化为\(min(\frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]})\) 分数规划考虑二分答案,当前\(mid\)可能为答案当且仅当: \[ \frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]}…
题目链接http://vjudge.net/problem/viewProblem.action?id=34650 题目大意: 给定n个点m条边的加权有向图,求平均权值最小的回路.平均权值=路径权值之和/路径边数 我们可以通过找到他其中的最小和最大值,然后通过二分不断查找满足的点,然后尽可能的取到它的最大值,因为这里保留两位有效小数,所以设立 while(la-st>0.001)即可 找到一个满足的值是要建立在图上的每一条线段减去这个值后便能得到一个负圈,我们通常用spfa判负圈. 这个spfa…
Extended Traffic LightOJ-1074 这题因为涉及到减法和三次方,所以可能会出现负圈. 这里使用的算法叫做SPFA算法,这个可以用来判负圈和求解最短路.Bellman-Ford算法和SPFA算法很相似. 这里要注意的是cnt出现次数应该要在哪里加. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string>…
题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V)\)的权值定义为\(w_{i,j}\),令\(n=|V|\).\(c=(c_1,c_2,\cdots,c_k)(c_i\in V)\)是\(G\)中的一个圈当且仅当\((c_i,c_{i+1})(1\le i\lt k)\)和\((c_k,c_1)\)都在\(E\)中,这时称\(k\)为圈\(c\)…
[算法]二分+spfa [题解]据说这个叫分数规划? 0-1分数规划 二分答案a,则对于任意的环有w/k≤a即w-ak≤0,若满足条件则a变小,否则a变大. 因为w=w1+w2+...+wk,所以变形为(w1-a)+(w2-a)+...+(wk-a)≤0.于是问题转化为在图中找负环. 不过由于spfa限制,“=”没办法并入"<",但是由于精度足够,最后也就是1.00000000001≍1.00000000. 使用DFS的spfa:可以在发现更新到之前更新过的节点就认为是负环(从x…
  在机房的小伙伴提醒是二分之后,我想到了是判负环,所以我用spfa,而且我保持dis都是小于等于0,本以为这样就能过了,可是还是有一个点达到了3.8s左右(其他都是0.0几秒) 所以还是写了dfs版本,还是一样每次都保持dis小于等于0,当发现有一个点在栈中,你又可以更新他的dis,那么就有负环了 const maxn=; maxm=; inf=; var first:..maxn]of longint; next,last:..maxm]of longint; w:..maxm]of dou…
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2条路径与其相连.换句话讲,这些树和树之间的路径构成一张N个点.M条边的无向连通图,而度数大于2的点至多有1个.近年以来,栖息地频繁收到人类的侵扰.兔子们联合起来召开了一场会议,决定在其中K棵树上建造树洞.当危险来临时,每只兔子均会同时前往距离它最近的树洞躲避,路程中花费的时间在数值上等于距离.为了在…
题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因为,当使用的joker小于等于 x 时,才可以通过合适地安排顺序使得每组牌中至多有一张 joker . 代码 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio>…
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans) dp[i][j] 表示前i根木棍切了j次最大长度<=ans的方案数.sum[i]为1~i 的木棍长度和(前缀和).明显可以用滚动数组优化.然后又会发现, 对于每个dp[i][j]求和过程中,sum[i]不变,而sum[k]是单调递增,满足的k值是一连续的区间,且满足的最小k随i变大而变大,所以可以用…
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=105, M=1e5+5, INF=1e9+5;…
Digital collectible card games have become very popular recently. So Vova decided to try one of these. Vova has n cards in his collection. Each of these cards is characterised by its power pi, magic number ci and level li. Vova wants to build a deck…
题目大意:给定n个连在一起的木棍.分成m+1段.使每段最大值最小,求最大值的最小值及最大值最小时切割的方案数 第一问水爆了--二分答案妥妥秒过 第二问就有些难度了 首先我们令f[i][j]表示用前j个棒♂子得到i段的方案数 诶我没打什么奇怪的符号吧 于是我们有动规方程 f[i][j]=Σf[i-1][k] (sum[j]-sum[k]<=ans,k<j) 这个最坏情况下是O(m*n^2)的,肯定挂 我们发现k的下界是单调上升的 于是我们直接令k为当前j时k的下界.开一个变量记录k~j的f值之和…
传送门 解题思路 可以发现天兵不用管,答案的一个上界是\(2*k\),就是天兵一个个换.刚开始写了个拆\(6\)点的网络流,调了半天发现自己假了..说说正解,首先可以发现交换士兵其实就是种类的交换,那么可以对于每一个点算出它距离所有点的距离,距离就是最少换几次,这个可以\(spfa\)求出,之后发现这个很像二分图匹配,可以二分答案表示用几次超能力,然后跑二分图匹配即可. 代码 #include<iostream> #include<cstdio> #include<cstri…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1816 分析: 我先以为是道水题,但是要注意的是每套牌中Joker只能用1张的,所以就出现了可能目前每种牌的剩余牌数都够,但不一定不用Joker,然后就短路了…… 看了hzwer的blog顿时茅塞顿开,原来是二分…… 二分答案x,然后判定 判定的方法:注意每套牌顶多只有一个Joker,所以对于答案x,能用的Joker的最大数量是T=Min(x,m),然后枚举每种牌,将每种牌相对于答案x差的个数…
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连一条流量为k的边.两个人若互相喜欢则点1之间连边,不喜欢则点2之间连边 对于每个要验证的x值 将每个人的点1向源或汇连一条流量为x的边 然后二分答案跑最大流就可以 #include<cstdio> #include<cstring> #include<iostream> #…
题目链接 题面 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种: 1:(0,l,r)表示将区间[l,r]的数字升序排序 2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字. 输入输出格式 输入格式: 输入数据的第一行为两个整数n和m.n表示序列的长度,m表示局部排序的次数. 1 <= n, m…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案,把 >= mid 的设成1.< mid 的设成0,之后排序就变成区间赋值了. #include<cstdio> #include<cstring> #include<algorithm> #define ls Ls[cr] #define rs Rs[cr] using namespace std; ,M=N<<; int…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分出一段: 如果一个位置 i 有 rk[i] < rk[st],那么显然不用管( i 后缀的开头): 而如果 rk[i] > rk[st],则 i+1 ~ i+LCP 之间必须有一处断开: 比较麻烦的是这样只保证了 i 这个后缀的开头不会产生大于二分子串的子串,但后面怎么办? 这时就又需要考虑到——…
Wormholes POJ-3259 这题是最短路问题中判断是否存在负圈的模板题. 判断负圈的一个关键就是理解:如果在图中不存在从s可达的负圈,最短路径不会经过一个顶点两次.while循环最多执行v-1次. 这题还需要注意的是输入的w条边的权值是负值,因为这是虫洞边. package POJ; import java.util.*; public class POJ_3259 { static int f,n,m,w; public int from,to; public double rate…
前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄. --------------------- 题目链接 题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小.输出这个比值,保留8位小数.保证数据有解. --------------------- 转化一下题意.要求是使得$C=\frac{\sum\limits_{i=1}^k w[i]}{\sum\limits_{i=1}^k b[i]},b[i]=1$最小.等式变换,得到$\sum\limits_{i…
Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3129  Solved: 1543[Submit][Status][Discuss] Description Input   Output   Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Sample Output 3.66666667   二分法+spfa_dfs最小圈 可以经过计算在T=60次循环后,答案精度会在小数点后8位 #include<io…
因为没注意到long long 就 TLE 了... 二分一下答案就Ok了.. ------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>   #define rep( i , n ) for( int i = 0…
先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, sum为原序列的和. 假如二分的答案m是可行的, 那么 L + R = sum - n * m - mx 应该 <= 0 ------------------------------------------------------------------------------------- #inc…