题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远距离\(val[i]\) 首先要明白以下事实: ①删掉任意一条边不会使答案更优 ②环上存在一条边,使得删掉后答案不变 所以我们要做的就是枚举这条边,然后快速求出断掉后的直径 如何快速求出一棵树的直径? 我们同样在剩余的环上找一个断边,直径只有两种情况: ①在断边的任意一侧 ②经过断边 情况①,我们只…
题目实际上是求环套树森林中每个环套树的直径. 对于环套树的直径,可以先找到这个环套树上面的环.然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值. 那么直径一定就是从环上的某个点开始,某个点结束的. 把环拆成链,定义dp[i]表示第i个点为结束点的最远距离,显然有dp[i]=val[j]+sum[i]-sum[j-1]+val[i].显然可以用单调队列优化这个DP. 剩下的就是这样依次统计每个环套树的直径之和. 对于环套树上找环可以借鉴最小树形图找环的技巧. 首先将边定向,保证每个点的…
2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] Description 在一个没有冬马的世界里,经历了学园祭后的春希着急着想要见到心爱的雪菜.然而在排队想见雪菜的fans太多了,春希一时半会凑不到雪菜面前. 作为高帅富,这样的问题怎么能难倒春希?春希从武也手中拿到了取自金闪闪宝库里的多啦A梦的传话筒,并且给每一个排队的fans都发了一个传话筒. 于…
我太菜了居然调了一上午-- 这个题就是要求基环树森林的基环树直径和 大概步骤就是找环->dp找每个环点最远能到达距离作为点权->复制一倍环,单调队列dp 找环是可以拓扑的,但是利用性质有更快好写的做法,就是像朱刘算法找环那样,按照输入的方向(i->to_i)打一圈标记,如果碰到同样标记就说明有环,这里注意我一开始没注意到的,从i点进入找到环不代表i点在环上,因为可能是6字形的,所以一定是环点的是找到的有同样标记的那个点,然后顺着这个点把环点都放进一个栈(其实不用,但是这样好写一些),顺着…
1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在同一天可以同时照到k个区域放下去可以持续两天.现在给出每一天每个区域的动物数量,问最多照到动物多少个.如果两个照相机同时照到一个动物只算一次.n<=50 k<=m<=2e4 思路 我们可以考虑只在一天的情况 那么就是一个简单的dp,状态为dp[i][j]第i天放置在区域j可以获得的最大数.那…
(全英文题面所以直接放化简题意) 题意:在一个二维平面内,初始有一些点,然后每个时间点加入一些点,对每个时间点求平面内最大的无障碍正方形 (这次的题目是真的神仙啊...) 首先,考虑暴力,如果对每一个加点进行一遍扫描,那么,可以跑到天荒地老了... 其次,如果像以前的dp一样跑呢?因为是动态的,所以不行... 很容易想到,这个面积一定是单调不增的,于是,就可以倒序来,变成加点,离线做. 那么,有了加点就可以跑暴力了吗?很显然不行... 那怎么办呢? solution: (以下初始思路来自老师)…
Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 Description Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a consecutive subseque…
非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件. 线段树 #include "stdio.h" #include "string.h" struct node { int l,r,Max; }data[800010]; int Max(int a,int b) { if (a<b) return b; els…
传送门 就是个单调队列+DP嘛. ——代码 #include <cstdio> ; , t = , ans = ~( << ); int q[MAXN], a[MAXN], f[MAXN]; inline int min(int x, int y) { return x < y ? x : y; } int main() { int i; scanf("%d %d", &n, &m); ; i <= n; i++) scanf(&qu…
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4237 这题可以转化为每次可以走g~d+x步,求最大分数,且最大分数的步数最少. 这题的数据范围比较小,可以用奇怪的姿势过. 首先,lyf队长给的方法是n^3的dp过:用我自己的方法是搜索也可以过,因为数据小. 但是,如果数据范围很大,就得用复杂度是O(n)的单调队列dp来做. 上次做过一道单调队列的dp问题,当时比较懵懂,现在,对这个方法有了更深的理解.而且,只要把id丢进单调…