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】学习路线1-类型转换、隐式转换、强制转换
/**文档注释,这里是一段文章一般放在类的外面*/public class HelloWorld{ //这个是注释的文本 public static void main(String[] ...
- 说说 JSON 格式的弊端与解决方法
JSON 格式是目前最流行的数据交互格式,广泛应用于前后端分离的系统.但也有一些场合不适合使用 JSON 格式. 1 JSON 格式弊端 有这样的一个需求:希望把客户端的日志上传到服务器存储起来.原先 ...
- Python入门系列(十)一篇学会python文件处理
文件处理 在Python中处理文件的关键函数是open()函数.有四种不同的方法(模式)来打开一个文件 "r" - 读取 - 默认值.打开一个文件进行读取,如果文件不存在则出错. ...
- 如何修改SAO用户密码
KingbaseES SAO 用户是专门用于审计管理的用户,用户配置审计策略需要使用该用户.在initdb 完成后,SAO 用户的默认密码保存在参数 sysaudit.audit_table_pas ...
- LSB隐写术
此为北京理工大学某专业某学期某课程的某次作业 一.项目背景 1.隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容. 2.L ...
- Jenkins+Gitlab实现持续集成持续部署
一.GITLAB安装与使用 官网:https://about.gitlab.com/ 1.GITLAB安装要求 (1)中文文档地址 https://docs.gitlab.cn/jh/instal ...
- 02 uniapp/微信小程序 项目day02
一.分类 1.1 页面布局 首先创建cate的分支 定义基本结构,因为是两个需要滚动的区域,所以这里要用到组件 scroll 这个组件如果是y scroll那就要固定高度,x scroll那就要固定宽 ...
- Kubernetes 日志:日志收集架构
应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的.而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中.对于容器化应用 ...
- frpc穿透报错 日志显示 http: proxy error: no such domain 解决办法
问题出在客户端的设置上,比如你的frps服务器IP为114.114.114.114,设置的vhost_http_port端口为 8080,在客户端设置的是域名fk.abc.com 指向frps所在服务 ...
- MySQL集群搭建(1)-主备搭建
数据库在任何业务中都是最重要的环节之一,这就对数据库架构提出的较高的要求.单点数据库永远不应该出现在生产环境,我们已经目睹过太多由于单点.备份缺失造成的损失,所以,搭建高可用 MySQL 集群是非常有 ...