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)\)有三种情况:

  1. 全部是\(0\)边
  2. 全部是\(1\)边
  3. 先经过一些\(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的更多相关文章

  1. Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告

    目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...

  2. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  3. Educational Codeforces Round 64 部分题解

    Educational Codeforces Round 64 部分题解 不更了不更了 CF1156D 0-1-Tree 有一棵树,边权都是0或1.定义点对\(x,y(x\neq y)\)合法当且仅当 ...

  4. Educational Codeforces Round 64(ECR64)

    Educational Codeforces Round 64 CodeForces 1156A 题意:1代表圆,2代表正三角形,3代表正方形.给一个只含1,2,3的数列a,ai+1内接在ai内,求总 ...

  5. Educational Codeforces Round 64部分题解

    Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点 ...

  6. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  7. 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]中有多少个数 ...

  8. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  9. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

随机推荐

  1. 预估ceph的迁移数据量

    引言 我们在进行 ceph 的 osd 的增加和减少的维护的时候,会碰到迁移数据,但是我们平时会怎么去回答关于迁移数据量的问题,一般来说,都是说很多,或者说根据环境来看,有没有精确的一个说法,到底要迁 ...

  2. 设计模式(一)--工厂模式(Go实现)

    package Factory import "fmt" type Restaurant interface { GetFood() } type Donglaishun stru ...

  3. Docker版EKL安装记录文档

    Docker版EKL安装记录文档 拉取已下三个镜像 docker.io/logstash 7.5.2 b6518c95ed2f 6 months ago 805 MB docker.io/kibana ...

  4. 使用ES替代whoosh全文检索

    目录 1.docker安装ES 1.拉取docker镜像 2.使用docker安装ES 3.在页面中测试 2.使用ES替代whoosh全文检索 2.1 在Django中修改搜索引擎为ES 2.2 命令 ...

  5. celery配置与基本使用

    目录 1.celery配置与基本使用 1.1 安装celery 2.测试celery 2.1启动celery 1.celery配置与基本使用 1.1 安装celery # celery_task/ma ...

  6. 【电子取证:镜像仿真篇】Windows Server镜像仿真、vmdk镜像仿真

    Windows Server镜像仿真.vmdk镜像仿真 时间过得真快呀!--[suy999] Windows Server镜像仿真.vmdk镜像仿真 一.qemu-img镜像转换工具 (一)raw.q ...

  7. 跨域共享CORS详解及Gin配置跨域

    跨域简介 当两个域具有相同的协议(如http), 相同的端口(如80),相同的host,那么我们就可以认为它们是相同的域(协议,域名,端口都必须相同). 跨域就指着协议,域名,端口不一致,出于安全考虑 ...

  8. Java 虚拟机运行时数据区详解

    本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  9. zuul1.x和gateway的区别

    阻塞与非阻塞: 1.实际上是Spring mvc与Spring webflux的区别 转载:https://www.cnblogs.com/lixinjie/p/a-brother-of-spring ...

  10. 区块链V1版本实现之四

    部分程序代码(添加区块): //添加区块 func (bc *BlockChain) AddBlock(data string) { //创建一个区块 //bc.Block的最后一个区块的Hash值就 ...