Codeforces Round 967 (Div. 2)
题目链接:Codeforces Round 967 (Div. 2) - Codeforces
总结:B题没测试就交wa一发,C题一直没想到怎么回溯,哎。
A. Make All Equal
tag:签到
Solution:找到相同元素的最大值,将其它所有元素删去。
void solve(){
cin >> n;
vector<int> a(n);
map<int, int> mp;
int ans = 0;
for (int i = 0; i < n; i ++){
cin >> a[i];
mp[a[i]] ++;
ans = max(ans, mp[a[i]]);
}
cout << n - ans << endl;
}
B. Generate Permutation
tag:构造
Solution:对于一个数\(i\),我们发现如果\(i - 1\)在它左边,则第二台打字机执行一次回车;如果在它右边,则第一台打字机执行一次回车。那么我们构造一个\(a_4a_2a_1a_3a_5\)。同时发现\(n\)是偶数,一定不行。
Competing:一下就猜中了,写完代码后没测试,wa一发。
void solve(){
cin >> n;
if (n % 2 == 0){
cout << "-1\n";
}
else{
vector<int> a(n);
int t = n - 1;
for (int i = 1; t; i ++){
a[i] = t;
t -= 2;
}
t = n;
for (int i = n; t >= 1; i --){
a[i] = t;
t -= 2;
}
for (int i = 1; i <= n; i ++){
cout << a[i] << " \n"[i == n];
}
}
}
C. Guess The Tree
tag:交互 + dfs
Description:给定一个\(n\)个节点的数,每次询问输出? a b,会返回一个节点\(x\),使|d(x - a) - d(x - b)|最小。\(d(x, y)\)表示\(x\)到\(y\)的距离。如果有多个这样的节点,会返回使d(x, a)最小的节点。用最多\(15n\)次查询,得出树的结构。
Solution:分析每次询问得到的结果发现每次都会给出\(a, b\)路径上的中点\(mid\),那么我们继续询问\(a, mid\)与\(mid, b\),直到\(mid == a || mid == b\)。
- 需要记录每个节点的父节点,避免重复询问。
- 对于一棵树,我们可以假设任意一个节点为根
Competing:想到应该用\(mid\)继续往下问,但是没想到使用\(dfs\),导致不知道如何回溯。
int query(int a, int b){
cout << "? " << a << " " << b << endl;
int x;
cin >> x;
return x;
}
void dfs(int a, int b){ // a是父节点
if (fa[a] && fa[b])
return;
int t = query(a, b);
if (a == t || t == b){
fa[b] = a;
ans.push_back({a, b});
return;
}
else{
dfs(a, t);
dfs(t, b);
}
}
void solve(){
cin >> n;
ans.clear();
for (int i = 0; i <= n; i ++){
fa[i] = 0;
}
fa[1] = 1;
while (ans.size() < n - 1){
for (int i = 2; i <= n; i ++){
if (fa[i] == 0){
dfs(1, i);
}
}
}
cout << "! ";
for (int i = 0; i < ans.size(); i ++){
cout << ans[i].fi << " " << ans[i].se << " ";
}
cout << endl;
}
D. Longest Max Min Subsequence
tag:思维 + 贪心 + 单调队列优化
Description:给定一个整数序列\(a\),\(s\)是\(a\)的所有非空子序列的集合,要找到一个最长的\(s\),如果有多个序列,则找出奇数位乘\(-1\),之后字典序最小的序列。
n <= 3e5
Solution:我们首先可以确定哪些值是必须要选的。我们要保证能选出最长的序列,就需要记录每个值最后出现的位置,在最后出现的位置最小的元素之前我们可以任意选择,而不能先选在该元素之后的其他元素。
- 一个可选的区间内,对于奇数位我们选择值最大的元素,对于偶数位我们选择值最小的元素。如果我们每次暴力寻找,时间复杂度为\(O(n ^2)\),考虑使用单调队列优化。
void solve(){
cin >> n;
vector<int> a(n + 1);
unordered_map<int, int> mp;
set<int> st;
for (int i = 1; i <= n; i ++){
cin >> a[i];
mp[a[i]] = i;
}
for (auto [x, y] : mp){ // 记录每个元素最后出现的位置
st.insert(y);
}
int sz = mp.size();
cout << sz << endl;
int s = 1;
int c = 0;
priority_queue<pii, vector<pii>, greater<pii>> smi; // 值从小到大,序号从小到大
priority_queue<pii, vector<pii>, greater<pii>> sma; // 值从大到下,序号从小到大
int tt = 0;
while (c < sz){
int et = *(st.begin()); // 当前最前面最后出现的元素的位置
int res, idx;
for (int i = s; i <= et; i ++){
if (mp[a[i]] != 0){ // 等于0说明选过了
smi.push({a[i], i});
sma.push({-a[i], i});
}
}
if ((c + 1) & 1){ // 选最大值
auto [x, y] = sma.top();
res = x, idx = y;
}
else{ // 选最小值
auto [x, y] = smi.top();
res = x, idx = y;
}
cout << a[idx] << " ";
st.erase(mp[a[idx]]); // 删除选择点的下标
mp[a[idx]] = 0;
s = et + 1;
c ++;
while (sma.size()){ // 删除选择过的元素或者下标小于当前值的元素
auto [x, y] = sma.top();
if (res > 0)
res = -res;
if (!mp[-x] || y <= idx)
sma.pop();
else
break;
}
while (smi.size()){
auto [x, y] = smi.top();
if (res < 0)
res = -res;
if (!mp[x] || y <= idx)
smi.pop();
else
break;
}
}
cout << endl;
}
Codeforces Round 967 (Div. 2)的更多相关文章
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
- Codeforces Round #268 (Div. 2) ABCD
CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
随机推荐
- springboot将文件处理成压缩文件
前言 在工作我们经常会出现有多个文件,为了节省资源会将多个文件放在一起进行压缩处理:为了让大家进一步了解我先将springboot处理的方法总结如下,有不到之处敬请大家批评指正! 一.文件准备: ht ...
- 【每天学点AI】前向传播、损失函数、反向传播
在深度学习的领域中,前向传播.反向传播和损失函数是构建和训练神经网络模型的三个核心概念.今天,小编将通过一个简单的实例,解释这三个概念,并展示它们的作用. 前向传播:神经网络的"思考&quo ...
- 鸿蒙Navigation拦截器实现页面跳转登录鉴权方案
我们在进行页面跳转时,很多情况下都得考虑登录状态问题,比如进入个人信息页面,下单交易页面等等.在这些场景下,通常在页面跳转前,会先判断下用户是否已经登录,若已登录,则跳转到相应的目标页面,若没有登录, ...
- SQL注入sqlmap联动burpsuite之burp4sqlmap++插件
目录 sqlmap和burpsuite介绍 sqlmap4burp++介绍 sqlmap4burp++的使用 小插曲:sqlmap报错文件不存在怎么办? 官方扩展CO2之SQLmapper sqlma ...
- [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
概述:这部分解释了如何使用AdminAPI设置沙盒部署.部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法.在将功能部署到生产服务器之前,您可以在本地测试功能.AdminAPI具有内 ...
- (Python基础教程之十九)Python优先级队列示例
1.什么是优先队列 优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素还具有与之关联的"优先级". 在优先级队列中,优先级高的元素先于优先级低的元素提供. 如果 ...
- 话说ReferenceQueue
也是几年前写的,在内部邮件列表里发过,在这里保存一下. 看到了这篇帖子: <WeakHashMap的神话>http://www.javaeye.com/topic/587995 因为Jav ...
- Ubuntu18.04安装Java
介绍 Java和JVM(Java的虚拟机)是许多软件所必需的,包括Tomcat,Jetty,Glassfish,Cassandra和Jenkins. 在本教程中,您将使用apt安装各种版本的Java ...
- Redis常见问题汇总
日常使用中Redis中配到的问题汇总 1. RedisDesktopManager提示:Connection error: QRedisClient compiled without ssh supp ...
- 2023-05 多校联合训练 ZJNU站 热身赛
猫猫接币币 给定两个容量分别为a和b的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使 ...