06 2018 档案

摘要:有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于每一段dfs找合法方案即可,注意dfs中需要退回并查集,所以用不路径压缩的并查集 然后根据乘法定理, 阅读全文
posted @ 2018-06-30 23:05 lokiii 阅读(157) 评论(0) 推荐(0)
摘要:不知道该叫贪心还是dp 倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值。先手显然是取最大的,当后手取到比先手大的时候就交换 cpp include include using namespace std; const int N=700005; int n,a[N],w= 阅读全文
posted @ 2018-06-30 16:13 lokiii 阅读(131) 评论(0) 推荐(0)
摘要:n+1个坐标可以列出n个方程,以二维为例,设圆心为(x,y),给出三个点分别是(a1,b1),(a2,b2),(a3,b3) 因为圆上各点到圆心的距离相同,于是可以列出距离方程 $$ (a1 x)^2+(b1 y)^2=(a2 x)^2+(b2 y)^2 $$ $$ (a1 x)^2+(b1 y)^ 阅读全文
posted @ 2018-06-30 14:17 lokiii 阅读(171) 评论(0) 推荐(1)
摘要:按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 cpp include include include using namespace std; const int N=50005; int m,n,c,ans; struct xds 阅读全文
posted @ 2018-06-30 08:57 lokiii 阅读(112) 评论(0) 推荐(0)
摘要:cdq复健.jpg 首先列个n方递推,设sf是f的前缀和,st是t的前缀和: $$ f[i]=min(f[j]+s (sf[n] sf[j])+st[i] (sf[i] sf[j])) $$ 然后移项: $$ f[i]=f[j]+s sf[n] s sf[j]+st[i] sf[i] st[i] s 阅读全文
posted @ 2018-06-28 22:51 lokiii 阅读(167) 评论(0) 推荐(0)
摘要:直接跑最短路就行了……还不用判负环 cpp include include include using namespace std; const int N=25005,inf=1e9; int n,r,p,s,h[N],cnt,dis[N]; bool v[N]; struct qwe { int 阅读全文
posted @ 2018-06-27 22:35 lokiii 阅读(222) 评论(0) 推荐(0)
摘要:C Minimization 枚举就可以了 因为最后一定会变成1,所以第一次操作的区间就包含1会比较优,然后枚举1在第一次操作区间里排第几个取min即可 D Snuke Numbers 卡死在这道题上了,思路比较迷 首先打表发现,Snuke数只会出现在结尾为9,99,999,9999……的数中,9的 阅读全文
posted @ 2018-06-27 21:39 lokiii 阅读(258) 评论(0) 推荐(0)
摘要:意识流虚树 首先考虑只有一个党派,那么可以O(n)求树的直径,步骤是随便指定一个根然后找距离根最远点,然后再找距离这个最远点最远的点,那么最远点和距离这个最远点最远的点之间的距离就是直径 那么考虑多党派,也这样做,假如有一棵只有这个党派的牛构成的虚树,那么求直径也可以按照上面的做法 但是实际上并不用 阅读全文
posted @ 2018-06-23 11:44 lokiii 阅读(141) 评论(0) 推荐(0)
摘要:真是神奇 根据斐波那契数列,这个a[i] include using namespace std; const int N=1005; int n; long long a[N],b[N],tot,s[N],c,ans; void dfs(int w,long long v) { if(v+s[w 阅读全文
posted @ 2018-06-23 09:52 lokiii 阅读(126) 评论(0) 推荐(0)
摘要:原来强行转int可以避免四舍五入啊 cpp include include using namespace std; int r,y; double m; int main() { scanf("%d%lf%d",&r,&m,&y); double l=1.0+(double)r/100.0; fo 阅读全文
posted @ 2018-06-22 22:23 lokiii 阅读(145) 评论(0) 推荐(0)
摘要:i的初始化写成2了于是成功查错2h……怕不是个傻子 设f[i][j]为第i根高为j,转移是 $$ f[i][j]=min(f[i 1][k]+abs(k j) c+(j h[i])^2)(j =h[i],k =h[i 1]) $$ 时间复杂度是1e5\ 1e2\ 1e2,空间复杂度是1e5\ 1e2 阅读全文
posted @ 2018-06-22 22:13 lokiii 阅读(148) 评论(0) 推荐(0)
摘要:bfs预处理出每个点s和t的距离d1和d2(无法到达标为inf),然后在若干灌木丛格子(x,y)里取min(d1[x][y]+d2[x][y]) cpp / 0:贝茜可以通过的空地 1:由于各种原因而不可通行的区域 2:贝茜现在所在的位置 3:骑士们的位置 4:长着贝茜需要的灌木的土地 / incl 阅读全文
posted @ 2018-06-20 22:24 lokiii 阅读(136) 评论(0) 推荐(0)
摘要:思路还是挺好玩的 首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的 第一反应是改树状数组,但是显然不太现实,但是可以这样想,就是现在统计子树之前把查到的答案减去,然后再查子树最后加上查到的答案,这样相当于去重了 方便起见, 阅读全文
posted @ 2018-06-19 18:27 lokiii 阅读(103) 评论(0) 推荐(0)
摘要:参考:http://www.cnblogs.com/lidaxin/p/5240220.html 虽然splay会方便很多,但是~~懒得写~~,于是写了cdq 首先要想到贪心的思路,因为如果在某天买入是能得到最大收益的,那么应该用所有钱去买,相对的如果在某天卖出能得到最大收益,那么应该全部卖出 方便 阅读全文
posted @ 2018-06-19 17:24 lokiii 阅读(163) 评论(0) 推荐(0)
摘要:裸的最大生成树,注意判不连通情况 cpp include include include using namespace std; const int N=20005; int n,m,f[N],con; long long ans; struct qwe { int u,v,w; }a[N]; b 阅读全文
posted @ 2018-06-16 22:07 lokiii 阅读(115) 评论(0) 推荐(0)
摘要:差分约束裸题,用了比较蠢的方法,先dfs_spfa判负环,再bfs_spfa跑最短路 注意到“奶牛排在队伍中的顺序和它们的编号是相同的”,所以\\( d_i d_{i 1} =0 \\),连(i,i 1,0);然后对于\\( d_i d_j=D d_j d_i include include inc 阅读全文
posted @ 2018-06-16 21:55 lokiii 阅读(96) 评论(0) 推荐(0)
摘要:很像贪心的dp啊 这个定金尾款的设定让我想起了lolita和jk制服的尾款地狱…… 设f[i][j]为从j到i的付定金的最早月份然后从f[k][j 1]转移来,两种转移f[i][j]=min(f[i][j],f[j 1][k]+1)是当前这个月付[k 1,j 1]的尾款和[j,i]的定金,f[i][ 阅读全文
posted @ 2018-06-16 10:35 lokiii 阅读(106) 评论(0) 推荐(0)
摘要:枚举分母,然后离他最近的分子只有两个,分别判断一下能不能用来更新答案即可 cpp include include include using namespace std; int a,b,aa,ab; double mx=10; void wk(int x,int y) { if(x b==y a) 阅读全文
posted @ 2018-06-09 14:17 lokiii 阅读(129) 评论(0) 推荐(0)
摘要:就是区间dp啦f[i][j]表示以i开头的长为j+1的一段的答案,转移是f[i][j]=s[i+l] s[i 1]+min(f[i][j 1],f[i+1][j 1]),初始是f[i][1]=a[i] 于是可以把j维推掉 cpp include include using namespace std 阅读全文
posted @ 2018-06-08 17:25 lokiii 阅读(155) 评论(0) 推荐(0)
摘要:本来是冲着搜索去的……其实可以贪心 因为能改变第一位的只有第一位和第二位,然后改完之后后面的同理,也就是说只要贪心的推一遍就可以 但是注意要在翻第一个和不翻第一个之间取个min cpp include include include using namespace std; const int N= 阅读全文
posted @ 2018-06-07 16:11 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:欸我一直以为双向bfs是搜完一半再搜另一半呢,妹想到是两个一起搜 然后队列里放的结构体里不能直接存答案,所以做一个邻接表一样的东西,直接指向需要的字符即可 记录状态用康托展开来hash 以及居然是多组数据啊?! cpp include include include include using na 阅读全文
posted @ 2018-06-06 18:46 lokiii 阅读(188) 评论(0) 推荐(0)
摘要:A. Infinity Gauntlet 模拟就行了(不过这个题面啊……) cpp include include include include using namespace std; int n; string s[10]; maphas; mapv; int main() { has["pu 阅读全文
posted @ 2018-06-02 14:36 lokiii 阅读(167) 评论(0) 推荐(0)
摘要:A. Antipalindrome 还以为是什么神dp结果就是分情况讨论啊 原串是一串一样的字符的话输出0,是回文串的话输出n 1,否则直接输出原串长度 cpp include include using namespace std; const int N=200005; int n,d[N],s 阅读全文
posted @ 2018-06-02 14:22 lokiii 阅读(151) 评论(0) 推荐(0)