04 2018 档案

摘要:满脑子dp简直魔性 模拟题意bfs转移即可 阅读全文
posted @ 2018-04-30 20:52 lokiii 阅读(132) 评论(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 阅读(108) 评论(0) 推荐(0)
摘要:先考虑只能往一边传播,最后正反两边就行 一向右传播为例,一头牛能听到的嚎叫是他左边的牛中与高度严格小于他并且和他之间没有更高的牛,用单调递减的栈维护即可 cpp include include using namespace std; const int N=50005; int n,a[N],v[ 阅读全文
posted @ 2018-04-29 21:47 lokiii 阅读(188) 评论(0) 推荐(0)
摘要:严格次小生成树模板 算法流程: 先用克鲁斯卡尔求最小生成树,然后给这个最小生成树树剖一下,维护边权转点权,维护最大值和严格次大值。 然后枚举没有被选入最小生成树的边,在最小生成树上查一下这条边的两端点的路径上的最长边,如果最长边等于枚举到的边的边权,那么选次长边(没有次长边的话直接跳过),然后在最小 阅读全文
posted @ 2018-04-29 20:53 lokiii 阅读(349) 评论(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 阅读(140) 评论(0) 推荐(0)
摘要:严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对…… 阅读全文
posted @ 2018-04-28 21:39 lokiii 阅读(193) 评论(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 阅读(168) 评论(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 阅读(236) 评论(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 阅读(173) 评论(0) 推荐(0)
摘要:先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去 阅读全文
posted @ 2018-04-27 17:46 lokiii 阅读(172) 评论(0) 推荐(0)
摘要:模拟就行……讲道理这个时间复杂度为啥是对的??? cpp include include using namespace std; int k,n; int dfs(int v) { if(v 阅读全文
posted @ 2018-04-27 16:57 lokiii 阅读(159) 评论(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 阅读(133) 评论(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 阅读(111) 评论(0) 推荐(0)
摘要:如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒 阅读全文
posted @ 2018-04-27 15:47 lokiii 阅读(155) 评论(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 阅读(139) 评论(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 阅读(120) 评论(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 阅读(118) 评论(0) 推荐(0)
摘要:……我为什么要写这种题解…… 枚举投掷情况即可 阅读全文
posted @ 2018-04-27 11:20 lokiii 阅读(141) 评论(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 阅读(118) 评论(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 阅读(185) 评论(0) 推荐(0)
摘要:不知道算不算博弈 很妙的贪心,一直在想SG函数结果... 首先从大到小排个序,然后考虑当前的人要怎么选:如果不选最后一段,那么另一人会选,这样不利于当前的人,所以每个人一定会选最后一段 设f[i]为要选i了,先手的最大差,显然是max(a[i] f[i 1],f[i 1]),就是先手只选了最后一个和 阅读全文
posted @ 2018-04-26 17:58 lokiii 阅读(144) 评论(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 阅读(198) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/spfa/p/7495438.html 为什么邻接表会TTTTTTTLE啊...只能用vector? 把点按照点权从大到小排序,把无向边变成排名靠前的点连向排名靠后的点的有向边并记录出度d[u],用map记录一下联通,这样可以避免重复计算 按排名 阅读全文
posted @ 2018-04-26 16:01 lokiii 阅读(170) 评论(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 阅读(159) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/aarongzk/article/details/48883741 没想到吧.jpg 来自题解: “如果用sum[i]表示前i个杯子底球的总数,那么知道一个c[i][j],等于是知道了sum[j]和sum[i 1]的差的奇偶性。而sum[0]的奇偶性 阅读全文
posted @ 2018-04-26 11:25 lokiii 阅读(132) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/clove_unique/article/details/57405845 死活不过样例看了题解才发现要用double.... $$ a_j \leq a_i+p \sqrt{abs(i j)} $$ $$ p\geq a_j+\sqrt{abs(i 阅读全文
posted @ 2018-04-26 10:59 lokiii 阅读(120) 评论(0) 推荐(0)
摘要:首先处理处理出来哪些边能连——能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包上点的方案数,初始状态是相邻点f[i][i+1]=1,转移是 $$ f[i][j]=\sum_{k= 阅读全文
posted @ 2018-04-26 09:26 lokiii 阅读(260) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走完来回了,转移显然是 $$ f[i]=min{max(f[j]+i j 1,a[i])+i j 1+ 阅读全文
posted @ 2018-04-25 21:15 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/iwtwiioi/p/4986316.html 注意区间长度为1e5级别。 则假设n个数不全相同,那么他们的gcd小于最大数 最小数,证明:则gcdk2−gcdk1=gcd(k2−k1) d 所以特判一下全相等的情况就行利润 然后把区间除以k,这 阅读全文
posted @ 2018-04-25 19:35 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max cpp include include include include using namespace std; const int N=100005; int n,m,a[N],cur=1,c 阅读全文
posted @ 2018-04-25 17:26 lokiii 阅读(131) 评论(0) 推荐(0)
摘要:二分答案,然后把边权大于二分值的的边赋值为1,其他边赋值为0,然后跑spfa最短路看是否满足小于等于k条边在最短路上 阅读全文
posted @ 2018-04-25 14:19 lokiii 阅读(165) 评论(0) 推荐(0)
摘要:注意输出是80字符个一行!! 首先贪心很显然,就是两头尽量拿小的。 然后需要处理两头一样的情况,显然是选字典序小的一串,把数组反着接在原数组后面,然后跑sa,判断的时候直接比较rk数组 cpp include include include using namespace std; const in 阅读全文
posted @ 2018-04-25 11:40 lokiii 阅读(142) 评论(0) 推荐(0)
摘要:floyd传递关系,一个牛能确定排名的条件是能和所有牛确定关系 cpp include include using namespace std; const int N=105; int n,m,a[N][N],ans; int main() { scanf("%d%d",&n,&m); for(i 阅读全文
posted @ 2018-04-25 10:06 lokiii 阅读(208) 评论(0) 推荐(0)
摘要:要求三边和大于第四边,所以任意一条边的长度都是小于n/2 设f[i][j]为前i条长为j,转移的时候用n/2限制 cpp include include using namespace std; int n,mx,f[5][2505]; int main() { f[0][0]=1; scanf(" 阅读全文
posted @ 2018-04-25 09:37 lokiii 阅读(137) 评论(0) 推荐(0)
摘要:在线段树上记录长度、区间01翻转标记、当前1个数。传递tag的时候用长度 1个数即可 cpp include include using namespace std; const int N=100005; int n,m; struct qwe { int l,r,len,v,tg; }t[N'9 阅读全文
posted @ 2018-04-25 08:53 lokiii 阅读(138) 评论(0) 推荐(0)
摘要:设f[i][j]为第i分钟疲劳j,从三种情况转移,记得休息的时候判断从i开始休息到n能不能恢复到疲劳0 cpp include include using namespace std; const int N=10005,M=505; int n,m,a[N],f[N][M]; int main() 阅读全文
posted @ 2018-04-25 08:16 lokiii 阅读(140) 评论(0) 推荐(0)
摘要:裸的01背包 阅读全文
posted @ 2018-04-25 07:51 lokiii 阅读(100) 评论(0) 推荐(0)
摘要:要求区间取min和max,可以用st表或线段树维护 st表 cpp include include using namespace std; const int N=100005; int n,q,b[N],mn[N][20],mx[N][20]; int read() { int r=0,f=1; 阅读全文
posted @ 2018-04-25 07:47 lokiii 阅读(173) 评论(0) 推荐(0)
摘要:设up[i][j]为第i位升序为j的最小修改数,down为降序 cpp include include using namespace std; int n,a[30005],up[30005][4],down[30005][4]; int main() { scanf("%d",&n); for( 阅读全文
posted @ 2018-04-25 07:21 lokiii 阅读(102) 评论(0) 推荐(0)
摘要:在洛谷上被卡常了一个点! 就是裸的01背包咯 ~~为啥我在刷水题啊~~ 阅读全文
posted @ 2018-04-24 21:57 lokiii 阅读(131) 评论(0) 推荐(0)
摘要:阴沟翻船.jpg 居然忘了除0的情况 枚举两两之间的线,把斜率装起来排个序去个重就好了 ~~真是水的一晚上呢~~ cpp include include include using namespace std; const int N=205; int n,tot,ans; double x[N], 阅读全文
posted @ 2018-04-24 21:51 lokiii 阅读(114) 评论(0) 推荐(0)
摘要:本来想爆手速写个树剖,然而快下课了就手残写了了个n方的短小…… 暴力把查询的两个点中深的一个跳上来,加上边权,然后一起跳加边权就行了 阅读全文
posted @ 2018-04-24 21:37 lokiii 阅读(138) 评论(0) 推荐(0)
摘要:挺有意思的思路 如果不能自己打井,那么就是MST裸题了,考虑转换一下,自己打井就相当于连接一口虚拟的井(地下水?),所有井i到这口井的距离是w[i],这样把所有边排个序跑MST即可 cpp include include include using namespace std; const int 阅读全文
posted @ 2018-04-24 21:24 lokiii 阅读(181) 评论(0) 推荐(0)
摘要:某种意义上真毒瘤?我没看懂题啊...~~于是看了题解~~ 就是筛约数的那种方法,复杂度调和级数保证O(nlogn) ~~所以这题啥意思啊~~ cpp include include include using namespace std; const int N=1000005; int n,mx, 阅读全文
posted @ 2018-04-24 21:07 lokiii 阅读(145) 评论(0) 推荐(0)
摘要:按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 ~~说起来我还不会斜率优化呢是不是该学一下了~~ 阅读全文
posted @ 2018-04-24 20:44 lokiii 阅读(113) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/herobrine_tkj/article/details/78404426?locationNum=8&fps=1 为什么从1开始存就挂了,这是个未解之谜... 把两个人条件转换为二维平面内的点,零件生产公司是左下角,零件消费公司是右上角,求最大矩 阅读全文
posted @ 2018-04-24 19:49 lokiii 阅读(190) 评论(0) 推荐(0)
摘要:枚举从大到小s1,二分s2(越大越有可能符合),2 SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图的时候退出枚举,这个用并查集染色维护 cpp include include include inc 阅读全文
posted @ 2018-04-24 16:27 lokiii 阅读(328) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/YihAN_Z/article/details/73380387 一点都不想写正解.jpg random_shuffle一下然后贪心的加点,和ans取max即可。biutset非常方便 正解好像是最大团还是二分图最大独立集来着? cpp includ 阅读全文
posted @ 2018-04-24 12:00 lokiii 阅读(269) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/ccz181078/p/5622200.html 非常服气.jpg 就是random_shuffle几次然后顺着找,ans取min... cpp include include include include using namespace st 阅读全文
posted @ 2018-04-24 11:41 lokiii 阅读(238) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/Quack_quack/article/details/50554032 神建图系列 首先把问题转为全填上,最少扣下来几个能符合条件 先考虑第2个条件,枚举f为一个每行/列最大剩几个,然后记录一下每行列的零件个数(包括填上的) 然后建图 s向所有行连 阅读全文
posted @ 2018-04-24 11:06 lokiii 阅读(184) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/CQzhangyu/p/6952371.html 费用流很简单,考虑但是会T。 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点x,然后进行增广,然后把c[x] 1,并且会出现一些反向边。 考虑二叉树的性质,任何一条两点之间路径 阅读全文
posted @ 2018-04-23 22:01 lokiii 阅读(318) 评论(0) 推荐(0)
摘要:妙啊 首先暴力建图跑最大流非常简单,s向每个i连流量为p[i]的边,每个i向t连流量为s[i]的边,每个i向j连流量为c的边(i include using namespace std; const int N=10005; int n,c,p[N],s[N]; long long f[2][N], 阅读全文
posted @ 2018-04-23 19:46 lokiii 阅读(315) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/wxh010910/article/details/55806735 以下课件,可并堆部分写的左偏树 cpp include include using namespace std; const int N=600005; int n,m,tot,f 阅读全文
posted @ 2018-04-23 17:06 lokiii 阅读(235) 评论(0) 推荐(0)
摘要:参考:https://www.cnblogs.com/lcf 2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数量区间离散化,转移是: 当k==1 $$ f_{i,j,k}=\sum_{i'=1}^{i 1}\s 阅读全文
posted @ 2018-04-21 17:26 lokiii 阅读(107) 评论(0) 推荐(0)
摘要:看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]=max(f[j 1][(k&15) include using namespace std; con 阅读全文
posted @ 2018-04-21 09:58 lokiii 阅读(193) 评论(0) 推荐(0)
摘要:参考:http://www.cnblogs.com/mmlz/p/4456547.html 枚举根,然后做树形dp,设f[i][1]为i是蓝线中点(蓝线一定是父子孙三代),f[i][0]为不是,转移很好想,但是这是n方的 考虑优化换根,记录最小值和最大值就能换根了 cpp include inclu 阅读全文
posted @ 2018-04-21 08:12 lokiii 阅读(185) 评论(0) 推荐(0)
摘要:用manacher找出本质不同的回文子串放在SAM上跑 阅读全文
posted @ 2018-04-20 16:21 lokiii 阅读(126) 评论(0) 推荐(0)
摘要:首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来。 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 $$ f[i][j]=max { f[k][j]+s[k] (s[j] s[k]) } $$ 然后显然这个可以斜率优化,随便推一推式子,假设k选p大于选q,那么 阅读全文
posted @ 2018-04-18 14:52 lokiii 阅读(157) 评论(0) 推荐(0)
摘要:参考:http://hzwer.com/6888.html 把k条道路权值设为0,和其他边一起跑MST,然后把此时选中的其他边设为必选,在新图中加上必选变缩成k个点,把所有边重标号,枚举k跳边的选取情况,和其他边做MST,建出树,k条边的权值在树上取min cpp include include i 阅读全文
posted @ 2018-04-18 10:38 lokiii 阅读(200) 评论(0) 推荐(0)
摘要:第一次听说斯坦纳树这种东西 先dfs预处理出来dis[i][j][k]表示格子(i,j)向k方向转移能到哪,记忆话搜索预处理,注意如果有环的话特判一下 设f[i][j][x][y]表示复合机器人i j在(x,y)生成需要推得步数,用spfa转移,因为时间比较紧所以优化spfa,把能转移的放进一个队列 阅读全文
posted @ 2018-04-16 16:04 lokiii 阅读(413) 评论(0) 推荐(0)
摘要:可并堆就可以,但是想复健一下主席树。 考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选。做成dfs序就是选区间内和小于等于k的最多点。可以用主席树,查询的时候在主席树上二分即可 这里注意,为了方便起见,离散化的时候即使值相同也离散成不同值,这样可以保证主席树叶子结点的size最大为1,方便二 阅读全文
posted @ 2018-04-16 09:56 lokiii 阅读(129) 评论(0) 推荐(0)
摘要:关于没有忍者的区间用线段树判就好啦 然后把剩下的区间改一改:l/r数组表示最左/最右没被删的点,然后删掉修改后的左边大于右边的;l升r降排个序,把包含完整区间的区间删掉; 然后设f/g数组表示i前/后的最少需要忍者数,这个贪心来转移即可,就是把忍者放在区间的最右/左位置 然后对于每个r判断。为什么是 阅读全文
posted @ 2018-04-15 22:08 lokiii 阅读(172) 评论(0) 推荐(0)
摘要:我是智障 3,读优写错了调了半天没发现= = 虽然是个最短路却有网络流一般的神建图啊。 首先发现在拐角处转弯是最优的,于是先离散化,然后矩形的四个顶点向距离它最近的上下左右点连边,跑spfa即可。 就是难写啊,还要判断无解:st在矩形里;dis[t]=inf 阅读全文
posted @ 2018-04-15 17:04 lokiii 阅读(193) 评论(0) 推荐(0)
摘要:画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1;偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第一行的这一列已经被染色的情况)快速幂一下即可。 cpp include include includ 阅读全文
posted @ 2018-04-15 09:31 lokiii 阅读(232) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/qpswwww/article/details/45334033 讲的很清楚 做法比较像旋转卡壳但是具体是不是我也不清楚.. 首先知道只要求出每种方案在圆上和圆中的和就可以。 注意到题目中有一个限制:“保证任何三个房子都不在同一条直线 上,任何四个房 阅读全文
posted @ 2018-04-14 18:52 lokiii 阅读(208) 评论(0) 推荐(0)
摘要:仔细想想好像没学过斜率优化.. 很容易推出状态转移方程\\( f[i]=max\{f[j]+a(s[i] s[j])^2+b(s[i] s[j])+c\} \\) 然后考虑j的选取,如果选j优于选k,那么: $$ f[j]+a(s[i] s[j])^2+b(s[i] s[j])+c f[k]+a(s 阅读全文
posted @ 2018-04-14 16:20 lokiii 阅读(126) 评论(0) 推荐(0)
摘要:我是智障系列。用了及其麻烦的方法= =其实树形sp就能解决 设直径长度+1为len(环长) 首先k=1,直接连直径两端就好,答案是2\ n len 然后对于k=2,正常人的做法是树形dp:先求直径,然后把树的直径上的所有边权标为 1,再求一次直径设新直径+1为len2,答案是2\ (n−1)−len 阅读全文
posted @ 2018-04-14 11:27 lokiii 阅读(142) 评论(0) 推荐(0)
摘要:先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可。 注意判断无解 cpp include include using namespace std; const int N=20 阅读全文
posted @ 2018-04-13 22:07 lokiii 阅读(195) 评论(0) 推荐(0)
摘要:写题五分钟读题两小时系列…… 看懂题的话不算难,然而我去看了大佬的blog才看懂题…… 题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k段就能使每一段字典序单调不降。求在所有合法串中字典序第r大的。 设f[i][j][k]表示第i个字符 阅读全文
posted @ 2018-04-13 21:08 lokiii 阅读(144) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/clover_hxy/article/details/70767653 人生第一次交互题...不是很难但是思维和传统题差别挺大的(以及并不会本地测试= =),详见参考blog和代码吧 阅读全文
posted @ 2018-04-13 19:37 lokiii 阅读(829) 评论(0) 推荐(0)
摘要:用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了。 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里; 对于k=1,直接选所有办公室和家的中位数即可,因为显然如果选的点两边的办公室和家的点不一样多的话,显然可以向多的一侧移动来使得总路程减少; 对 阅读全文
posted @ 2018-04-13 17:16 lokiii 阅读(184) 评论(0) 推荐(0)
摘要:居然要对不同的数据写不同的dp= = 首先记得开long long,\ include include using namespace std; const int N=2005,inf=1e9; int n,a,b; long long s[N],bt,ans; int read() { int 阅读全文
posted @ 2018-04-13 08:19 lokiii 阅读(139) 评论(0) 推荐(0)
摘要:明明是个最短路却有网络流一样的神建图= A = 首先要是暴力建图的话最坏有O(nm)条边。所以优化建图。 考虑分块思想,设bs=sqrt(n),对于p大于bs的,直接连边即可,最多有sqrt(n)条,注意边权不全是1了,因为要从b走过去;对于p小于等于bs,先把每栋楼建sqrt个辅助点,然后这些辅助 阅读全文
posted @ 2018-04-12 10:37 lokiii 阅读(293) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog~~懒得画了~~ bzoj蜜汁TTTTTTTTTTTTTTTLE upd:bzoj数据有问题,快读GG cpp include 阅读全文
posted @ 2018-04-11 22:05 lokiii 阅读(143) 评论(0) 推荐(0)
摘要:数组若干+手动二分一个的算法,bzoj rank8 ===============================废话分割线=================================== 我我我我我!一定要说一下我的心路历程!我只用了几个数组和一个手动二分!在洛谷和bzoj都过了所以应该是对 阅读全文
posted @ 2018-04-11 17:33 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:明明优化了spfa还是好慢…… 因为只能取一次值,所以先tarjan缩点,把一个scc的点权和加起来作为新点的点权,然后建立新图。在新图上跑spfa最长路,最后把酒吧点的dis取个max就是答案。 阅读全文
posted @ 2018-04-11 11:24 lokiii 阅读(142) 评论(0) 推荐(0)
摘要:没有算法,但是要注意细节。 首先无解的情况,显然的是最小深度的叶子节点和最大深度的叶子节点的深度差大于1;还有一种比较难想,就是如果一个点的左右子树都有最大和最小深度的叶子节点,这样交换左右子树也不行。 答案比较容易,就是统计一下右子树size 左子树size的节点个数即可。 阅读全文
posted @ 2018-04-11 10:22 lokiii 阅读(162) 评论(0) 推荐(0)
摘要:~~其实并不会分数规划~~ 因为要最大化 ans=总收益/总路程 ,所以考虑二分答案,找到一条 ans=0。建一张新图,(i,j)边权为w(i,j) d(i,j)\ ans,然后用Floyd在新图中检查是否有非负环即可。 阅读全文
posted @ 2018-04-11 09:20 lokiii 阅读(189) 评论(0) 推荐(0)