解题:JSOI 2007 重要的城市】的更多相关文章

题面 考虑一个点$x$,如果某两个点$u,v$间的所有最短路都经过$x$,那么$x$肯定是重要的.这个题$n$比较小,所以我们直接跑floyd,在过程中记录 当发生松弛时,我们具体讨论: 如果这个长度是两点间新更新出的一条最短路,即$dis[i][j]>dis[i][k]+dis[k][j]$,我们在$i,j$的路径上记录$k$这个点 如果这是一条长度在以前更新过的最短路,那么说明两点间不只有一条最短路,原来的那个点已经废了,更新一下 #include<set> #include<…
[BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution 1.考虑初始化的方式. 由于同色转移起来复杂,我们考虑把相邻的同色的球缩成一个球,记录下缩后的球代表的原来的个数. 这时我们考虑对刷的表的初始化,f[L][R]表示[L,R]区间中需要打入的最小珠子数. 由于是最小个数答案,所以全部初始化为正无穷,但对于缩后的状态,我们考虑不受其他合并时影响的结果:…
后缀数组模板题,看了一天的后缀数组啊,我怎么这么弱TwT #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 200003; char s[N]; int t1[N], t2[N], sa[N], c[N]; void st(int *x, int *y, int n, int m) { int i; for(i = 0; i < m;…
一直不理解到底怎么做啊,想了好久$TwT$ 最后终于明白了为什么找到第一个满足条件的$fail$就计算,因为避免重复,这个回答,,, 然后$root$下面要接上26个节点,这里26个字母中不在字典内的都用$f[i][0]$代替了,这个也想了好久,$==$我还是回家种地吧. #include<cstdio> #include<cstring> #include<algorithm> #define mo 10007 #define N 103 #define M 6003…
Description 题库链接 给你一副麻将,胡牌的条件是一对将和若干顺子和刻子组成.现在给你 \(m\) 张牌,牌共 \(n\) 种,问你听哪一张牌. \(1\leq n\leq 400,1\leq m\leq 1000\) Solution 可以考虑枚举听那张牌,再枚举哪一对做将. 对于剩下的牌,首先从小到大来扫一遍,若当前牌的张数 \(>3\) ,可以让其先模 \(3\) ,即组成刻子.这样一定是可行的,因为让大于 \(3\) 张的该牌组成顺子,那么一定后面的牌也要是 \(3\) 张以上…
Description 题库链接 给你一个长度为 \(n\) 的字符串,首尾相接依次断开每个断点可以得到 \(n\) 个长度为 \(n\) 的字符串,将其排序按序输出每个字符串的最后一个字母. \(1\leq n\leq 100000\) Solution 倍长数组直接后缀排序就好了... Code #include <bits/stdc++.h> using namespace std; const int N = 200000+5; char ch[N]; int n, m, x[N<…
题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为高度的边 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=,inf=1e9; int n,m,d,f,b,s,t,t1,…
题目大意:依照祖玛的玩法(任意选颜色),给出一段区间.问最少用多少个球可以把全部颜色块都消除. 思路:把输入数据依照连续的块处理.保存成颜色和数量.然后用这个来DP.我们知道,一个单独的块须要两个同样的颜色能够消去,对于这种块f[i][i] = 2.其余的>=2个的块仅仅须要一个,这种块f[i][i] = 1. 转移就比較简单了,依照区间DP的一般思想,最外层循环的是区间长度.中间循环的是起始位置,最后循环的是松弛变量. 特殊情况是这个区间的两边是同一种颜色,多加一个转移方程. CODE: #i…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1031 [算法] 将字符串倍长 , 构建后缀数组 , 然后按要求输出即可 时间复杂度 : O(NlogN) [代码] #include<bits/stdc++.h> using namespace std; ; typedef long long ll; typedef long double ld; int n; int cnt[MAXN] , sa[MAXN] , rk[MAX…
[题目链接] 点击打开链接 [算法] 将T2从小到大排序,当决策当前建筑修或不修时,若当前花费时间 + T1 <= T2,则修,否则判断T1是否小于之前修的 T1最大的建筑,若小于,则修,我们可以用一个大根堆来维护T1的最大值 这题用的其实就是贪心的思想 : 从局部最优到全局最优 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 150000 struct info { int T1,T2; } a[MAXN+]…