02 2020 档案

摘要:这题有些不一样,睁大眼睛看题,发现不用连续地取,那么我们就可以预处理一下。 把h从大到小排个序,然后从前往后扫一遍,如果当前的这片土地的w值不比前面的最大值大,那么他就可以被包含,无贡献。 这时我们取出了一个h递减,w递增的数列,这时取就必须连续了。 递推式长这样:f[i]=f[j]+b[i].w* 阅读全文
posted @ 2020-02-29 22:58 syzf2222 阅读(109) 评论(0) 推荐(0) 编辑
摘要:这道题不太一样了。通过费用提前可以推倒递推式长这样:f[i]=min{f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])} 写成一次函数形式长这样:f[j]=(s+sumt[i])*sumc[j]+f[i]-sumt[i]*sumc[i]-s*sum 阅读全文
posted @ 2020-02-29 22:57 syzf2222 阅读(110) 评论(0) 推荐(0) 编辑
摘要:虽然又是一遍AC的,但不得不说这题打得我好慌张,还调了十几分钟,虽然都是智障错误。 回归正题。猛然一看,n只有3000,貌似不要斜率优化耶。 但事实上,普通DP是N^2*M的,所以还是得斜率优化哈哈。 构造数列A1~Am,表示第i段的和。 方差乘m^2后长这样子:m*Ai^2-(Ai)^2 惊喜的发 阅读全文
posted @ 2020-02-29 22:55 syzf2222 阅读(130) 评论(0) 推荐(0) 编辑
摘要:这是我斜率DP第一个没有一遍AC的,原因是第一遍忘开long long了。 这一题比较特殊,细心的同学一定发现了,递推式不带f。 为了方便,设d数组的后缀和为sd[i]=sd[i+1]+d[i],设k数组的前缀和为sk[i]=sk[i-1]+k[i](k[i]即是题目中的w[i]) 设f[i]为第二 阅读全文
posted @ 2020-02-29 22:54 syzf2222 阅读(95) 评论(0) 推荐(0) 编辑
摘要:这题不像前面那样板子了,至少我不认为它是个板子。 推出的方程长这样子:f[j]+a*sum[j]^2-b*sum[j]=(2*a*sum[i])*sum[j]+f[i]-a*sum[i]^2-b*sum[i]-c 看一下数据范围,a恒为负,这时斜率2*a*sum[i]单调递减,同时我们要求截距的最大 阅读全文
posted @ 2020-02-29 22:53 syzf2222 阅读(132) 评论(0) 推荐(0) 编辑
摘要:容易想到,我们必须在最低点也就是第n个点建设一个仓库。由此想到这样设状态:f[i]表示仅处理1~i的工厂的最小花费。 找到一个j<i,在j处建工厂,从j+1到i-1的都运到i处,那么推出状转方程:f[i]=min{f[j]+c[i]+p[k]*(x[i]-x[k])},k从i+1到j-1 预处理两个 阅读全文
posted @ 2020-02-29 22:52 syzf2222 阅读(215) 评论(0) 推荐(0) 编辑
摘要:不难推出递推方程:dp[i]=min{dp[j]+(sum[i]+i−sum[j]−j−L−1)^2} 不妨设A=i+sum[i],B=j+sum[j]+1。则递推式可以转化为:dp[i]=min{dp[j]+(A-B+L)^2} 接下来的部分留给读者自行推倒(主要是我懒得写了QAQ) 看代码: # 阅读全文
posted @ 2020-02-29 22:51 syzf2222 阅读(141) 评论(0) 推荐(0) 编辑
摘要:不难得到递推式f[i]=min{f[j]+(sum[i]-sum[j])^2+m}; 去掉min函数并展开:f[i]=f[j]+sum[i]^2-2*sum[i]*sum[j]+sum[j]^2+m 将含i的项与含j的项分离,并把单纯含j的项写在左边:f[j]+sum[j]^2=2*sum[i]*s 阅读全文
posted @ 2020-02-29 22:50 syzf2222 阅读(80) 评论(0) 推荐(0) 编辑
摘要:这一题k有1000000的数量级,所以我没敢开一百万的局部数组。 为什么全局有可能会出问题?因为在递归的时候,这一层的数据有可能被下一层利用。 避免的方法就是把处理和递归分开。完事! 看代码: #include<bits/stdc++.h> using namespace std; const in 阅读全文
posted @ 2020-02-29 22:48 syzf2222 阅读(134) 评论(0) 推荐(0) 编辑
摘要:这可以说是最简单的一道了吧,用一个桶去记录就好了。 #include<bits/stdc++.h> using namespace std; const int maxn=100000+10; #define inf 1e9 int n,k; int beg[maxn],nex[maxn],to[m 阅读全文
posted @ 2020-02-29 22:47 syzf2222 阅读(116) 评论(0) 推荐(0) 编辑
摘要:对于每一条连到当前根的比k小的边edge,找比k-edge小的,不难想到树状数组。 比较坑的是树状数组一定要定义局部变量,不然会奇妙WA哈哈。 看一下代码: #include<bits/stdc++.h> using namespace std; int n,k; const int maxn=10 阅读全文
posted @ 2020-02-29 22:46 syzf2222 阅读(162) 评论(0) 推荐(0) 编辑
摘要:虽然说是一个模板题,但其实并不是那么模板…… 数据加强之后,N^2的时间复杂度是过不了的。注意到m只有一百,考虑先输入m个数,离线处理。 代码如下: #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f const i 阅读全文
posted @ 2020-02-29 22:45 syzf2222 阅读(91) 评论(0) 推荐(0) 编辑
摘要:对于每个点,统计过他的边的对三取模的个数。看代码。 #include<bits/stdc++.h> using namespace std; #define inf 1e9 const int maxn=20005; int beg[maxn],nex[maxn*2],to[maxn*2],w[ma 阅读全文
posted @ 2020-02-29 22:44 syzf2222 阅读(134) 评论(0) 推荐(0) 编辑
摘要:又是一个板子题。 边权转点权注意要去除lca,修改时直接将id[x]加一即可。 注意若此时x==y,则直接返回。 代码如下: #include<bits/stdc++.h> using namespace std; #define inf 2147483647 const int maxn=1e6; 阅读全文
posted @ 2020-02-29 22:41 syzf2222 阅读(205) 评论(0) 推荐(0) 编辑
摘要:开两个线段树,一个维护和,一个维护最大值。 #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=300000+100; int n,q; int beg[maxn],nex[maxn],t 阅读全文
posted @ 2020-02-29 22:36 syzf2222 阅读(131) 评论(0) 推荐(0) 编辑
摘要:这是一个初学树剖很好的练手题。 我想我只需要放个代码…… #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1000000; int n,m; int beg[maxn],nex[max 阅读全文
posted @ 2020-02-29 22:33 syzf2222 阅读(107) 评论(0) 推荐(0) 编辑
摘要:说什么并查集,就是数连通块。 #include<bits/stdc++.h> using namespace std; const int maxn=1005; int a[maxn][maxn]; int vis[maxn]; int n,m; void dfs(int x){ if(vis[x] 阅读全文
posted @ 2020-02-29 22:20 syzf2222 阅读(90) 评论(0) 推荐(0) 编辑
摘要:以下是最小生成树+并查集 HDU 1213 基础并查集★ -->Solution HDU 1272 基础并查集★ -->SolutionHDU 1325 Tree? -->SolutionHDU 1856 基础并查集★ -->SolutionHDU 1102 基础最小生成树★-->SolutionH 阅读全文
posted @ 2020-02-29 19:50 syzf2222 阅读(141) 评论(0) 推荐(0) 编辑
摘要:1.树上操作 Solution 2.树的统计 Solution 3.Disruption P Solution 4.最短距离 Solution 5.Qtree1 Solution 6.魔法树 Solution 7.软件包管理器 Solution 8.松树的新家 Solution 9.旅游 Solut 阅读全文
posted @ 2020-02-29 17:16 syzf2222 阅读(122) 评论(0) 推荐(0) 编辑
摘要:乍一看好像是个DP,做着做着发现锅了…… 好吧,试试WLL。 首先用dp求出最长不下降子序列的长度(简单不再赘述) 问题2: 超级源点与所有f[i]=0的点的入口相连,边权为1。 超级汇点与所有f[i]=ans的点的出口相连,边权为inf。 连所有的边满足i<j,a[i]<=a[j],f[i]=f[ 阅读全文
posted @ 2020-02-28 17:07 syzf2222 阅读(181) 评论(0) 推荐(0) 编辑
摘要:命运女神终于眷顾了我!!! 这两天我打费用流、旋转卡壳不是WA就是莫名TLE,这道我敬而远之的题居然一遍AC!!! 进入正题。 考虑到条件:任何时候可以互达,知道它永远联通。 真理:加边永远比删边好做,于是很自然的想到离线。 做法:1.在所有剩余的边中找出一棵生成树。 2.将剩余的却不在生成树内的边 阅读全文
posted @ 2020-02-28 01:18 syzf2222 阅读(278) 评论(0) 推荐(0) 编辑
摘要:这题一开始把我看愣了。难道是线段树套树状数组?空间根本开不下好不好!!! 后来想到维护区间极值,从而排除不必要情况,降低复杂度。 无需修改,码量顿减…… 注意,同一组数据放一行,注意行末空格。 #include<bits/stdc++.h> using namespace std; #define 阅读全文
posted @ 2020-02-25 16:55 syzf2222 阅读(118) 评论(0) 推荐(0) 编辑
摘要:从前往后能放就放,求严谨贪心证明!!! #include<bits/stdc++.h> using namespace std; map<int,int>spr; int n,ans; int top[100],cnt; vector<int>p[100]; void dfs(int pos){ a 阅读全文
posted @ 2020-02-23 12:51 syzf2222 阅读(123) 评论(0) 推荐(0) 编辑
摘要:弱弱的我不会网络流,发现这道题二分图也能水过,直接匈牙利不比Dinic好写一些吗??? #include<bits/stdc++.h> using namespace std; int n,k,need[25],vis[1005],match[1005],ans; vector<int>a[25], 阅读全文
posted @ 2020-02-23 12:49 syzf2222 阅读(99) 评论(0) 推荐(0) 编辑
摘要:裸的二分图,匈牙利算法可以水过。 #include<bits/stdc++.h> using namespace std; const int maxn=500; int n,m,p[maxn],match[maxn]; int a[maxn][maxn],to[maxn]; int dfs(int 阅读全文
posted @ 2020-02-23 12:45 syzf2222 阅读(90) 评论(0) 推荐(0) 编辑
摘要:不介绍原理。 例题一:P3376 【模板】网络最大流 模板。代码如下: #include<bits/stdc++.h> using namespace std; const int maxn=500000; int beg[maxn],nex[maxn],to[maxn],w[maxn],e; in 阅读全文
posted @ 2020-02-21 16:51 syzf2222 阅读(113) 评论(0) 推荐(0) 编辑
摘要:学习了LCT以后,本蒟蒻看着某F巨佬给的题单,深深地表示无能为力。 刚刚开始学,肯定要先打打板子,怎么还上思维呢? 你觉得给一个初学者做三叉神经树真的好吗??? 在我的不懈努力下,给大家找到了一些练手的板子题,抓紧机会把板子练熟!!! 1.P3690【模板】Link Cut Tree (动态树) 2 阅读全文
posted @ 2020-02-18 15:56 syzf2222 阅读(127) 评论(0) 推荐(0) 编辑
摘要:好吧,我想说,动态点分治思路好理解,但打起来真让人心累。 所谓动态点分治,就是点分治在线修改和查询。 此时,我们构造一个点分树,先找整棵树的重心,以他为根,将他和每个子树的重心连边,以此类推。 对于每个重心,我们维护一些需要的信息 我们在修改的时候,只需要沿着点分树往上跳修改信息就好了。 动态点分树 阅读全文
posted @ 2020-02-10 18:07 syzf2222 阅读(194) 评论(0) 推荐(0) 编辑
摘要:现在是晚上零点三十分,我来写这篇文章,总结一下我今天学到的简单的斜率优化。 什么是斜率优化,就是将递推式写为y=kx+b的形式。 假设原递推式长这样:f[i]=min{f[j]+C},其中C可能是一个关于i的函数,一个关于j的函数,一个关于i和j的函数。 前两种情况可以通过单调队列来解决,但是情况三 阅读全文
posted @ 2020-02-09 00:50 syzf2222 阅读(186) 评论(0) 推荐(0) 编辑
摘要:好消息,今天我学会了点分治。所谓点分治,就是将树上的需要点统计的N^2的问题强行转化为NlogN。 本来事情是这样的: 1 inline void dfs(int x,int fa){ 2 sz[x]=1; 3 for(int i=beg[x];i;i=nex[i]){ 4 int t=to[i]; 阅读全文
posted @ 2020-02-07 21:34 syzf2222 阅读(404) 评论(1) 推荐(1) 编辑

点击右上角即可分享
微信分享提示