传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #define inf 0x3f3f3f3f using namespace std; struct Node{int v,next;}e[N<<1]; int first[N],cnt=0,b,E,p,n,m,d[N][3]; bool vis[N]; inline void add(int u,in…
P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花费的总能量. 贝西在从田野走到相邻的地方时,花费B个能量单位,当她走到相邻的地方时,Elsie花费了E个能量单位.但是,如果Bessie和Elsie在同一个领域,Bessie可以携带Elsie在她的肩上,两者都可以移动到相邻的场地,而只花费P个能量单位(P可能比B + E小得多,Bessie的数量而…
传送门 有趣的前缀和. 数据范围中的n≤200" role="presentation" style="position: relative;">n≤200n≤200提示我需要写出来一个O(n3)" role="presentation" style="position: relative;">O(n3)O(n3)的算法,思来想去感觉前缀和挺靠谱的于是写了写发现只有84,检查后发现把m打成了n(…
传送门 短代码神奇dp. 自己yy的思路居然1A了好高兴啊! 不难想到每个人选择的时候一定是取连续的最大的那一段数,自然需要先排序. 然后可以用dp[i]表示当前最大数是a[i]的时候先手可以获得的最优值. 不难想到dp[i]跟dp[1]~dp[i-1]都有关系,其实就是dp[i]=max(a[j]−dp[j−1])" role="presentation" style="position: relative;">dp[i]=max(a[j]−dp[…
[题解]Luogu P3110 [USACO14DEC]驮运Piggy Back 题目描述 Bessie and her sister Elsie graze in different fields during the day, and in the evening they both want to walk back to the barn to rest. Being clever bovines, they come up with a plan to minimize the tot…
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头尾.然后开始逐位比较,当两个字串同一位置的字符不同时,相对来说字符值较大的指针跳到失配下标的后面一位,如果此时两个指针重合,将其中一个加一.边界条件:两个指针中有一个值大于原数组长度. 代码如下: #include<bits/stdc++.h> #define N 300005 using nam…
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h> #define N 100005 #define Max 100000 using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigi…
传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdio> #include<cmath> #define N 10000005 using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=-…
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二个地址为j,则有 total=[∑i=1ndis[i]∗w[i]]−dis[i]∗w[i]−dis[j]∗(sum[j]−sum[i])" role="presentation" style="position: relative;">total=[∑n…
传送门 题目就是要求维护带权重心. 因此破题的关键点自然就是带权重心的性质. 这时发现直接找带权重心是O(n)的,考虑优化方案. 发现点分树的树高是logn级别的,并且对于以u为根的树,带权重心要么就是u,要么存在于u的某一个儿子为根的子树中. 由于带权重心只有一个,因此只需要从根节点开始向下跳,跳不动了就是答案. 代码: #include<bits/stdc++.h> #define N 100005 #define ll long long using namespace std; inl…