摘要: 计算每个点的入度。 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int vis[maxn],rd[maxn]; int top; int main(){ int x,y; while(1){ scanf("% 阅读全文
posted @ 2020-03-02 09:03 syzf2222 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 题意:判断给出的图是否为一棵树。 并查集的简单应用。 注意判断是否是一张空图。 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int vis[maxn],fa[maxn]; int find(int x){ i 阅读全文
posted @ 2020-03-01 10:35 syzf2222 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 这题有些不一样,睁大眼睛看题,发现不用连续地取,那么我们就可以预处理一下。 把h从大到小排个序,然后从前往后扫一遍,如果当前的这片土地的w值不比前面的最大值大,那么他就可以被包含,无贡献。 这时我们取出了一个h递减,w递增的数列,这时取就必须连续了。 递推式长这样:f[i]=f[j]+b[i].w* 阅读全文
posted @ 2020-02-29 22:58 syzf2222 阅读(107) 评论(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 阅读(106) 评论(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 阅读(128) 评论(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 阅读(90) 评论(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 阅读(123) 评论(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 阅读(200) 评论(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 阅读(119) 评论(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 阅读(79) 评论(0) 推荐(0) 编辑