Codeforces Round 977 (Div. 2)
手速局,因为水平不够三题遗憾离场。
A. Meaning Mean
题意
你一个序列,你每次可以选择两个数删掉,并把他们的平均数加入到序列的末尾。当序列长度为 \(1\) 的时候,剩下的数最大值是多少。
思路
当时比赛的时候唐了,耽误了好几分钟。想的是先奇数和奇数相加,偶数和偶数相加,这样能避免下取整的时候 \(-1\) 。其实每次选择序列里两个最小的数操作就可以了,因为每次操作相当于把两个数除 \(2\) ,所以尽量的让大数除的少就能保证最后剩下的数最大。
代码
void solve()
{
int n;
cin>>n;
priority_queue<int,vector<int>,greater<int>> q;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
q.push(x);
}
while(q.size()!=1)
{
int x=q.top();q.pop();
int y=q.top();q.pop();
q.push((x+y)/2);
}
cout<<q.top()<<endl;
}
B. Maximize Mex
题意
给你一个序列和一个 \(x\) ,你可以进行任意次操作令 \(a_i:=a_i+x\) 。问你以最优方式操作序列的 \(MEX\) 最大是多少。
题意
一般求 \(MEX\) 我都会开个桶来记录一下每个数出现了多少次,从小到大遍历第一个没有出现的数就是 \(MEX\) 。这个题也是同理,如果有多个相同的数那么只有一个数能产生贡献,然后让剩下的都加上 \(x\) 即可。
代码
void solve()
{
int n,m;
cin>>n>>m;
vector<int> num(n+2);
for(int i=1;i<=n;i++)
{
int x;cin>>x;
if(x>n) continue;
num[x]++;
}
for(int i=0;i<=n+1;i++)
{
if(!num[i]) {cout<<i<<endl;return;}
num[i]--;
if(i+m<=n) num[i+m]+=num[i];
num[i]=0;
}
}
C1. Adjust The Presentation (Easy Version)
题意
给你一个长度为 \(n\) 的操作者的顺序 \(a\),再给你一个长度为 \(m\) 规定了只能由谁操作的物品的顺序 \(b\) 。每个操作者操作完一次之后可以插入到队列中的任何位置。问你这 \(m\) 个物品能不能被对应的操作者操作完成。
思路
首先一个人如果操作完了它可以插入到队列的任何位置,说明他已经无敌了,如果当前被操作的物品指定的操作者排在后面并且他没有操作过任何物品,那么他无论如何也无法排到前面来操作,这个序列就不合法。如果这个物品对应的操作者已经操作过了,由于他可以去任何位置,那么这个物品就能立刻被操作。如果所有的物品都能被操作那这个序列就合法。
代码
using namespace std;
void solve()
{
int n,m,q;
cin>>n>>m>>q;
vector<int> a(n+1),b(m+1);
vector<int> vis(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
int pos=1;
for(int i=1;i<=m;i++)
{
if(vis[b[i]]) continue;
else if(a[pos]==b[i])
{
vis[a[pos]]=1;
pos++;
continue;
}
else {cout<<"TIDAK\n";return;}
}
cout<<"YA\n";
}
C2. Adjust The Presentation (Hard Version)
题意
在 \(\text{C1}\) 的基础上又添加了一个修改的操作。我有 \(q\) 次修改操作,每次修改可以更换一个物品指定的操作者(永久性操作),问你修改完了之后的序列是否还合法。
思路
如果一个人可以随意调换位置 (无敌了) 说明他已经操作过物品了,那么他最早能调换位置的时间就是第一个指定他为操作者物品的下标,即第一个 \(b_j=i\) 的下标 \(j\) 。那么每个人最早的无敌时间不能早于排在他前面的人的无敌时间。现在问题是怎么维护这个最早的无敌时间。
我们每次修改只会修改一个位置,那么他能影响到的之后他前面的位置,后面的位置和他自己。所以每次修改只需要更新这三个位置就行了。
代码
void solve()
{
int n,m,q,num=0;
cin>>n>>m>>q;
vector<int> a(n+1),b(m+1),inv(n+1),s(n+1);
vector<set<int>> times(n+1);//维护每个人最早无敌时间
for(int i=1;i<=n;i++) cin>>a[i],inv[a[i]]=i;
for(int i=1;i<=m;i++)
{
cin>>b[i];
b[i]=inv[b[i]];
times[b[i]].insert(i);
}
for(int i=1;i<=n;i++)
{
s[i]=times[i].empty()?m+1:*times[i].begin();//如果没有指定他操作的物品,那这个人的无敌时间就是正无穷
}
for(int i=1;i<n;i++) if(s[i]>s[i+1]) num++;//统计不合法的人的个数
if(num) cout<<"TIDAK\n";
else cout<<"YA\n";
auto update=[&](int x,int c)
{
if(c==1) s[x]=times[x].empty()?m+1:*times[x].begin();
if(x>1 && s[x-1]>s[x]) num+=c;
if(x<n && s[x]>s[x+1]) num+=c;
};
while(q--)
{
int x,y;cin>>x>>y;
y=inv[y];
update(b[x],-1);//删掉这个位置的贡献
times[b[x]].erase(x);
update(b[x],1);//删掉之后更新无敌时间和不合法位置的个数
b[x]=y;//修改
update(b[x],-1);
times[b[x]].insert(x);
update(b[x],1);
if(num) cout<<"TIDAK\n";
else cout<<"YA\n";
}
}
Codeforces Round 977 (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为还需要的蜡烛数, ...
随机推荐
- 内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程) 原文地址 https://zhanghan.blog.csdn.net/article/details/109255980 前言 ...
- 【Vue】单元格合并,与动态校验
效果要求 先看需求效果: 多个数据授权项,配置的时候,业务名称大多数都是一样的,需要合并单元格处理 在elementUI组件文档中有说明[合并列行]: https://element.eleme.io ...
- 如何使用二阶优化算法实现对神经网络的优化 —— 分布式计算的近似二阶优化算法实现对神经网络的优化 —— 《Distributed Hessian-Free Optimization for Deep Neural Network》
论文: <Distributed Hessian-Free Optimization for Deep Neural Network> 地址: https://arxiv.org/abs/ ...
- configure: error: Can't find GL/gl.h. Look for Mesa devel packages for your distro.
1. 安装文件查询工具 sudo apt install plocate 2. 查询头文件地址,shell命令: locate GL/gl.h 3. 为编译时指定其他的头文件查询地址: export ...
- 【转载】 NeuroEvolution with MarI/O —— 使用人工智能来通关超级玛丽
原文地址: http://glenn-roberts.com/posts/tech/2015/07/08/neuroevolution-with-mario.html 参考: https://v.q ...
- DolphinScheduler日志乱码、worker日志太多磁盘报警、版本更新导致不兼容怎么办?
作者 | 刘宇星 本文作者总结了在使用Apache DolphinScheduler过程中遇见过的常见问题及其解决方案,包括日志出现乱码.worker日志太多磁盘报警.版本更新导致不兼容问题等,快来看 ...
- rk3568 | 瑞芯微平台GPIO引脚驱动编写
最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...
- 【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
问题描述 使用标准版的Azure Logic App服务,可以创建多个工作流(workflow),如果在启用/禁用其它的工作流时,是否会对正在运行其它工作流造成影响呢? 问题解答 在实际的测验中,我们 ...
- .net core mvc 跳转LoginPath时端口缺失
在使用nginx部署.net core mvc的程序时,假如我使用的是5002端口,并且当访问站点时如果未登录,则跳转到登录页面.可是最后却发现跳转的时候端口丢失了,那是因为我配置的是 p ...
- Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?
在上一篇,我们学会了redis集群的扩容.从3主3从扩容到4主4从. 那么,接着,活动过去了.流量没有那么大了.需要缩容了.从4主4从缩容到3主3从了.那么这个时候又该怎么处理呢? PS本系列:< ...