摘要: 对于权值最大的点,他一定会在父亲选完后立刻选,所以不断将其与父亲合并,直到只剩一个点就是答案由于n比较少,可以直接暴力,如果n较大取最大值可以用堆,修改父亲可以用并查集 1 #include<cstdio> 2 #define N 1005 3 int n,r,x,y,ans,a[N],f[N],s 阅读全文
posted @ 2019-10-07 06:23 PYWBKTDA 阅读(231) 评论(0) 推荐(0)
摘要: 有两个贪心:1.自底向上dfs,能删就删,这样显然是正确的,因为它最多只会造成它父亲不能删除;2.对于一个节点,优先删除其代价($c[i]+son[i]$)最大的i删除,一定最优,证明略 1 #include<bits/stdc++.h> 2 using namespace std; 3 #defi 阅读全文
posted @ 2019-10-07 06:22 PYWBKTDA 阅读(179) 评论(0) 推荐(0)
摘要: 考虑二分枚举答案,变成01的一个序列,用线段树来维护排序即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define L (k<<1) 5 #define R (L+1) 6 #define mid 阅读全文
posted @ 2019-10-07 06:18 PYWBKTDA 阅读(111) 评论(0) 推荐(0)
摘要: 倍增,对于每一个点计算他走到$2^i$次祖先所需要的攻击力以及最终会变成什么(一个一次函数),简单处理即可(然而这样是错的,因为他只保证了骑士的攻击力可以存,并没有保证这个一次函数的系数可以存)(其实还可以用科学记数法即pair<long double,int>来存即可,只要注意精度&常数)正解是模 阅读全文
posted @ 2019-10-07 06:17 PYWBKTDA 阅读(129) 评论(0) 推荐(0)
摘要: 建立点分树(以下除距离都指在点分树上的,距离可以每一次倍增计算lca)对于每一个点,维护子树内所有点到这个点的距离的线段树和子树内所有点到这个点父亲的距离的的线段树,然后对于查询和修改暴力修改或询问每一个祖先即可(点分数树高logn) 1 #include<bits/stdc++.h> 2 usin 阅读全文
posted @ 2019-10-07 06:17 PYWBKTDA 阅读(210) 评论(0) 推荐(0)
摘要: 可以发现分割的顺序并不会影响答案,也就是一个划分的问题dp,用f[i][j]表示前i个数划分为j段的答案,那么方程是$f[i][j]=max(f[k][j-1]+(S[i]-S[k])*(S[n]-S[i])$,滚动+斜率优化即可 1 #include<bits/stdc++.h> 2 using 阅读全文
posted @ 2019-10-07 06:16 PYWBKTDA 阅读(173) 评论(0) 推荐(0)
摘要: 对网格图黑白染色,在黑色格中填不同的质数,白色格中填相邻黑色格的lcm+1,但这样会超过1e15的上限将网格图划分为两类对角线,每一条对角线选一个质数,然后每一个点就是两条对角线的质数相乘,而白格的值就仅为四个较小质数的乘积+1(注意不能让两个大质数配到一起) 1 #include<bits/std 阅读全文
posted @ 2019-10-07 06:15 PYWBKTDA 阅读(153) 评论(0) 推荐(0)
摘要: 先按照d从小到大排序,遍历所有建筑i,如果能修,显然要去修的考虑不能修,显然选择让之前所需时间最多的那个建筑不修(如果就是自己那就放弃),用堆来维护 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int t,d; 5 阅读全文
posted @ 2019-10-07 06:15 PYWBKTDA 阅读(124) 评论(0) 推荐(0)
摘要: 二分答案,考虑答案是否会大于等于这个mid,显然所有数值分为两类:大于等于mid和小于mid将n个数转化为01串,如果0和1不相邻,那么答案就是第一个数/最后一个数(一定会相同),考虑有连续两个0/1否则连续的两个数一定会上升到某一个高度并变为一个数,因此只需要找到最高的一层全部变成0/1时,也就是 阅读全文
posted @ 2019-10-07 06:13 PYWBKTDA 阅读(202) 评论(0) 推荐(0)
摘要: 有一个结论:两个区间的最长路的端点一定是这两个区间中的最长路端点(4选2),所以可以用线段树来维护区间最长路的两个端点,然后最终合并即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define L ( 阅读全文
posted @ 2019-10-07 06:12 PYWBKTDA 阅读(189) 评论(0) 推荐(0)
摘要: 将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点j,是否达到上限的方案数对于ac自动机上的结束节点,直接重置并累计答案即可 1 #include<b 阅读全文
posted @ 2019-10-07 06:11 PYWBKTDA 阅读(143) 评论(0) 推荐(0)