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】学习路径40-Buffer缓冲区输入流
			@Testpublic void testBufferInputStream(){ BufferedInputStream bfis = null; try { bfis = new Buffered ... 
- django_day06
			django_day06 内容回顾 事务 try: with transaction.atomic(): #事务 #一系列的操作 pass except Exception as e: print(e ... 
- GB/T 28181联网系统通信协议结构和技术实现
			技术回顾 在本文开头,我们先一起回顾下GB/T28181联网系统通信协议结构: 联网系统在进行视音频传输及控制时应建立两个传输通道:会话通道和媒体流通道. 会话通道用于在设备之间建立会话并传输系统控制 ... 
- KingbaseES 数据库连接断开问题排查思路
			用户在使用数据库过程中,经常会发现如果会话空闲一段时间,会话有可能断开,需要重连.这个问题影响因素很多,包括数据库参数设置.操作系统参数.防火墙等.以下介绍KingbaseES针对该问题的排查思路. ... 
- 【读书笔记】C#高级编程 第二十章 诊断
			(一)诊断概述 名称空间System.Diagnostics提供了用于跟踪.事件日志.性能测量以及代码协定的类.System.Diagnostics.Contracts名称空间中的类可以定义前提条件. ... 
- 【ACG】博主在专栏更新内容后,及时通知关注他的用户去阅读
			 业务场景 当用户打开应用时,系统发送Push消息给用户,向用户推荐博主信息.用户关注博主后,将保存用户的订阅信息,当关注的博主更新内容时,向订阅的用户发送短信,提醒用户及时查看最新内容.从而持续增 ... 
- 运维利器-ClusterShell
			前言 和ansible类似,但是更加高效 安装 yum install -y clustershell clush命令: clush -a 全部 等于 clush -g all clush -g 指定 ... 
- Mysql 安全加固经验总结
			本文为博主原创,转载请注明出处: 目录 1.内网部署Mysql 2. 使用独立用户运行msyql 3.为不同业务创建不同的用户,并设置不同的密钥 4.指定mysql可访问用户ip和权限 5. 防sql ... 
- NLP新手入门指南|北大-TANGENT
			开源的学习资源:<NLP 新手入门指南>,项目作者为北京大学 TANGENT 实验室成员. 该指南主要提供了 NLP 学习入门引导.常见任务的开发实现.各大技术教程与文献的相关推荐等内容, ... 
- 【疑难杂症】if __name__ == '__main__'的理解
			今天进行小批量梯度下降时,代码给我报错,具体代码如下 import torch import numpy as np from torch.utils.data import Dataset from ... 
