【Luogu】P4381 [IOI2008]Island】的更多相关文章

一.题目 Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一艘专用的往来两岛之间的渡船. 相对于乘船而言,你更喜欢步行.你希望所经过的桥的总长度尽可能的长,但受到以下的限制. • 可以自行挑选一个岛开始游览. • 任何一个岛都不能游览一次以上. • 无论任何时间你都可以由你现在所在的岛S去另一个你从未到过的岛D.由S到D可以有以下方法…
P4381 [IOI2008]Island 题意:求图中所有基环树的直径和 我们对每棵基环树分别计算答案. 首先我们先bfs找环(dfs易爆栈) 蓝后我们处理直径 直径不在环上,就在环上某点的子树上 我们对于环上每个点的子树,跑一边dp求直径即可,顺带处理子树的最深深度(环上点到子树某个叶节点的最长距离)$dis[x]$ 在dfs求直径时顺带求直径的最大值(可能是整棵基环树的直径) 蓝后我们在环上跑一遍dp. 我们先破环成链(就是把长度为$n$的环转换成长$2n+1$的链) 偷个图 我们记链上前…
[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数).当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米.小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米.小A想每天能醒地尽量晚,所以让你帮他算算,他最少需…
[题意]将n*m矩阵分成两个区域,要求满足一定条件,求两区域内部极差较大值最小.n,m<=2000 [算法]二分 [题解]极差的数值满足单调性,所以考虑二分极差. 对于给定的极差,将所有数值排序后,1~a[n*m]-num-1必须选择A,a[1]+num+1~n*m必须选择B,其它不要求.(开始的时候想二分图染色,后来发现排序一下规律就十分明显了) 现在问题转化为矩阵中已知一些格子选A,一些格子选B,求能否组成合法方案. 观察要求满足的条件,很容易得出结论:分界线必须单调,所以就有上A下B或上B…
[题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处理马和王,那么就剩13个棋子,可以压成2^13表示棋盘现有棋子存活状态. 然后对vis[2^13][n][n]进行bfs. 细节: 1.攻击直到碰到其它棋子,那个碰到的棋子也算攻击范围内. 2.判断碰到棋子时,注意该棋子是否在当前局面存活. 3.多组数据,Q中途退出要清空. 学到了: 1.一份长代码要细心…
[题目]洛谷10月月赛R1 提高组 [题意]求n!在k进制下末尾0的个数,n<=1e18,k<=1e16. [题解]考虑10进制末尾0要考虑2和5,推广到k进制则将k分解质因数. 每个质因数在n!中的数量,以2为例是n/2+n/4+n/8...这样统计.(含x个就被统计x次) 最后得到凑出的k的个数就可以得到末尾0的个数. 分解质因数复杂度O(√k),也使用pollard rho算法可以加速. #include <iostream> #include <stdlib.h>…
[题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define lowbit(x) (x&-x) #define ll long long using namespace std; int re…
任务说明:将杂乱无章的数据变得有规律.有各种各样的排序算法,看情况使用. 这里有空还是把各种排序算法总结下吧.qsort需要会写.. P1177 [模板]快速排序 这个题目懒得写了,直接sort了... 以后要补上.. sort版本可以忽略了orz #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int mai…
P3369 [模板]普通平衡树(树状数组) 一.树状数组 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构. 这张图总是让很多初学者望而生畏(好吧只是我) 所以在学习它之前,我们来看看线段树. (现在我默认大家都会线段树) 我们知道如果\(a + b = c\),则\(b = c - a\). 所以,所有节点的右儿子都是不需要的. 我们把线段树上不必要的节点去掉. 它长得会像这样. 这种数据结构我们称它为…
原题传送门 题意:求基环树森林的直径(所有基环树直径之和) 首先,我们要对环上所有点的子树求出它们的直径和最大深度.然后,我们只用考虑在环上至少经过一条边的路径.那么,这种路径在环上一定有起始点和终点.(假设路径是从起始点开始,按顺时针方向走达到终点) 不妨枚举这段路径在环上的终点.由于规定了这个点和方向,我们就可以拆环了.然后是一个经典的技巧,把环上元素复制一遍,就可以枚举全部拆环方案.设环上有l个结点.那么,我们枚举终点,就相当于在长度为2l的数组上不断滑动一个长度为l的区间 剩下的问题与基…
题目链接 博弈DP太喵了qwq 设f[i][j]表示剩下区间[i,j]要取,先手最大值 明显我们要从这区间里面拿个最大的 就等价于这段区间的前缀和,我们要给对手留下个最小的 就是f[i][j]=sum[i][j]-min(f[i+1][j],f[i+2][j]......f[j][j],f[i][j-1].....f[i][i]) 搞一搞优化可以O(n^2)做 #include<cstdio> #include<cstring> #include<cstdlib> #i…
YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查完再改回来... MDZZ 于是就有了主席树. 先不考虑主席树,我们来考虑一个奇特的线段树. 一般的线段树,数列位置是下标,而把数列维护值作为线段树中存的元素. 那我们如果反过来,把数列元素当做线段树的下标...??? 比如说数列[4 2 3 1] 如果线段树的下标是1.2.3.4......? 那…
题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] 容易模拟得到这个数列单栈是搞不出来的.为什么搞不出来呢? 如果输入的序列是单调递减的,自然一个栈可以搞定.直接全部压栈再全部弹栈就可以了. 如果输入的序列不是单调递减,一个栈也有可能搞定.但是像我们举的这个例子,你压3的时候必须把2压在底下,那怎么先出2后出3呢? 继续模拟能够发现规律:若i.j不能单栈,…
P1426 小鱼会有危险吗 我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧 #include <bits/stdc++.h> using namespace std; int main() { double s, x; cin >> s >> x; double start = s - x, endd = s + x; //探测器的范围 double speed = 7.0, length = 0.0; //没有游到探测器范围之前 while(length…
任务说明:这也是基础的动态规划.是在线性结构上面的动态规划,一定要掌握. P1020 导弹拦截 导弹拦截 P1091 合唱队形 老师给同学们排合唱队形.N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 解答:前面是LIS, 后面是LDS,枚…
题目链接 分数规划题,详见luogu题解 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<cstdlib> #include<cmath> #define maxn 100010 #define eps 1e-9 using namespace std; inline long long read(){ ,f=; char…
题目链接 请看luogu第一篇题解 #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #include<cstdlib> #include<cmath> #define maxn 300 using namespace std; double f[maxn][maxn]; double g[maxn]; double p[maxn]; dou…
题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以上的餐巾可用. 然后考虑买,快洗,慢洗和放起来的诸多情况. #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cctype> #incl…
题目链接 动态开点的树链剖分qwq. 跟小奇的花园一模一样,不做过多讲解. #include<cstdio> #include<cstring> #include<cctype> #include<cstdlib> #include<algorithm> #define maxn 100010 #define mid ((l+r)>>1) #define check(x) if(x==0) x=++tot; using namespa…
题目链接 明显超出我能力范围. 只放题解. 再放代码. #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cctype> #include<queue> #define maxn 100200 using namespace std; inline long long read(){ ,f=; char ch=getcha…
原题原题原题原题原题 先贴上错误代码... ↓错误代码↓ #include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[1100][1100],f2[1100][1100],st[1100],a[1100]; int main() { memset(f,127,sizeof(f)); int n; cin>>n; for(int i=1;i<=n;…
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. 两点之间的距离公式=sqrt((x1-x2) * (x1-x2)+(y1-y2) * (y1-y2)) 输出格式: 一个数,表示要跑的最少距离,保留2位小数. 原题戳这里 深搜,记录上一个点和已经吃了多少块奶酪,再立一个flag,防止一块奶酪吃很多次 再就是剪枝,不剪枝会超时,如果距离已经大于了最小值,就…
题目大意 有一个简单有向图.每个点有点权. 有三种操作: 修改点权 删除一条边 询问和某个点在同一个强连通分量中的点的前 \(k\) 大点权和. \(n\leq 100000,m,q\leq 200000\) 题解 把操作反过来,每次只有加边操作. 用线段树维护同一个强连通分量内的点的点权. 用整体二分去计算每条边的两个端点被合并的时间. 每次把加入时间 \(\leq tmid\) 的边拿出来跑一次 tarjan,就可以知道哪些边在 \(\leq tmid\) 的时间内被缩掉了. 用带撤回的并查…
题目大意 给你一个字符串,求有多少对不相交且相同的子串. 位置不同算多对. \(n\leq 300000\) 题解 先把后缀树建出来. DFS 整棵树,维护当前子树的 right 集合. 合并两个集合的时候暴力枚举小的那个集合,然后在另一个集合的线段树中查询相应的信息计算贡献. 怎么计算呢? 如果两个位置之差 \(>\) 这两个位置的 \(lcp\)(即当前点的深度),那么贡献就是 \(lcp\),否则是位置之差. 线段树记录区间点数和位置之和即可. 时间复杂度:\(O(n\log^2n)\),…
题目大意 把 \(n\) 个有标号物品分到一些有标号的箱子中且不允许为空,问期望箱子的数量. 多组询问. \(n\leq 100000\) 题解 记 \(f_i\) 为 \(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的箱子的数量之和. 记 \(g_i\) 为 \(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的方案数. 答案为 \(\frac{f_n}{g_n}\). 转移就是枚举最后一个箱子放了多少物品: \[ \begin{align} g_i&=\sum_{j=1}^i…
题目链接 K短路居然用A*……奇妙. 先建反图从终点(1)跑一遍最短路,再A*,用堆存当前点到终点距离+从起点到当前点距离. 每次取出终点都可以视为发现了一个新的最短路. #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cctype> #include<queue> #define maxn 1020 #define m…
传送门 显然题目给的图构成一个基环树森林 对于每个基环树单独考虑,显然每个都走直径是最优的 考虑如何求出基环树的直径 把直径分为两种情况考虑,首先可以找出环 因为直径可能不在环边上,所以对每个环上节点的子树进行一遍 $dfs$,求出每个节点子树的直径 维护 $dis[x]$ 表示节点 $x$ 到叶子节点的最长路程,那么直径就是每个节点儿子的 $dis$ 中最大和次大的和 可以一遍循环动态维护最大和次大 直径也可能在环上 设环上两点 $x,y$ 的距离为 $d(x,y)$,那么就是求最大的 $di…
题目链接 再次声明以后我见到位运算一定第一时间想把它拆成每一位算 本题就是有个前缀和sum[],然后让你求每一位有多少对i,j满足sum[i]-sum[j]在那一位上是1 考虑怎样才能减出1来 如果sum[i]在这一位是1的话,那么就需要j是0且sum[i]前面的数小于sum[j]前面的数,这样不至于一减减退位了,把sum[i]这一位的1减没了 如果是0同理 考虑用权值树状数组维护. #include<cstdio> #include<algorithm> #include<…
题目链接 这题好神啊…… 设f[i]为i没电的概率,初始化$f[i]=1-q[i]$ 之后x的电有三个来源: 1.x自己有电 2.x的儿子给它传来了电 3.x的父亲给它传来了电 对于2和3操作分别做一次树形DP,第一次是用儿子推出父亲,第二次是用父亲推出儿子. #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #include<cstdlib> #def…
题目链接 考虑我们把所有的增加量拿出来做成一个序列b. 那么在所有n中开头中$1~\sum\limits_{i=1}^{k-1}b[i]$是合法的 也就是说我们枚举所有b[i],然后答案就是$n*m^{k-1}-\sum\sum b[i]$ 后面那个“对所有可能的序列b的序列和求和”怎么算呢? 考虑到题目中神奇的限制m*(k-1)<n,也就是说b序列的任意一位1~m都是随便取的 因此等差数列求1~m前缀和乘上每个数出现的次数即可. #include<cstdio> #include<…