上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 29 下一页
摘要: 这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便 先按起始时间从小到大排序。 我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去 阅读全文
posted @ 2018-05-02 21:19 lokiii 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 直接枚举两两牛之间的距离即可 cpp include include include using namespace std; const int N=10005; int n,a[N]; int read() { int r=0,f=1; char p=getchar(); while(p '9' 阅读全文
posted @ 2018-05-02 20:00 lokiii 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 把add传参里的double写成int我也是石乐志…… 首先这个东西长得就很01分数规划 然后我不会证为什么没有8字环,我们假装他没有 那么设len为环长 $$ ans \leq \frac{\sum_{i=1}^{len}f_i}{\sum_{i=1}^{len}t_i} $$ $$ ans \s 阅读全文
posted @ 2018-05-02 19:52 lokiii 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 设f[i]为i不选的最小损失,转移是f[i]=f[j]+e[i[(i j 1 include using namespace std; const int N=100005; int n,m,e[N],q[N],l,r; long long f[N],ans,mn=1e18; int read() 阅读全文
posted @ 2018-05-02 18:28 lokiii 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表 阅读全文
posted @ 2018-05-01 08:40 lokiii 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 满脑子dp简直魔性 模拟题意bfs转移即可 阅读全文
posted @ 2018-04-30 20:52 lokiii 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 设f[i]为i的方案数,f[1]=1,考虑转移,如果是奇数,那么就是f[i]=f[i 1]因为这1一定要加;否则f[i]=f[i 1]+f[i 1],就是上一位+1或者i/2位所有因子乘二 阅读全文
posted @ 2018-04-30 19:10 lokiii 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 先考虑只能往一边传播,最后正反两边就行 一向右传播为例,一头牛能听到的嚎叫是他左边的牛中与高度严格小于他并且和他之间没有更高的牛,用单调递减的栈维护即可 cpp include include using namespace std; const int N=50005; int n,a[N],v[ 阅读全文
posted @ 2018-04-29 21:47 lokiii 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 严格次小生成树模板 算法流程: 先用克鲁斯卡尔求最小生成树,然后给这个最小生成树树剖一下,维护边权转点权,维护最大值和严格次大值。 然后枚举没有被选入最小生成树的边,在最小生成树上查一下这条边的两端点的路径上的最长边,如果最长边等于枚举到的边的边权,那么选次长边(没有次长边的话直接跳过),然后在最小 阅读全文
posted @ 2018-04-29 20:53 lokiii 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 开一个单调递减的单调栈,然后用sum数组维护每个点的答案,新加点的时候一边退栈一边把退掉的点的sum加进来 cpp include include using namespace std; const int N=800005; int s[N],top,a[N],n,sum[N]; int rea 阅读全文
posted @ 2018-04-29 08:36 lokiii 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对…… 阅读全文
posted @ 2018-04-28 21:39 lokiii 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 正反加边分别跑spfa最短路,把两次最短路的和求个max就是答案 cpp include include include include using namespace std; const int N=2005,M=200005; int n,m,s,x[M],y[M],z[M],h[N],cnt 阅读全文
posted @ 2018-04-27 22:01 lokiii 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 最长上升子序列。虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j] include using namespace std; const int N=5005; int n,a[N],f[N],ans; int read() { int r=0,f=1; 阅读全文
posted @ 2018-04-27 21:26 lokiii 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 cpp include include include using namespace std; const int N=100005; int n,m,a[N],f 阅读全文
posted @ 2018-04-27 18:12 lokiii 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去 阅读全文
posted @ 2018-04-27 17:46 lokiii 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 模拟就行……讲道理这个时间复杂度为啥是对的??? cpp include include using namespace std; int k,n; int dfs(int v) { if(v 阅读全文
posted @ 2018-04-27 16:57 lokiii 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 好像是完全背包吧分不清了…… 好像是把数组二维压一维的时候,01背包倒序,完全背包正序 cpp include include using namespace std; const int N=105,H=55005; int n,h,p[N],c[N],f[H]; int main() { sca 阅读全文
posted @ 2018-04-27 16:29 lokiii 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1 include include using namespace std; int n,m,p[20],a[20]; long long f[20][1m) f[k][p[k]|i]+=f[j][i]; for(int i= 阅读全文
posted @ 2018-04-27 16:10 lokiii 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒 阅读全文
posted @ 2018-04-27 15:47 lokiii 阅读(143) 评论(0) 推荐(0) 编辑
摘要: t记录每个格子最早被砸的时间,bfs(x,y,t)表示当前状态为(x,y)格子,时间为t。因为bfs,所以先搜到的t一定小于后搜到的,所以一个格子搜一次就行 cpp include include include using namespace std; const int N=505,inf=1e 阅读全文
posted @ 2018-04-27 15:36 lokiii 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 先把已有的边并查集了,然后MST即可 记得开double cpp include include include include using namespace std; const int N=1005; int n,m,f[N],con,tot; double x[N],y[N],ans; st 阅读全文
posted @ 2018-04-27 14:37 lokiii 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 写了个bfs发现MLE了... 设f[t][i][j]为在t时刻走到(i,j)的方案数,转移和bfs一样 cpp include include using namespace std; const int N=105,dx[]={1, 1,0,0},dy[]={0,0, 1,1}; int n,m 阅读全文
posted @ 2018-04-27 14:06 lokiii 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 模拟 阅读全文
posted @ 2018-04-27 11:25 lokiii 阅读(147) 评论(0) 推荐(0) 编辑
摘要: ……我为什么要写这种题解…… 枚举投掷情况即可 阅读全文
posted @ 2018-04-27 11:20 lokiii 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 一棵树,碰到改变转向的边就异或一下,从1dfs一遍 cpp include include using namespace std; const int N=1005; int n,h[N],cnt,v[N]; struct qwe { int ne,to,va; }e[N'9'||p='0'&&p 阅读全文
posted @ 2018-04-27 11:12 lokiii 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 从叶子往上先拓扑一下,建立虚拟root,从root开始dfs。注意到每个点的最优取值一定是一个区间(中位数区间),从儿子区间推出父亲区间即可 cpp include include include include using namespace std; const int N=500005; in 阅读全文
posted @ 2018-04-27 10:58 lokiii 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 不知道算不算博弈 很妙的贪心,一直在想SG函数结果... 首先从大到小排个序,然后考虑当前的人要怎么选:如果不选最后一段,那么另一人会选,这样不利于当前的人,所以每个人一定会选最后一段 设f[i]为要选i了,先手的最大差,显然是max(a[i] f[i 1],f[i 1]),就是先手只选了最后一个和 阅读全文
posted @ 2018-04-26 17:58 lokiii 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 参考:http://www.cnblogs.com/clrs97/p/5125976.html 瞎搞约数失败...滚去搜索 dfs(x,y,z) 表示当前可选第x到第m个约数,还要选y个约数,已有z的乘积,搜的时候减掉大于n的情况 阅读全文
posted @ 2018-04-26 17:34 lokiii 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 参考:https://www.cnblogs.com/spfa/p/7495438.html 为什么邻接表会TTTTTTTLE啊...只能用vector? 把点按照点权从大到小排序,把无向边变成排名靠前的点连向排名靠后的点的有向边并记录出度d[u],用map记录一下联通,这样可以避免重复计算 按排名 阅读全文
posted @ 2018-04-26 16:01 lokiii 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 先打能回血的,按消耗从小到大打; 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样); 中间体力小于0就输出无解 cpp include include include using namespace std; const int N=100005; int n,t1,t2; lo 阅读全文
posted @ 2018-04-26 12:04 lokiii 阅读(141) 评论(0) 推荐(0) 编辑
上一页 1 ··· 16 17 18 19 20 21 22 23 24 ··· 29 下一页