07 2018 档案

摘要:和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能不能被k 1整除,需要补一些出现次数0的单词 cpp include include include 阅读全文
posted @ 2018-07-31 23:07 lokiii 阅读(162) 评论(0) 推荐(0)
摘要:先tarjan缩成DAG,然后答案就变成了最长链,dp的同时计数即可 就是题面太唬人了,没反应过来 阅读全文
posted @ 2018-07-31 19:21 lokiii 阅读(161) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/sunshinezff/article/details/51049132 非典型数位dp 首先预处理,设f[i][j]为以0开头的i位数中1的个数为j的数的数量,g[i][j]为以1开头的i位数中1的个数为j的数的数量;转移是 f[i][j]=f[i 阅读全文
posted @ 2018-07-30 18:42 lokiii 阅读(159) 评论(0) 推荐(0)
摘要:我是zz吗这么简单都写错…… 一眼二分,然后判断的话是枚举点,然后计算这个点到已有联通块的最小距离,如果这个点到一些联通块的距离小于当前二分的val,则把这些联通块合并起来,这里用并查集维护,最后看这样得出的部落数是否大于k(多出来的可以直接合并) 有个非常小的优化就是不用double二分,直接把点 阅读全文
posted @ 2018-07-30 00:11 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 cpp include include using namespace std; const int N=2005; long long n,kk,a[ 阅读全文
posted @ 2018-07-29 21:17 lokiii 阅读(120) 评论(0) 推荐(0)
摘要:先tarjan找割点和点双连通分量,然后对一个点双,如果没有割点,那么需要建立两个出口(割掉一个另一个备用);如果只有一个割点,出口可以设立在任意一个非割点的地方;如果有两个及以上个割点,就不用建出口(可以直接到达其他联通块) cpp include include include using na 阅读全文
posted @ 2018-07-29 14:23 lokiii 阅读(152) 评论(0) 推荐(0)
摘要:对于一个lr,每个颜色贡献的是在(1,r)区间里出现的最右位置,所以记录一个b数组表示当前点这个颜色上一个出现的位置 然后把询问离线,按r升序排序 每次把右端点右移,把这个点在树状数组上+1,并且在当前这个点的b位置上 1(表示没用了),然后树状数组前缀和减一下即可 ~~我写的~~莫队会T cpp 阅读全文
posted @ 2018-07-29 10:08 lokiii 阅读(147) 评论(0) 推荐(0)
摘要:m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 阅读全文
posted @ 2018-07-29 08:58 lokiii 阅读(160) 评论(0) 推荐(0)
摘要:没啥可说的,就是一边属性一边道具建二分图,把两个属性都连到道具上,然后枚举匹配,如果无法匹配就输出,时间戳优化 cpp include include include using namespace std; const int N=1000005; int n,x,y,h[N],cnt,lk[N] 阅读全文
posted @ 2018-07-28 22:39 lokiii 阅读(147) 评论(0) 推荐(0)
摘要:设[f[i][j]为1到i,开头数字是j并且是山峰的方案数 注意到当数字j和j 1不相邻时,交换它们会得到一个新的符合要求的序列,所以f[i][j]+=f[i][j 1]; 如果相邻,那么j是山峰,j 1是山谷,这样就是求1到i 1,开头数字是j 1并且是山谷的方案数,也就是f[i][j]+=f[i 阅读全文
posted @ 2018-07-28 22:18 lokiii 阅读(116) 评论(0) 推荐(0)
摘要:是贪心 先把两个数组排序,然后贪心的选让a数组占优的(如果没有就算输),这是最大值,最小值是2n 贪心选b数组占优 cpp include include include using namespace std; const int N=100005; int n,a[N],b[N],w,ans1, 阅读全文
posted @ 2018-07-28 21:50 lokiii 阅读(121) 评论(0) 推荐(0)
摘要:总之就是找前面所有点的斜率都严格小于这个点的这样的点的个数 不管是询问还是修改都非常线段树啊,而且相当眼熟~~是不是和hotel有点像啊~~,大概就是区间内记一个len一个max,分别是当前区间答案和区间最大斜率,然后合并区间的时候用右区间递归,分情况讨论更新左区间 这样是两个log…… cpp i 阅读全文
posted @ 2018-07-28 21:41 lokiii 阅读(125) 评论(0) 推荐(0)
摘要:一眼最大权闭合子图,然后开始构图,画了画之后发现~~我其实是个智障~~网络流满足不了m,于是发现正确的打开方式应该是一眼树上dp 然后仔细看了看性质,发现把依赖关系建成图之后是个奇环森林,这个显然不能直接dp 发现这个环要选的话只能选整个环,所以tarjan缩一下点,然后再跑树上背包就行了 cpp 阅读全文
posted @ 2018-07-28 20:40 lokiii 阅读(117) 评论(0) 推荐(0)
摘要:常数巨大,lg上开o2才能A 首先预处理出运输计划的长度len和lca,然后二分一个长度w,对于长度大于w的运输计划,在树上差分(d[u]+1,d[v]+1,d[lca] 2),然后dfs,找出所有覆盖所有边的边的边权最大值,然后用最长运输计划减去最大值看是否符合要求即可 upt:我怕不是个傻子…… 阅读全文
posted @ 2018-07-28 20:36 lokiii 阅读(185) 评论(0) 推荐(0)
摘要:对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j 1] (s[j] s[k 1] include using namespace std; const int N=50005,mod=10007; int 阅读全文
posted @ 2018-07-27 23:04 lokiii 阅读(153) 评论(0) 推荐(0)
摘要:设f[i][j]为掉到f[i][j]时的概率然后分情况随便转移一下就好 主要是要手写分数比较麻烦 cpp include include using namespace std; const int N=55; int n,m; char a[N][N]; long long gcd(long lo 阅读全文
posted @ 2018-07-27 22:29 lokiii 阅读(236) 评论(0) 推荐(0)
摘要:注意到怎么换都行,但是如果把某个黑方块用在对角线上,它原来所在的行列的的黑方块就都不能用 所以要选出n组不重的行列组合,这里用匈牙利算法做二分图匹配即可(用了时间戳优化) cpp include include include using namespace std; const int N=405 阅读全文
posted @ 2018-07-26 22:53 lokiii 阅读(160) 评论(0) 推荐(0)
摘要:非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r) ans(l 1),用预处理出的f数组dp出f即可(可能也不是dp吧……) cpp include include using namespace std; long long l,r,t[2 阅读全文
posted @ 2018-07-26 22:32 lokiii 阅读(141) 评论(0) 推荐(0)
摘要:死活想不到分层图emmm 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为val/2,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表示走了k条0权边 然后仔细观察这张图的 阅读全文
posted @ 2018-07-26 14:21 lokiii 阅读(153) 评论(0) 推荐(0)
摘要:注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 阅读全文
posted @ 2018-07-25 22:54 lokiii 阅读(105) 评论(0) 推荐(0)
摘要:在圆里所以没有平行四边形,n^4枚举点即可 cpp include include using namespace std; const int N=45; int n,a[N],s[N],ans; int main() { scanf("%d",&n); for(int i=1;i 阅读全文
posted @ 2018-07-25 22:46 lokiii 阅读(119) 评论(0) 推荐(0)
摘要:长久以来的心理阴影?但是其实非常简单…… 预处理出deep和每组st的lca,在这里我简单粗暴的拿树剖爆算了 然后考虑对于一组s t lca来说,被这组贡献的观察员x当且仅当: x在s到lca的路径上,且w[x]==de[s] de[x]—— de[x]+w[x]==de[s]; x在lca到t的路 阅读全文
posted @ 2018-07-25 22:07 lokiii 阅读(148) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-23 10:51 lokiii 阅读(2) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况讨论,如果没有奇环,每条边都可以删;如果有一个奇环,奇环上隋边山;否则,删被所有奇环覆盖且没被任何一 阅读全文
posted @ 2018-07-22 22:22 lokiii 阅读(229) 评论(0) 推荐(0)
摘要:我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]\ (i/n)+f[i+1] ((n i)/n)+1 然后设g[i]为还需要的钱,可以把转移看做每张票都比前面的贵1元,就是g[i]=((n i)/n)\ (g[i 阅读全文
posted @ 2018-07-21 21:58 lokiii 阅读(130) 评论(0) 推荐(0)
摘要:传送:http://www.joyoi.cn/problem/tyvj 2054 来自lyd课件: 所以先预处理出各个sum为0的块,然后状压dfs取min来得到答案 cpp include include include using namespace std; const int N=10000 阅读全文
posted @ 2018-07-20 17:04 lokiii 阅读(300) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-20 14:55 lokiii 阅读(3) 评论(0) 推荐(0)
摘要:传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 cpp include include include include include using namespace std; const int N=405,mod=1e9+7,inf=2e9; 阅读全文
posted @ 2018-07-19 22:24 lokiii 阅读(187) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-19 10:41 lokiii 阅读(3) 评论(0) 推荐(0)
摘要:很有意思的题,~~所以还是截lyddalao的课件~~ cpp include include include using namespace std; const int N=6005; int T,n,f[N],s[N]; long long ans; struct qwe { int u,v, 阅读全文
posted @ 2018-07-18 17:26 lokiii 阅读(163) 评论(0) 推荐(0)
摘要:想象成一层一层的染,所以相邻的两个格子连边,边权同色为0异色为1,然后答案就是某个格子到距离它最远得黑格子的最短距离的最小值 注意特判掉不需要染色的情况 cpp include include include include using namespace std; const int N=55,i 阅读全文
posted @ 2018-07-18 15:17 lokiii 阅读(161) 评论(0) 推荐(0)
摘要:我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min cpp include include using namespace std; const int N=500005; int n, 阅读全文
posted @ 2018-07-17 16:35 lokiii 阅读(179) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-15 16:41 lokiii 阅读(2) 评论(0) 推荐(0)
摘要:直接抄ppt好了……来自lyd 注意只用对根判断是否哟留下儿子 cpp include include using namespace std; const int N=100005; long long n,ans,h[N],cnt,fa[N],dis[N],d1,d2,l1,l2,c1,at[N 阅读全文
posted @ 2018-07-15 16:16 lokiii 阅读(107) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-13 22:37 lokiii 阅读(2) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-11 23:00 lokiii 阅读(1) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-10 22:45 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:先求出每棵树的直径,排个序,要想图的直径最小的话需要每棵树的直径中点像直径最大的树的直径中点连边,这样直径有三种情况:是直径最大的树的直径:a[tot];是直径最大的树和直径第二大的树的半径拼起来+1:(a[tot]+1)/2+(a[tot 1]+1)/2+1);是直径第二大的树和直径第三大的树的半 阅读全文
posted @ 2018-07-09 09:14 lokiii 阅读(247) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/shiyukun1998/article/details/44684947 先看对于树的情况 设d[u]为点u向儿子走的期望长度和,du[u]为u点的度数,f[u]为u向儿子走的期望长度,只需要dfs两遍,一次求向儿子的d[u]+=f[e[i].to 阅读全文
posted @ 2018-07-08 22:53 lokiii 阅读(240) 评论(0) 推荐(0)
摘要:我太菜了居然调了一上午…… 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环— dp找每个环点最远能到达距离作为点权— 复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更快~~好写~~的做法,就是像朱刘算法找环那样,按照输入的方向(i— to_i)打一圈标记,如果碰到同样标记就说明 阅读全文
posted @ 2018-07-08 15:01 lokiii 阅读(214) 评论(0) 推荐(0)
摘要:首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推迟的,scc内点数为新图点权 根据贪心的思想,在缩完点的DAG里,一定是出度为0的点能获得更小的值, 阅读全文
posted @ 2018-07-07 23:10 lokiii 阅读(354) 评论(0) 推荐(0)
摘要:首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数 所以可以把矩阵当成邻接矩阵,全是 0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染色,如果只有一个色块的话就是YES否则都是NO(其实应该能更简单一些,不过tarjan比较顺手) 还有就是 阅读全文
posted @ 2018-07-07 13:44 lokiii 阅读(336) 评论(0) 推荐(0)
摘要:!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每“乘”一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所以把点hash一下最多剩下200个 阅读全文
posted @ 2018-07-06 22:47 lokiii 阅读(186) 评论(0) 推荐(0)
摘要:二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才能填a!! 阅读全文
posted @ 2018-07-06 22:04 lokiii 阅读(153) 评论(0) 推荐(0)
摘要:写错一个符号多调一小时系列…… 二分答案,然后判断这个二分区间是否合法: 先按值 从大到小 排序,然后对于值相同的一些区间,如果没有交集则不合法;否则把并集在线段树上打上标记,然后值小于这个值的区间们,如果交集打过标记了,那么不合法,因为这个打过标记的区间一定不会有更小的值了,但是现在有一个更小的数 阅读全文
posted @ 2018-07-05 17:37 lokiii 阅读(161) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-07-05 11:13 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:完了不会dp了 设f[i][j]为以i结尾,有j个时的最优值,辅助数组g[i][j]为s选了i和j,i~j中的误差值 转移是f[j][i]=min(f[k][i 1]+g[k][j]) cpp include include include using namespace std; const lo 阅读全文
posted @ 2018-07-04 17:32 lokiii 阅读(137) 评论(0) 推荐(0)
摘要:废了废了,一个小dp都想不出来 把c数组倒序一下,变成1在最下,设f[i][j]为某一人取完j个之后还剩1~i的硬币,转移的话应该是f[i][j]=max(s[i] f[i k][k]),就是1~n的硬币价值和减去上一手能拿到的最大值,但是这样一来就是O(n^3)的了 仔细观察发现f[i][j]和f 阅读全文
posted @ 2018-07-04 15:30 lokiii 阅读(210) 评论(0) 推荐(0)
摘要:参考:https://blog.csdn.net/u012288458/article/details/50830498 有点神啊 正难则反,考虑计算不符合要求的三角形。具体方法是枚举每个点,把这个点和(0,0)连线,然后连线左边的点两两组合和连线右边的点两两组合再和当前枚举的点组成三角形都是不符合 阅读全文
posted @ 2018-07-04 14:56 lokiii 阅读(210) 评论(0) 推荐(0)
摘要:和poj 2409差不多,就是k变成3了,详见 还有不一样的地方是记得特判n==0的情况不然会RE cpp include include using namespace std; long long n,ans; long long ksm(long long a,long long b) { l 阅读全文
posted @ 2018-07-04 11:17 lokiii 阅读(155) 评论(0) 推荐(0)
摘要:根据polya定理,答案应该是 $$ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} $$ 但是这个显然不能直接求,因为n是1e9级别的,所以推一波式子: $$ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} $$ $$ =\frac{1}{n 阅读全文
posted @ 2018-07-04 11:01 lokiii 阅读(261) 评论(2) 推荐(1)
摘要:两种置换 旋转:有n种,分别是旋转1个2个……n个,旋转i的循环节数位gcd(i,n) 翻转:分奇偶,对于奇数个,只有一个珠子对一条边的中点,循环节数为n/2+1;对于偶数个,有珠子对珠子和边对边,循环节个数为n/2+1个和n/2个 然后用polya定理 即可 cpp include include 阅读全文
posted @ 2018-07-04 09:51 lokiii 阅读(204) 评论(0) 推荐(0)
摘要:啊啊啊无脑背过果然不可取 比如这道题就不会写 参考:https://blog.csdn.net/iamzky/article/details/41317333 cpp include include include using namespace std; const int N=55; const 阅读全文
posted @ 2018-07-03 16:41 lokiii 阅读(181) 评论(0) 推荐(1)
该文被密码保护。
posted @ 2018-07-03 11:00 lokiii 阅读(6) 评论(0) 推荐(1)
摘要:非常迷的一道题啊 我觉得挺对的版本只得了30 总之就是Floyd·改,开两个数组,一个是d[i][j]就是普通的只有边权的最短路,a[i][j]是题目要求的那种 具体改的地方是把枚举中转点的地方把中转点按从小到大的顺序枚举,d[i][j]按照套路更新即可,然后a[i][j]从a[i][j]原数和d[ 阅读全文
posted @ 2018-07-02 17:32 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:真是简单粗暴 把矩阵树定理的运算当成黑箱好了~~反正我不会~~ 这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了 然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数 不选工程队1能修的路的方案数 不选工程队2能修的路的方案数……+不选工程队12能修的路的方案数+不选工 阅读全文
posted @ 2018-07-02 11:54 lokiii 阅读(175) 评论(0) 推荐(1)
摘要:是板子题,因为mod不是质数所以需要辗转相除~~然而并不知道为啥~~ 高斯消元部分还不知道原理呢……先无脑背过的 cpp include include using namespace std; const int N=105,dx[]={ 1,1,0,0},dy[]={0,0, 1,1},mod= 阅读全文
posted @ 2018-07-02 10:39 lokiii 阅读(105) 评论(0) 推荐(1)
摘要:参考:https://www.cnblogs.com/ACShiryu/archive/2011/08/09/poj2356.html 鸽巢原理??? 其实不用map但是习惯了就打的map 以下C c自参考博客: 我们可以依次求出a[0],a[0]+a[1],a[0]+a[1]+a[2],..... 阅读全文
posted @ 2018-07-01 16:14 lokiii 阅读(139) 评论(0) 推荐(0)
摘要:其实我没看懂题~~不如说根本没看~~……都说是excrt板子那就写个板子吧 注意开long long cpp include include using namespace std; const long long N=100005; long long n,r[N],m[N]; void exgc 阅读全文
posted @ 2018-07-01 13:22 lokiii 阅读(129) 评论(0) 推荐(0)
摘要:1 include using namespace std; const int N=105; const long long inf=1e18; long long T,n,m; struct qwe { long long a[N][N]; qwe operator (const qwe &b) 阅读全文
posted @ 2018-07-01 09:41 lokiii 阅读(245) 评论(0) 推荐(0)