Codeforces Round #786 (Div. 3) 补题记录
小结:
A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了。
CF1674A Number Transformation
考虑若 \(y\) 不能整除 \(x\) 则无解,否则一定存在一组解 \(a=1,b=y\div x\)。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
int T,n,a[200005],x,y ;
string s;
void solve(){
cin>>x>>y;
if(y%x){
cout<<"0 0"<<endl;
return ;
}
int tmp=y/x;
cout<<1<<' '<<tmp<<endl;
}
signed main(){
IOS;TIE;
T=1;
cin>>T;
while(T--) solve();
return 0;
}
CF1674B Dictionary
直接用 \(\text{map}\) 映射,用两个字符或字符串对应数字,注意两个字符相同的要跳过。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T,n,a[200005],x,y,tot;
string s;
map<pair<char,char>,int> mp;
void solve(){
cin>>s;
cout<<mp[mk(s[0],s[1])]<<endl;
}
signed main(){
IOS;TIE;
T=1;
for(char i='a';i<='z';i++){
for(char j='a';j<='z';j++){
if(i==j) continue;
mp[mk(i,j)]=++tot;
}
}
cin>>T;
while(T--) solve();
return 0;
}
CF1674C Infinite Replacement
分类讨论:
- 若替换串中有
a,且替换串长度 \(>1\),则可以无限替换,输出 \(-1\) - 若替换串中有
a,且替换串长度 \(=1\),则只有一种情况,即原串 - 否则,考虑原串中每一位是否替换,可能情况有 \(2^{原串长度}\) 种情况
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T;
string s,t;
void solve(){
cin>>s>>t;
bool fl=0;
for(int i=0;i<t.size();i++){
if(t[i]=='a') fl=1;
}
if(fl&&t.size()>1){
cout<<-1<<endl;
return ;
}
if(fl){
cout<<1<<endl;
return ;
}
cout<<(1ll<<s.size())<<endl;
}
signed main(){
IOS;TIE;
cin>>T;
while(T--) solve();
return 0;
}
CF1674D A-B-C Sort
容易发现这样操作之后只可以改变相邻两个数的位置,若原长度为奇数则第一个数会多出来,否则看两两是否相等即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T,n,a[200005],b[200005];
int l[1000005],r[1000005];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
if(n%2){
if(a[0]!=b[0]){
cout<<"NO"<<endl;
return ;
}
}
for(int i=1+(n%2);i<=n;i+=2){
if(!(a[i]==b[i]&&a[i+1]==b[i+1]||a[i]==b[i+1]&&a[i+1]==b[i])){
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
}
signed main(){
IOS;TIE;
cin>>T;
while(T--) solve();
return 0;
}
CF1674E Breaking the Wall
分类讨论:
- 取原串中最小的两个数 \(x,y\)(不一定相邻),使它们变零。分别一直 \(-2\),代价为 \(⌈\frac{x}{2}⌉+⌈\frac{y}{2}⌉\)
- 取原串中相邻两个数 \(a_i,a_{i+1}\),使他们变零。设 \(x\) 为较大数,\(y\) 为较小数:
- 若 \(x>y\times2\),则一直在 \(x\) 处 \(-2\),代价为 \(y+⌈\frac{x-2\times y}{2}⌉\)
- 否则,看大小灵活 \(-2\),代价为 \(⌈\frac{x+y}{3}⌉\)
- 取原串中间隔一数的两个数 \(a_i,a_{i+2}\),使他们变零。设 \(x\) 为较大数,\(y\) 为较小数。先一直使中间数 \(-2\) 直到 \(x,y\) 中任意一个变 \(0\),随后剩下的一直 \(-2\),代价为 \(y+⌈\frac{x-y}{2}⌉\)
去三种情况的最小答案即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T,n,a[200005],ans=1e18,mn,semn;
void case0(){
mn=semn=1e18;
for(int i=1;i<=n;i++){
if(a[i]<mn) semn=mn,mn=a[i];
else if(a[i]<semn) semn=a[i];
}
ans=min(ans,(int)ceil(mn/2.0)+(int)ceil(semn/2.0));
}
void case1(){
for(int i=1;i<n;i++){
int x=a[i],y=a[i+1];
if(x<y) swap(x,y);
if(y*2<x) ans=min(ans,y+(int)ceil((x-y*2)/2.0));
else ans=min(ans,(int)ceil((x+y)/3.0));
}
}
void case2(){
for(int i=1;i<n-1;i++){
int x=a[i],y=a[i+2];
ans=min(ans,min(x,y)+(int)ceil(abs(x-y)/2.0));
}
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
case0();case1();case2();
cout<<ans<<endl;
}
signed main(){
IOS;TIE;
T=1;
while(T--) solve();
return 0;
}
CF1674F Desktop Rearrangement
题意实为要求将所有 * 移动到这种状态:

即优先填满靠左的列。
所以每次要做的就是统计出当前棋盘上有多少 *,这是左侧该有 * 的数量,然后算出该有 * 的位置有多少是空的,即为最小移动步数。
考虑对于每一列维护前缀和,每次更新一个点加一列,询问只要从左往右扫即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T,n,m,x,y,q,s[1005][1005],sum;
bool a[1005][1005];
char c;
void solve(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c;
if(c=='*') a[i][j]=1,sum++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) s[i][j]=s[i-1][j]+a[i][j];
}
while(q--){
cin>>x>>y;
if(a[x][y]){
sum--;
for(int i=x;i<=n;i++) s[i][y]--;
}
else{
sum++;
for(int i=x;i<=n;i++) s[i][y]++;
}
a[x][y]^=1;
int tmp=sum,ans=0;
for(int j=1;j<=m;j++){
if(tmp>n) tmp-=n,ans+=n-s[n][j];
else{
ans+=tmp-s[tmp][j];
break;
}
}
cout<<ans<<endl;
}
}
signed main(){
IOS;TIE;
T=1;
while(T--) solve();
return 0;
}
CF1674G Remove Directed Edges
首先手玩样例,可以发现一个性质:删边之后若可以从 \(u\to v\),则需满足 \(u\) 的出度 \(>1\),\(v\) 的入度 \(>1\)。
同时,\(\text{DAG}\) 中要取一个点集,使可以从其中一点走向另一点,则此点集一定可以构成一条链。具体可以根据拓扑序来理解。
所以,就可以用拓扑排序求最长路的方法来做这道题。不同的是,有入度、出度 \(>1\) 的限制条件。具体处理方法是:记下每一个点的原始入度 \(In_i\) ,如果当前队首出度 \(<2\),则按照常规拓扑排序的来搞,否则,若走向点的原始入度 \(>1\),则可以更新那个点的答案。同时,减入度和入队还是和一般拓排序一样。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0);
#define int long long
#define mk(x,y) make_pair(x,y)
using namespace std;
int T,n,m,in[200005],In[200005],out[200005],f[200005],u,v,ans;
bool vis[200005];
vector<int> a[200005];
queue<int> q;
void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
a[u].push_back(v);
in[v]++,In[v]++,out[u]++;
}
for(int i=1;i<=n;i++) if(!in[i]) vis[i]=1,q.push(i);
for(int i=1;i<=n;i++) f[i]=1;
while(q.size()){
int k=q.front();q.pop();
if(out[k]<2){
for(int i=0;i<a[k].size();i++){
int tmp=a[k][i];
if(!--in[tmp]) q.push(tmp);
}
continue;
}
for(int i=0;i<a[k].size();i++){
int tmp=a[k][i];
if(In[tmp]>1) f[tmp]=max(f[tmp],f[k]+1);
if(!--in[tmp]) q.push(tmp);
}
}
for(int i=1;i<=n;i++) ans=max(ans,f[i]);
cout<<ans<<endl;
}
signed main(){
IOS;TIE;
T=1;
while(T--) solve();
return 0;
}
\]
Codeforces Round #786 (Div. 3) 补题记录的更多相关文章
- Codeforces Round #615 (Div. 3) 补题记录
第一次搞CF,结果惨不忍睹...还是太菜了 A:要用到全部的钱,所以总数必须是3的倍数,而且初始状态下任意一人的钱数不能超过总数除以3,否则没法分了 (也就这个签到算是在我能力范围之内了....) # ...
- Codeforces Round #617 (Div. 3) 补题记录
1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需 ...
- Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring
D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Codeforces Round #585 (Div. 2) [补题]
前言 2019.9.16 昨天下午就看了看D题,没有写对,因为要补作业,快点下机了,这周争取把题补完. 2019.9.17 这篇文章或者其他文章难免有错别字不被察觉,请读者还是要根据意思来读,不要纠结 ...
- Codeforces Round #429 (Div. 2) 补题
A. Generous Kefa 题意:n个气球分给k个人,问每个人能否拿到的气球都不一样 解法:显然当某种气球的个数大于K的话,就GG了. #include <bits/stdc++.h> ...
- Codeforces Round #419 (Div. 1) 补题 CF 815 A-E
A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. ...
- Codeforces Round #590 (Div. 3)补题
要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ∅ √ 解 E 待定 F 传送门 第一 ...
- Codeforces Round #574 (Div. 2)补题
A. Drinks Choosing 统计每种酒有多少人偏爱他们. ki 为每种酒的偏爱人数. 输出ans = (n + 1)/2 > Σki / 2 ? (n + 1)/2 - Σki / ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
随机推荐
- 【java】IDEA-jar包导出与导入
导出步骤: 1.CTRL + SHIFT + ALT + S 2.选择:Artifacts ,点击"+",在添加页面中选择:JAR-From modules with depend ...
- 给ShardingSphere提了个PR,不知道是不是嫌弃我
说来惭愧,干了 10 来年程序员,还没有给开源做过任何贡献,以前只知道嘎嘎写,出了问题嘎嘎改,从来没想过提个 PR 去修复他,最近碰到个问题,发现挺简单的,就随手提了个 PR 过去. 问题 问题挺简单 ...
- django_day11_项目相关
django_day11_项目相关 新增和编辑 路由 url(r'^category_add/$', views.category_change, name='category_add'), url( ...
- KingbaseES V8R6C5单实例sys_backup.sh备份案例
案例说明: KingbaseES V8R6C5版本中使用了securecmdd工具,用于主机节点间的通讯,默认端口8890.备份工具sys_backup.sh默认使用了securecmdd工具,对 ...
- MySQL 不同隔离级别,都使用了什么锁?
大家好,我是树哥. 在上篇文章,我们聊了「MySQL 啥时候会用表锁,啥时候用行锁」这个问题.在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此外,还有朋友留言 ...
- 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档
背景 在计量领域中,计量检定是一种重要形式,主要用于评定计量器具的计量性能,确定其量值是否准确一致,实现手段包括计量检验.出具检定证书和加封盖印等. 在检定证书这一环节,存在一个难点,就是无法在线预览 ...
- logstash客户端传送symantec日志到elasticsearch
一.安装相应版本的logstash wget https://artifacts.elastic.co/downloads/beats/logstash/logstash-7.5.2-x86_64.r ...
- 深度剖析js闭包
一.什么是闭包? 方法里面返回一个方法 二.闭包存在的意义 延长变量的生命周期 作用域链 沟通内外部方法的桥梁 闭包会常驻内存 ==>慎用闭包 闭包里的变量不会被回收 创建私有环建 例 ...
- 互联网公司员工职级、研发效能度量、OKR与绩效考核
今天要写这篇文章,来自最近有两个点触动了我.第一个触动点是奈飞(netflix)做出了一个巨大动作<"不搞职级.人人平等" 25 年后行不通了?Netflix 破天荒引入细分 ...
- .NET WebAPI 自定义 NullableConverter 解决请求入参 “”空字符触发转换异常问题
最近在项目中启用了Nullable 可为空的类型,这个特性确实很好用,在 WebAPI 的入参上可以直接采用 ? 来标记一个字段是否允许为空,但是使用过程中遇到了如下一个问题,比如创建部门接口 我们定 ...