New Year and Rainbow Roads 思路:我们考虑两个绿点之间的红点和蓝点, 首先把这些红点和蓝点接到绿点上面绝对不会超过绿点距离的两倍. 然后我们先把两个绿点连上, 再把绿点经过蓝点到绿点的线连上, 绿点经过红点到绿点的线连上, 这时距离为3倍的绿点间距离, 然后我们可以在第二条路径和第三条路径上断开一段最长的, 和两个的绿点距离取个最小值,就是这段的贡献. #include<bits/stdc++.h> #define LL long long #define fi fi…
题意:在一条数轴上有若干'R','B','G'点,连接两个点的代价是位置差,要求使用最小代价使得除去所有'R'点后剩下的所有点联通,除去所有'B'点后剩下的所有点联通. 还以为会是什么最小生成树,结果是脑洞题啊 因为G点总是要保留下来的,所以考虑按照G分成若干块,对于每个以G开头以G结尾的块,考虑如下两种操作: 1.分别依次连接 左G-中间所有的R-右G.左G-中间所有的B-右G,代价为 $ 2*len $ 2.连接两端的G,再由两端的G依次分别连接中间的B和R,即,把两端的G和R.B分别依次连…
题 OvO http://codeforces.com/contest/908/problem/F CF 908F 解 需要注意细节的模拟题. 如果三种颜色都存在,则记每两个相邻的G组成一个段,对每个段进行讨论. 如果三种颜色中缺了某种或某些颜色,则特殊地进行讨论. 如果是像 BRB 这组数据 如果把第一个B和第三个B连起来,那么中间的R也和这两个B相连了 #include <iostream> #include <cstring> #include <cmath> #…
题目链接:http://codeforces.com/problemset/problem/629/E 询问这个简单环的期望.考虑将这个环拆成两部分. 令${deep[x]>=deep[y]}$,${size[x]}$表示以$x$为根的子树大小,${sdown[x]}$示以$x$为根的子树的所有节点到$x$的距离和,${sall[x]}$所有点到$x$的距离和.${ne}$表示从${y-->x}$路径上${y}$的儿子. 1.${dis(x,y)}$这是一个环肯定要经过的,算入答案. 2.分情…
题意:一颗树,每条边有个颜色,一条路径被定义为“彩虹”,当且仅当其上没有长度大于等于2的同色子路径.一个结点被定义为“超级结点”,当且仅当从其发出的所有路径都是“彩虹”. 枚举所有长度为2,且同色的路径,其两端点方向发出的子树中的结点都不可能成为答案,只需要将它们覆盖掉即可,用dfs序处理,在左端点+1,右端点-1,最后求个前缀和,为0的结点就是没有被覆盖过的结点,也即“超级结点”. 分两种情况:这两条边深度相同:这两条边深度不同. #include<cstdio> #include<m…
题目传送门 题目大意: 给出一颗树,每条边都有一个颜色,对一个点来说,如果其他所有点到这个点的简单路径,相连的边颜色都不同,这个点即合法点,统计所有的合法点. 思路: 对于一个节点来说 1.如果这个节点的两个子节点的边颜色一样,那么这两个子节点的子树都要放弃. 2.如果这个节点的子节点和他的父节点的边的颜色一样,那么子节点所在子树放弃,父节点中除了这个节点以外的其他节点都要放弃. 剩下的点就是合法点. 那怎么做到放弃呢? 先dfs处理出每个节点的dfs序,每个dfs序对应的节点标号,每个节点的子…
题目链接:https://cn.vjudge.net/problem/Gym-101615D 题意 给一棵树,每个边权表示一种颜色. 现定义一条彩虹路是每个颜色不相邻的路. 一个好点是所有从该节点开始的所有简单路径(最短路)都是彩虹路. 问有哪几个好点?按编号输出. 思路 按节点遍历,若有多条路边权一样,则这几个子树都不是好点. 除去不好点,剩下即为好点. 一开始的思路是树上dp,然而情况实在太多,WA好几次. 最后看题解,发现有个dfs序的操作,把子树表示成数组里的一个范围,每次区间打标志即可…
A - New Year and Counting Cards #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> #include<iostream> #include<…
A. Odd Palindrome 所有回文子串长度都是奇数等价于不存在长度为$2$的偶回文子串,即相邻两个字符都不同. #include<cstdio> #include<cstring> char a[1111111];int n,i; int main(){ scanf("%s",a+1); n=strlen(a+1); for(i=1;i<n;i++)if(a[i]==a[i+1])return puts("Or not."),…
A - Odd Palindrome 水. #include <bits/stdc++.h> using namespace std; #define N 110 char s[N]; inline bool work() { int len = strlen(s); ; i < len; ++i) { ]) return false; } return true; } int main() { while (scanf("%s", s) != EOF) { puts…