![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
poj
EMber _
人但有追求,世界亦会让路。
展开
-
如何求树的重心
树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 打这个blog主要是为了等一下写的点分治做铺垫。 例题T1:poj1655 题意:求一棵树上的重心编号和去掉这个重心以后最大子树的节点数。 在dfs上做文章,每次对于一个点,记录下他子树中的最大节点,然后更新一下编号和子树节点大小就可以了。#include <iostr原创 2016-08-19 21:09:11 · 970 阅读 · 0 评论 -
poj1743 Musical Theme 后缀数组
题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1.长度至少为5个音符。 2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值) 3.重复出现的同一主题不能有公共部分。 二分答原创 2016-12-13 22:25:48 · 301 阅读 · 0 评论 -
POJ 3207 Ikki's Story IV - Panda's Trick 2-SAT
算是比较经典的2-SAT模型了吧。 题意:给你圆上顺序排列的n个点,点之间连线必须完全在圆内或外,问有没有可能不相交。 2-sat直接上,连边的时候直接把a1#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int原创 2017-06-24 09:29:04 · 187 阅读 · 0 评论 -
poj 2723 Get Luffy Out 二分+2-SAT
题目大意:有n对钥匙,每一对拿了一个另外一个就会消失,有m扇门,每一扇门有两个锁,分别对应2*n把钥匙,求按顺序最多可开多少门。 比较明显的模型呢,先把对立边记录下,然后直接二分用2-sat判断,毕竟2-sat不能直接求出答案只能判断是否可行。 二分的时候连前mid扇门就好啦。#include<cstdio> #include<cstring> #include<algorithm> #incl原创 2017-06-23 22:04:02 · 756 阅读 · 0 评论 -
poj1741 Tree
一万年不打点分治的我来打点分治了。。。(╯‵□′)╯︵┻━┻ 重新复(学)习了一波点分治,之前学的不是很懂。。然后现在发现这东西相当简单= =至少比链剖简单多了,好吧其实都差不多简单。。。 点分治的话,就是讨论对于一个点,答案的两种情况,即是否跨过这个点,不跨过的我们可以直接算他的子树,跨过的我们可以可以对这个点延伸出的几棵子树各做一次dfs 记录子树中出现的距离值,对于一棵树的距离值数组,排原创 2017-04-20 16:42:46 · 190 阅读 · 0 评论 -
poj2104
主席树模板复习。。。。#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; int n,m,q; type原创 2017-02-22 21:54:56 · 234 阅读 · 0 评论 -
POJ2486 Apple Tree 树形DP
题意:给你一个图,每个点有一些权值,问你在k步内怎么得到最大权值。(一个点的权值只能获得一次)。n<=300。题解:一开始:我去这不水题,直接f[i,j]i节点走j步这不随便搞?结果改了半天样例过不了,才发现可以往回走= =,然后就懵比了。事实上,对于多出来的条件限制。我们可以对应的加上一维来推导,即设f[i,j,0/1]表示是否会回到i这个点。那么就可以直接推导了。 如果当前不回到i点: 1.原创 2017-02-11 16:18:09 · 260 阅读 · 0 评论 -
POJ1947 Rebuilding Roads 树形DP
题意:给你一棵树,然后问你最少切多少刀可以剩下p个节点 n,p<=200吧,大概。 又是经典模型,设f[i,j]表示以i为根的子树中,最少去掉多少条边能剩下j个节点。 那么就是分类讨论咯。。 设v是x的子树,x是当前节点 有: 1.不切v子树,那么就有f[i,j]=min(f[i,j],f[i,k]+f[v,j-k]);(0<=k<=j) 2.切,那么直接f[i,j]++就可以了。#i原创 2017-02-11 15:10:53 · 191 阅读 · 0 评论 -
poj 1651Multiplication Puzzle dp
原来我是真的水。。裸矩阵连乘我怎么还想着用贪心呢。#include<cstdio> #include<algorithm> #include<cstring> //#include<cmath> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; ty原创 2017-02-18 16:00:21 · 190 阅读 · 0 评论 -
poj2955 Brackets dp
题意:其实就是括号匹配。问题是我看错了题目了,我以为要n^2做,结果搞了半天才过。。 一看别人的题解我日怎么这么短。。结果才发现是n^3.。 所以为了排名我有重新打了个n^3的。。 n^2的话比较复杂,想问的话站内留个言给我就行,反正一直都在。。 code:#include<iostream> #include<cstdio> #include<algorithm> #include<cst原创 2017-02-18 15:37:47 · 209 阅读 · 0 评论 -
poj3691DNA repair AC自动机+dp
题目的意思是给你一些串,然后给你一个大串,问你要在这个大串上最少修改多少个地方使得这个大串不含任何一个小的串。分析:经典套路,直接dp,还是设f[i,j]表示走到大串的第i个位置,然后直接把模板串往trie上贴就行了,如果当前位置trie上的字母和模板串相同自然不用修改,否则就+1咯。当然不能走单词的末尾节点,直接跳过就可以了。最后注意一下边界,还有如果你是直接读串的话c++是dp的状态和子串的位置原创 2017-02-17 15:39:52 · 284 阅读 · 0 评论 -
poj2778 DNA Sequence AC自动机+矩阵乘法
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15900 Accepted: 6137 DescriptionIt’s well known that DNA Sequence is a sequence only contains A, C, T and G, and i原创 2017-02-16 21:02:03 · 306 阅读 · 0 评论 -
JZOJ5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven prim求mst
whx大爷的题目怎么搞都能虐我= = 比赛的时候以为是神题然后没把时间放在上面,失策= = 其实并不难。(为什么你们都做过拯救小云公主那题啊。。) 假设我们的答案为ans,那么对于每一个点画一个半径为ans的圆,如果能从左走到右不经过圆那么ans就是成立的。 这样看来好像二分答案就可以了,然而n<=6000,带个log会被卡。 事实上,我们只要对于n个点的完全图,做mst,然后找出里面最大原创 2017-10-09 12:40:25 · 799 阅读 · 0 评论