A

直接模拟即可,注意 \(10^k\) 的情况(罚时!罚时!罚时!).

A Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
ll n;
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%lld", &n); ll t = n;
ll x = 1;
bool flag = true;
while (n >= 10){flag &= !(n % 10); n /= 10; x *= 10;}
if (flag && (n == 1)) puts("0");
else printf("%lld\n", t - x);
} return 0;
}

B

用一个 std::set 扫一遍即可 .

B Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
string s;
int main()
{
int T; scanf("%d", &T);
while (T--)
{
cin >> s; int ans = 0, l = s.length();
set<char> se;
for (int i=0; i<l; i++)
{
se.insert(s[i]);
if (se.size() > 3){se.clear(); se.insert(s[i]); ++ans;}
}
printf("%d\n", ans + 1);
} return 0;
}

C

不难发现如果可以必然是 \(b_i\) 最后一次出现的位置不小于 \(a_i\) 第一次出现的位置 .

std::set 判是否在序列中,std::map 存出现位置即可 .

C Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 114514;
map<int, pii> M; // fst, sec
set<int> s;
int n, k, a[N];
int main()
{
int T; scanf("%d", &T);
while (T--)
{
s.clear(); M.clear();
scanf("%d%d", &n, &k);
for (int i=1; i<=n; i++)
{
scanf("%d", a+i);
if (s.find(a[i]) == s.end()) M[a[i]] = make_pair(i, i);
else M[a[i]].second = i;
s.insert(a[i]);
}
int p, q;
while (k--)
{
scanf("%d%d", &p, &q);
if ((s.find(p) == s.end()) || (s.find(q) == s.end())){puts("NO"); continue;}
if (M[q].second > M[p].first) puts("YES");
else puts("NO");
}
} return 0;
}

D

贪心地删掉权值最大的字符即可 .

D Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
constexpr int N = 514514;
string s;
int w;
vector<pii> vec;
inline bool cmp1(const pii& a, const pii& b)
{
return a.first == b.first ? a.second < b.second : a.first < b.first;
}
inline bool cmp2(const pii& a, const pii& b)
{
return a.second == b.second ? a.first < b.first : a.second < b.second;
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
vec.clear();
cin >> s; int l = s.length();
scanf("%d", &w); int p = 0;
for (int i=0; i<l; i++) vec.emplace_back(make_pair(s[i]-'a', i)), p+=s[i]-'a'+1;
stable_sort(vec.begin(), vec.end(), cmp1);
while (!vec.empty() && (p > w)){p -= vec.back().first + 1; vec.pop_back();}
stable_sort(vec.begin(), vec.end(), cmp2);
for (pii x : vec) putchar(x.first+'a');
puts("");
}
return 0;
}

E

首先排除掉一些显然不对的情况,例如 \(\{a,a\}\) 或者出现次数大于 \(2\) .

然后对于每个 \(\{a,b\}\),\(a,b\) 肯定不能同时选,于是连边 \(a\leftrightarrow b\),因为要分成两份所以黑白染色判是否是二分图即可 .

E Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
constexpr int N = 514514;
int n, cc[N];
vector<int> g[N];
inline void addedge(int u, int v){g[u].emplace_back(v);}
inline void ade(int u, int v){addedge(u, v); addedge(v, u);}
int col[N];
bool dfs(int u, int c)
{
col[u] = c;
for (int v : g[u])
if ((col[v] == c) || (!col[v] && !dfs(v, 3 - col[u]))) return false;
return true;
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
bool _ = false;
for (int i=1, u, v; i<=n; i++)
{
scanf("%d%d", &u, &v); ade(u, v);
if (u == v) _ = true;
++cc[u]; ++cc[v];
}
for (int i=1; i<=n; i++)
if (cc[i] > 2){_ = true; break;}
if (_){puts("NO"); goto ed;} // no goto -- Dijkstra
_ = true;
for (int i=1; i<=n; i++)
if (!col[i] && !dfs(i, 1)){puts("NO"); _ = false; break;}
if (_) puts("YES");
ed:
for (int i=1; i<=n; i++){cc[i] = col[i] = 0; g[i].clear();}
}
return 0;
}

F

ABC 原题:ABC254H .

代码略

G1, G2

G1 直接暴力

G2 首先把所有点的 LCA 求出来 .

然后按深度排序,判两两 LCA 是否等于它们本身或所有点的 LCA 即可 .

G1 Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
constexpr int N = 514514, LgN = __lg(N) + 1;
int n, dep[N], f[N][LgN];
vector<int> g[N];
inline void addedge(int u, int v){g[u].emplace_back(v);}
inline void ade(int u, int v){addedge(u, v); addedge(v, u);}
void dfs(int u, int fa)
{
f[u][0] = fa; dep[u] = dep[fa] + 1;
for (int i=1; i<LgN; i++) f[u][i] = f[f[u][i-1]][i-1];
for (int v : g[u])
if (v != fa) dfs(v, u);
}
inline int lca(int p1, int p2)
{
if (dep[p1] < dep[p2]) swap(p1,p2);
for (int i=LgN-1; i>=0; i--)
if (dep[f[p1][i]] >= dep[p2]) p1 = f[p1][i];
if (p1 == p2) return p2;
for (int i=LgN-1; i>=0; i--)
if (f[p1][i] != f[p2][i]){p1 = f[p1][i]; p2 = f[p2][i];}
return f[p1][0];
}
int main()
{
scanf("%d", &n);
for (int i=1, u, v; i<n; i++) scanf("%d%d", &u, &v), ade(u, v);
dfs(1, 0);
int q, k;
scanf("%d", &q);
while (q--)
{
vector<int> nd; vector<bool> vis;
scanf("%d", &k); nd.resize(k); vis.resize(n+10);
int core = 0, core2 = 0, fake = 0;
for (int i=0; i<k; i++)
{
scanf("%d", &nd[i]);
if (!core2) core2 = nd[i];
else core2 = lca(core2, nd[i]);
}
++k; nd.emplace_back(core2);
sort(nd.begin(), nd.end());
nd.erase(unique(nd.begin(), nd.end()), nd.end());
k = nd.size();
for (int i=0; i<k; i++)
{
if (!core || (dep[nd[i]] < dep[core])) core = nd[i];
if (!fake || (dep[nd[i]] > dep[fake])) fake = nd[i];
}
int u = fake;
while (u && (u != core)){vis[u] = true; u = f[u][0];}
vis[u] = true;
if (!u){puts("NO"); continue;}
fake = 0;
for (int i=0; i<k; i++)
{
if (vis[nd[i]]) continue;
if (!fake || (dep[nd[i]] > dep[fake])) fake = nd[i];
}
if (!fake){puts("YES"); continue;}
u = fake;
bool f = false;
while (u && (u != core))
{
if (vis[u]){puts("NO"); f = true; break;}
vis[u] = true; u = ::f[u][0];
} vis[u] = true;
if (f) continue;
for (int i=0; i<k; i++)
if (!vis[nd[i]]){puts("NO"); f = true; break;}
if (f) continue;
if (!u){puts("NO"); continue;}
puts("YES");
}
return 0;
}
G2 Code
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
constexpr int N = 514514, LgN = __lg(N) + 1;
int n, dep[N], f[N][LgN];
vector<int> g[N];
inline void addedge(int u, int v){g[u].emplace_back(v);}
inline void ade(int u, int v){addedge(u, v); addedge(v, u);}
void dfs(int u, int fa)
{
f[u][0] = fa; dep[u] = dep[fa] + 1;
for (int i=1; i<LgN; i++) f[u][i] = f[f[u][i-1]][i-1];
for (int v : g[u])
if (v != fa) dfs(v, u);
}
inline int lca(int p1, int p2)
{
if (dep[p1] < dep[p2]) swap(p1,p2);
for (int i=LgN-1; i>=0; i--)
if (dep[f[p1][i]] >= dep[p2]) p1 = f[p1][i];
if (p1 == p2) return p2;
for (int i=LgN-1; i>=0; i--)
if (f[p1][i] != f[p2][i]){p1 = f[p1][i]; p2 = f[p2][i];}
return f[p1][0];
}
vector<int> nd;
vector<bool> vis;
vector<int> l;
int main()
{
scanf("%d", &n);
for (int i=1, u, v; i<n; i++) scanf("%d%d", &u, &v), ade(u, v);
dfs(1, 0);
int q, k;
scanf("%d", &q);
while (q--)
{
scanf("%d", &k); nd.clear(); nd.resize(k); vis.clear(); vis.resize(n+1); l.clear();
int core = 0;
for (int i=0; i<k; i++)
{
scanf("%d", &nd[i]);
if (!core || (dep[nd[i]] < dep[core])) core = nd[i];
}
if ((k == 1) || (k == 2)){puts("YES"); continue;}
int cc = 0;
for (int i=0; i<k; i++) cc += (dep[core] == dep[nd[i]]);
if (cc > 2){puts("NO"); continue;}
for (int i=0; i<k; i++)
{
int tmp = lca(core, nd[i]);
if (dep[tmp] < dep[core]) core = tmp;
}
stable_sort(nd.begin(), nd.end(), [](int i, int j){return dep[i] > dep[j];});
bool flag = true;
cc = 0;
for (int i=0; i<k; i++)
{
int u = nd[i], v;
if ((nd[i] == core) || vis[u]) continue;
l.emplace_back(u); ++cc;
if (cc > 2){flag = false; break;}
for (int j=0; j<k; j++)
{
v = nd[j];
if ((i == j) || vis[v]) continue;
if ((lca(u, v) == v) && (lca(u, core) == core) && (lca(v, core) == core)) vis[v] = true;
}
}
if (cc == 2)
{
int t = lca(l[0], l[1]);
if ((t != core) && (t != l[0]) && (t != l[1])){puts("NO"); continue;}
}
if (flag) puts("YES");
else puts("NO");
}
return 0;
}

CF Round #805 (Div. 3) 题解的更多相关文章

  1. 【Codeforces】CF Round #592 (Div. 2) - 题解

    Problem - A Tomorrow is a difficult day for Polycarp: he has to attend \(a\) lectures and \(b\) prac ...

  2. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  3. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  4. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  5. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  6. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  7. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  8. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  9. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

随机推荐

  1. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  2. Java 17 新特性:switch的模式匹配(Preview)

    还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...

  3. CesiumJS 2022^ 原理[5] - 着色器相关的封装设计

    目录 1. 对 WebGL 接口的封装 1.1. 缓冲对象封装 1.2. 纹理与采样参数封装 1.3. 着色器封装 1.4. 上下文对象与渲染通道 1.5. 统一值(uniform)封装 1.6. 渲 ...

  4. .netcore6.0自己配置swagger

    环境:.net core6.0 一.安装依赖包:Swashbuckle.AspNetCore 二.右击项目->属性->生成->输出,勾选文档文件,然后配置文件生成路径,注意是相对路径 ...

  5. PowerShell 笔记 - 基础篇

    Powershell 笔记 基础 查看powershell版本 PS C:\Users\chino> $PSVersionTable Name Value ---- ----- PSVersio ...

  6. MyBatis热部署

    代码 import java.io.IOException; import java.lang.reflect.Field; import java.util.HashMap; import java ...

  7. 安装Samba到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:Samba-4.6.2 硬件要求:无 安装过程 1.基础网络配置 配置一个静态IP,关闭防火墙.SeLinux ...

  8. 【SpringCloud原理】万字剖析OpenFeign之FeignClient动态代理生成源码

    年前的时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇.今天就继续接着剖析Sprin ...

  9. Go微服务框架go-kratos实战01:quickstart 快速开始

    先来感受下用 kratos 快速创建项目 一.环境准备 1.1 安装依赖软件 protoc protoc-gen-go 建议开启 GO111MODULE 1.2 安装 kratos cli go in ...

  10. 省HVV初体验(edu)

    浙江省HVV初体验 此次参加的HVV是edu分会场,总的来说是对HVV有了一个初步的认识,了解实战和靶场练习之间存在的巨大鸿沟. 经历了这次HVV,对于渗透测试有了更深一步的理解.渗透测试的本质就是信 ...