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】学习路线8-cmd带命令编译包
/*java类包(package)package XX.XX.XX; 包名命名规则:(以域名开头,都是小写) com.remooo.xx 编译:javac -d . ...
- Python入门系列(一)安装环境
python是什么 python是一门很受欢迎的语言,除了不能生孩子以外,其它都可以做. 它擅长的领域是脚本工具和科学数据这一块,比如大数据,数据分析什么的. python安装 为了演示和验证教程可用 ...
- 报错:selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing 'name'
代码运行到这:driver.add_cookie(cookies),报错了 相信坑了不少人,接下来是解决办法 driver.add_cookie(cookies) cookies = { " ...
- 【读书笔记】C#高级编程 第二十二章 安全性
(一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...
- 基于 PyTorch 和神经网络给 GirlFriend 制作漫画风头像
摘要:本文中我们介绍的 AnimeGAN 就是 GitHub 上一款爆火的二次元漫画风格迁移工具,可以实现快速的动画风格迁移. 本文分享自华为云社区<AnimeGANv2 照片动漫化:如何基于 ...
- Java中关键的知识点
JVM,运行是内存模型 Java 反射 Java 注解 函数式接口 lambda表达式/流式计算 动态代理
- SQL注入篇——sqli-labs各关卡方法介绍
主要是记下来了每关通过可以采用的注入方式,可能部分关卡的通关方式写的不全面,欢迎指出,具体的获取数据库信息请手动操作一下. 环境初始界面如下: sql注入流程语句: order by 3--+ #判断 ...
- @EqualsAndHashCode(callSuper = false) 解释
当我们的pojo使用@Data注解时,@Data默认包含的是:@EqualsAndHashCode(callSuper = false),但是我们的pojo有继承父类,我们可能需要重新定义这个注解为: ...
- Beats:最佳实践
转载自: https://blog.csdn.net/UbuntuTouch/article/details/105933699
- 深入探究 K8S ConfigMap 和 Secret
ConfigMap 1.什么是 ConfigMap? ConfigMap 是用来存储配置文件的 Kubernetes 资源对象,配置对象存储在 Etcd 中,配置的形式可以是完整的配置文件.key/v ...