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. 基于 Nebula Operator 的 K8s 自动化部署运维

    摘要:Nebula Operator 是 Nebula Graph 在 Kubernetes 系统上的自动化部署运维插件.在本文,你将了解到 Nebula Operator 的特性及它的工作原理. 从 ...

  2. Python input用户交互

    1.input(),阻塞等待用户输入内容并敲回车. 1 #-*- encoding:utf-8 -*- 2 3 name = input('请输入你的名字') 4 5 age = input('请输入 ...

  3. Matlab项目经验分享-去除震荡点

    Matlab是做科研是比较常用的建模工具,我在研一做项目期间遇到了一个还算比较基础的问题,所以我打算记录下来并分享出来! 处理问题步骤: 1. 抛出问题 2. 思考解决方法 3. 代码验证看结果 抛出 ...

  4. yum 方式安装mysql (完整记录)

    2016-04-07 学习笔记,源代码安装比较麻烦,还是要尝试一下yum安装和rpm方式安装 一.检查系统是否安装老版本,有的话干掉 #yum list installed | grep mysqlm ...

  5. MySQL第01课- CentOS + 单实例MySql编译安装总结

    2016年2月,从oracle转向MySql ,碰上几个坑,特此记录 总结 1.注意环境变量.配置文件,操作过程不能出错 2.相比rpm方式安装,编译安装方式可以指定安装路径,再说安装是简单活,将来安 ...

  6. 【C++】归并排序

    性能分析: 时间复杂度:O(n*log(n)) 空间复杂度:O(n) 归并排序算法来自于分而治之思想,"归"是"递归"的意思,"并"是&qu ...

  7. 使用CleanMyMac快速管理应用程序 优化Mac

    CleanMyMac作为一款专业的苹果电脑清理软件,它不仅仅能单纯的卸载不用.少用的应用,同时还支持:1.清理应用程序的数据文件,将应用重置回初始状态,减少空间占用:2.自动检查应用更新,保持应用的最 ...

  8. 思维导图MindManager有新手引导功能吗

    无论是对于初次使用Mindmanager思维导图软件的新手来说,还是对于有一定软件使用基础的进阶者来说,Mindmanager思维导图软件的帮助功能都能给予用户很大的指导作用. Mindmanager ...

  9. guitar pro系列教程(二十二):Guitar Pro在乐谱上的工作【二】

    我们在上一篇文章中给大家介绍了Guitar Pro的工作面板和音轨功能,今天我们将会给大家介绍Guitar Pro这款吉他谱学习软件得音频设置面板,在该面板中包含了声卡得选择.MIDI的输入输出及音轨 ...

  10. Javascript 严格模式的一些理解

    平常我们在ECMAscript5中可以声明以下的变量 num = 5; console.log(num);//输出的是变量5 而为了Javascript更合理.更安全.更严谨的方向发展,添加了一种新的 ...