Codeforces Edu Round 64 A-D
A. Inscribed Figures
分类讨论打表即可。
PS:这道题翻译有歧义。

这样稍微翻转一下,就可以是\(7\)个交点呀...(大概是我没看英文题干导致的惨案)
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 110;
int n, a[N], ans = 0;
int d[3][3]{
{-1, 3, 4},
{3, -1, -1},
{4, -1, -1}
};
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", a + i);
for(int i = 2; i <= n; i++){
int res = d[a[i - 1] - 1][a[i] - 1];
if(i > 1 && i + 1 <= n && a[i + 1] == 2 && a[i] == 1 && a[i - 1] == 3) res = 3;
if(res == -1){
puts("Infinite");
return 0;
}else{
ans += res;
}
}
printf("Finite\n%d\n", ans);
return 0;
}
B. Ugly Pairs
将奇数字母\((char - 'a') \& 1\)与偶数字母分别分开来升序排序,设为\(A\)、\(B\)。
尝试\(AB\)或者\(BA\),若都不行则无解(注意,题有坑,\(za\)是可以的,而\(az\)不行)
证明:
\(A\)与\(B\)都满足\(str[i] <= str[i + 1] (1 <= i < len)\)
若\(A.end()\)不满足\(B.begin()\),反过来匹配也不行。则说明无论怎么拼,它们都是不严谨递增的。
则它们的开头与结尾是相邻的,它们相当于一个并行的状态,必须有一方是不严谨递增的重复字母且一方邻向。(否则不可能不严谨递增)
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
char s[N];
int n, vis[N];
vector<char> A, B;
char inline pre(char c){
return 'a' + ((c - 'a' + 25) % 26);
}
char inline nxt(char c){
if(c == 'z') return '?';
return 'a' + ((c - 'a' + 1) % 26);
}
int main(){
int T; scanf("%d", &T);
while(T--){
A.clear(); B.clear();
scanf("%s", s + 1);
n = strlen(s + 1);
for(int i = 1; i <= n; i++){
if((s[i] - 'a') & 1) A.push_back(s[i]);
else B.push_back(s[i]);
}
sort(A.begin(), A.end());
sort(B.begin(), B.end());
if(A.empty() || B.empty()){
for(int i = 0; i < A.size(); i++)
putchar(A[i]);
for(int i = 0; i < B.size(); i++)
putchar(B[i]);
printf("\n");
}else if(pre(A.back()) != B[0] && nxt(A.back()) != B[0]){
for(int i = 0; i < A.size(); i++)
putchar(A[i]);
for(int i = 0; i < B.size(); i++)
putchar(B[i]);
printf("\n");
}else if(pre(B.back()) != A[0] && nxt(B.back()) != A[0]){
for(int i = 0; i < B.size(); i++)
putchar(B[i]);
for(int i = 0; i < A.size(); i++)
putchar(A[i]);
printf("\n");
}else puts("No answer");
}
return 0;
}
C. Match Points
发现答案具有单调性,既然有\(3\)个,那么一定有\(2\)对,可以二分答案。
\(check()\)函数的检查是一个贪心的过程,使\(x_i\)匹配\(x_{(n / 2) + i}\)这样是很明显最优的方案。
证明:
存在\(x_a <= x_b <= x_c <= x_d\)
若\((a, b),(c, d)\) 可匹配成功,那么\((a, c),(b, d)\)必定能匹配成功,反命题则不然。
那么\(x_b - x_a >= z\),也就是\(x_c >= x_b >= z + x_a\),换过来就是\(x_c - x_a >= z\)
\((b, d)\)的证明同理,所以一一匹配一定是最优的。
PS:写完了程序才发现可以直接\(O(n)\)求解,看了题解才知道自己太弱了...
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200010;
int n, z, x[N];
bool check(int m){
for(int i = 1; i <= m; i++)
if(x[n - m + i] - x[i] < z) return false;
return true;
}
int main(){
scanf("%d%d", &n, &z);
for(int i = 1; i <= n; i++)
scanf("%d", x + i);
sort(x + 1, x + 1 + n);
int l = 0, r = n / 2;
while(l < r){
int mid = (l + r + 1) >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
printf("%d\n", l);
return 0;
}
D. 0-1-Tree
自闭,想不到什么好方法,\(dp\)死活想不出来...
计数问题,可以利用加法原理分开处理。
符合条件的点对\((u, v)\)有三种情况:
- 全部是\(0\)边
- 全部是\(1\)边
- 先经过一些\(0\)边,然后经过\(1\)边
对于情况\(1\),我们可以考虑让图仅存在\(0\)边,然后对于每个连通块,它的点对数量为:
\(size * (size - 1)\)。可以理解为每一个点可以找另外连通块的所有点,交换下来仍然成立。
对于情况\(2\),同理情况\(2\)。
对于情况\(3\),可以考虑找到一个截点\(x\),路径考虑为\(s -> x -> t\),\(s - > x\)上的路径全部为\(0\),\(x -> t\)的路径全部为\(1\)。这种情况,方案数为\((size_{x属于的0边连通块} - 1) * (size_{x属于的1边连通块} - 1)\),理解为在\(x\)属于的\(0\)边连通块中找一个点\(s(s != x)\) ,在\(1\)边同理。
对于上述所有操作,仅仅是集合之间的合并,可以用并查集维护。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 200010, M = N << 1;
int n, f[N][2], size[N][2];
LL ans = 0;
int inline find(int x, int c){
return f[x][c] == x ? x : f[x][c] = find(f[x][c], c);
}
void merge(int a, int b, int c){
a = find(a, c), b = find(b, c);
if(a != b) f[a][c] = b, size[b][c] += size[a][c];
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
f[i][0] = f[i][1] = i;
size[i][0] = size[i][1] = 1;
}
for(int i = 1, u, v, w; i < n; i++){
scanf("%d%d%d", &u, &v, &w);
merge(u, v, w);
}
for(int i = 1; i <= n; i++){
if(f[i][0] == i)
ans += (LL)size[i][0] * (size[i][0] - 1);
if(f[i][1] == i)
ans += (LL)size[i][1] * (size[i][1] - 1);
int p = find(i, 0), q = find(i, 1);
ans += (LL)(size[p][0] - 1) * (size[q][1] - 1);
}
printf("%lld\n", ans);
return 0;
}
Codeforces Edu Round 64 A-D的更多相关文章
- Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告
目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Educational Codeforces Round 64 部分题解
Educational Codeforces Round 64 部分题解 不更了不更了 CF1156D 0-1-Tree 有一棵树,边权都是0或1.定义点对\(x,y(x\neq y)\)合法当且仅当 ...
- Educational Codeforces Round 64(ECR64)
Educational Codeforces Round 64 CodeForces 1156A 题意:1代表圆,2代表正三角形,3代表正方形.给一个只含1,2,3的数列a,ai+1内接在ai内,求总 ...
- Educational Codeforces Round 64部分题解
Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点 ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
随机推荐
- gcc编译链接用到的环境变量
PATH ---- 可执行程序寻找路径 C_INCLUDE_PATH ---- 头文件寻找路径 CPLUS_INCLUDE_PATH --- g++ 头文件路径 LD_LIBRARY_PATH ...
- 03 原型模式(prototype)
03 原型模式(prototype) 1 克隆羊问题 现在有一只羊tom,姓名为: tom.年龄为: 1,颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊. 2 传统方式解决 思路 cla ...
- Win7 安装 Docker 踩的那些坑
公司电脑是 WIN7 x64 旗舰版 SP1,安装 Docker 时踩了好多雷,分享出来给大家排排雷. 首先,Docker Desktop Installer 的 Windows 版只支持 Win10 ...
- 单核cpu多线程有必要吗?
问题分析 现代计算机一般都是多核cpu,多线程的可以大大提高效率,但是可能会有疑问,那单核CPU使用多线程是不是没有必要了,假定一种情况,web应用服务器,单核CPU.单线程,用户发过来请求,单个线程 ...
- beef抓包简析
搭建完了beef就想简答的抓下包分析下 这是第一个包,追踪它 返回demo页面,并发现其中的脚本 window.location.protocol表示协议http, window.location.h ...
- MathType怎么写分段函数?
分段函数是数学里面特有的一种函数,它是对于自变量x的不同的取值范围,有着不同的解析式的函数.它的特点就是有一个大括号,然后有至少2个函数解析式,写这样的函数离不开专业的公式编辑器,下面就来学习具体编辑 ...
- 两种方式教你搞定在mac中格式化磁盘的问题
mac怎么格式化u盘?想必这是大部分苹果用户都会关心的一个问题.格式化u盘在我们日常工作中算是一个比较常规的操作了.但是在mac中随着系统版本不一样,格式化的方式也略有差别.今天,小编将以Mac OS ...
- 统计API调用次数
使用redis的有序集合, Zincrby https://redis.io/commands/zincrby 使用的symfony框架的这个方法,会返回接口名称 $request->getPa ...
- 10万级etl批量作业自动化调度工具Taskctl之轻量级Web应用版
什么是批量作业: 批量处理是银行业整个信息后台最为重要的技术形态,也是银行核心信息资产数据的分享.传输.演化的重要技术手段.有调查指出,全球70%的数据是经过批量处理得以再次使用,可见批量处理在整个信 ...
- [从源码学设计]蚂蚁金服SOFARegistry之消息总线
[从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...