【Henu ACM Round#16 C】Graph and String】的更多相关文章

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 根据题意:先明确以下规则: 1.如果两个点之间没有边,那么这两个点只能是a或c,且不能相同 2.如果两个点之间有边,那么他们之间的差的绝对值<=1 那么对于点i,如果它和所有的点都相连了,那么就干脆把他变成b. 这样其他点无论选什么都和它没有关系,其他点选什么都可以了 接下里,找到任意一个点j,且点j没有和所有的点相连. 显然这个点只能为a或c,因为它和某个点之间没有边.[规则1] 那么我们就让这个点j设置为a; ①然后对于和j…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中的前 i+1-f[i]个字符组成的 字符串. 特殊的,t可能就是一个空串. 比如abcdefg 这里f是kmp算法中的f数组 然后t有两种可能 ① t==s 这样的话,整个前缀就是 sssssss..ss了 这里有(i)/(i-f[i])个s 设为num; 我们可以用这些s来构造ababababa的形式. 则…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉很像一道最短路. 然后就试了一发. 结果真的是.. 只要用一个优先队列优化的dijkstra算法求出每个点的最短路上的前一个点是什么就可以了. 相同大小的话.取每个边的前一个边的边权较小的那个. 然后把每个点的前缀边输出就好. [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 3e5; struct a…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先搞一条a到b的路径 a c x3 x4 x5....xn-2 d b 然后第二个人的路径可以这样 c a x3 x4 x5...xn-2 b d 也即加两条边[a,x3] [xn-2,b] 所以最少只需要n+1条边. (尽量让边共用,只有两条边是需要特殊加进去的 (可以这样理解,加一条边的话,无论怎么加都不够的.所以加两条肯定是最优的了. 这样贪就好了 但是n=4的时候:' 会发现两对起点和终点中肯定有一对是有一条边**直接相…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看什么时候t[i]-t[i-1]>15. 输出t[i-1]+15就好. 不存在这样的i就输出min(t[n]+15,90) [代码] #include <bits/stdc++.h> using namespace std; int n; int t[100]; int main() { cin >> n; for (int i = 1;i <= n;i++)cin>>t[i]; for…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] O(n^2)枚举每一个区间. 然后维护这个区间里面的"统治数字"是什么. 对于每个区间cnt[统治数字]++; [代码] #include <bits/stdc++.h> using namespace std; const int N = 5000+10; int n; int t[5000+10]; int num[5000+10],cnt[N]; int main() { ios::sync_with…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li..ri全都删掉. 接下来要做两件事. 第一是把1..li-1这些边连起来. 并查集1 然后是把ri+1..m这些边连起来. 并查集2 然后把并查集1和并查集2合并在一起求联通分量就好 两个并查集合在一起可以在线性复杂度内完成. 那么花费的时间就在1..li-1和ri+1,,m这两个并查集的获取上.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一下乘法逆元 写个快速幂就好 A-1的逆元就是\((A-1)^{MOD-2}\) 要注意A=1的情况. 然后n最大可能为10^18 所以乘的时候要先对其取模 不然会乘爆 [代码] #include <bits/stdc++.h> #define LL long long using namespac…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是这样 先放k-1个,然后空1个,然后再放k-1个.然后再空1个.. 以此类推. 然后如果(n/k)*(k-1)+n%k>=m的话 那么答案显然就是m,因为不会出现乘2的情况. 否则. 那么只能让某些位置乘2了. 那么什么地方乘呢? 肯定是越前面越早乘越好. 那么temp=m-((n/k)*(k-1)+n%k)就是需要多乘2的次数. 从左往右放入那n/k个空位置中的前temp个就好 然后会发现前temp个连续的k块的递推式…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两个点其实就对应了两组i+j和i-j 且每组i+j和i-j i+j的奇偶性和i-j的奇偶性要是一样的 假设第一组i+j和i-j的奇偶性都是x 第二组i+j和i-j的奇偶性是y 那么x和y要不一样才行. 不然会有重复的点. 会发现只要满足这个就能不重复了. (画图就知道了 那么我们处理出来i+j和i-j…