Codeforces Round 898 (Div. 4)

56 阅读7分钟

在回南京的火车上,闲着无聊,再加上打了波周赛又是光速下班,于是决定补一补这两天训的题解。这个是前天打的div4div4。就不一一贴题目了,很烦。感觉我还是好菜,也没啥提升,很无语。。

传送门

Dashboard - Codeforces Round 898 (Div. 4) - Codeforces

思路

AA:直接根据样例,发现就样例那66种情况,也就是当bca,cabbca,cab时候,输出NONO,其余情况输出YESYES

BB:由于nn极小,就不用考虑数学方法,就是暴力枚举每一项,最后取个maxmax

CC:有语法题那味了,就把每个格子的赋分先初始化,我是用四个forfor循环,比较抽象,反正随便搞一搞就找出来,然后看哪里是XX就对应的分数。

DD:很显然,我们由贪心的想法,肯定是从BB开始覆盖最优,显然要找相邻两个BB之间的距离,如果<k<k,那么我们就不要多覆盖一次,否则一定要多覆盖一次,然后枚举一遍即可。

EE:二分的模板题,很裸,没啥好说的,就是要注意llrr要开始还是大一点好。

FF:双指针题++前缀和。我们要找的是最大长度,并不一定要数值最大,因此便枚举边更新,边界问题一直困扰我很久,下面找个时间做几十个双指针。

GG:贪心题,开始也没啥思路,但是在纸上尝试了一些样例之后,发现了一些性质,形如AAA......ABAAA......AB的最多可以贡献AA的个数的分数,且不会影响前面的得分。形如BCC...CCCBCC...CCC的也可以贡献CC的个数的得分,且不会影响后面的得分,但是形如AA...ABC...CCAA...ABC...CC,如果我们单独考虑这样一个字符串,我们就会发现,是会影响分数的,因为我们不可能加(numA+numCnum_A+num_C的分数),只能加max(numA,numC)max(num_A,num_C)的分数,但是这种情况其实对题目的影响不是特别大,因为我们想,综合整个字符串,影响得分的其实就是相邻两个BB或者是第一个BB之前和最后一个BB之后的序列,每一个BB必然需要匹配一段非BB的序列,那么假设字符串中有numBnum_B个B,会有多少段非BB的序列呢,答案是numB+1num_B+1numBnum_B段,当BB出现在开头或结尾的时候,就有numBnum_B段,否则会有numB+1num_B+1段,如果是numBnum_B段,那么我们最后答案就是所有非BB的字符个数,否则我们只要找出最小的一段非BB的序列字符个数减去即可。很有意思的一个贪心题。

HH:首先,我们要知道nn个点nn条边的树叫基环树,基环树中有一个环(一般的树是没有的),题目问AABB如果绝顶聪明,那么AA是否能追上BB。其实我们不妨考虑,如果是在一棵树上,如果没有环,那么显然最后是可以追上的,只有在环上的时候,由于BB知道AA的具体动向,所以无论如何都追不上,我们我们就要找到BB所在的位置距离离他最近的环上的点的距离distBdist_B,与AA距这个点的距离distAdist_A,如果distBdistAdist_B≥dist_A,那么就会被抓住,否则就不会。当然要特判一下如果他们起点一样,那么无论如何都会被抓住。所以我们分为两步走,第一步,找到距BB最近的环上的点tagtag,第二步分别求AABBtagtag点的最短路,第一步可以用无向图的拓扑排序找出(环上点的度都>2),第二部用dfsdfs或者是dijkstradijkstra,dfsdfs很显然更快,最后时间复杂度为O(n)O(n)

代码

AA

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
void solve(){
	string s;
	cin>>s;
	if(s!="bca" && s!="cab") cout<<"YES\n";
	else cout<<"NO\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

BB

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
int a[20];
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	ll res=0;
	for(int i=1;i<=n;i++){
		a[i]++;
		ll ans=1;
		for(int j=1;j<=n;j++){
			ans*=a[j];
		}
		a[i]--;
		res=max(res,ans);
	}
	cout<<res<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

CC

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
int v[20][20];
void solve(){
	ll ans=0;
	memset(v,0,sizeof v);
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(i==1 || i==10 || j==1 || j==10) v[i][j]=1;
		}
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){	
			if(i==2 || i==9 || j==2 || j==9){
				if(v[i][j]==0) v[i][j]=2;
			}
		}
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(i==3 || i==8 || j==3 || j==8){
				if(v[i][j]==0) v[i][j]=3;
			}
		}
	}	
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(i==4 || i==7 || j==4 || j==7){
				if(v[i][j]==0) v[i][j]=4;
			}
		}
	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(i==5 || i==6 || j==5 || j==6 ){
				if(v[i][j]==0) v[i][j]=5;
			}
		}
	}
//	for(int i=1;i<=10;i++){
//		for(int j=1;j<=10;j++){
//			cout<<v[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			char c;
			cin>>c;
			if(c=='X'){
				ans+=v[i][j];
			}
		}
	}
	cout<<ans<<"\n"; 
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

DD

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
vector<int> v;
void solve(){
	string s;
	int n,k;
	cin>>n>>k;
	cin>>s;
	int last=-1;
	int ans=0;
	for(int i=0;i<s.size();i++){
		if(s[i]=='B'){
			if(last==-1){
				ans++;
				last=i;
			}
			else if(i-last<k){
				continue;
			}
			else{
				ans++;
				last=i; 
			}
			
		}
	} 
	cout<<ans<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

EE

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
vector<int> v;
const int N=2e5+10;
int a[N];
ll x;
int n;
bool check(int m){
	int ll res=0;
	for(int i=1;i<=n;i++){
		res+=max(0,m-a[i]);
	}
	return res<=x;
}
void solve(){
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	ll l=1,r=2e9+2;
	while(l<r){
		ll mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

FF

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
vector<int> v;
const int N=2e5+10;
int a[N],h[N],k;
int dp[N];
int n;
bool check(int m){
	
}
void solve(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]+=a[i-1];
	}
	for(int i=1;i<=n;i++) cin>>h[i];
	int l=1;
	int ans=0;
	for(int r=1;r<=n;){
		if(h[r-1]%h[r]) l=r;
		while(a[r]-a[l-1]>k) l++;
		ans=max(ans,r-l+1); 
		r++;
	}
	cout<<ans<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

GG

#include <bits/stdc++.h>
#define x first
#define y second
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define lowbit(x) x&(-x)
using namespace std;
int t; 
vector<int> v;
const int N=2e5+10;
int a[N],h[N],k;
int dp[N];
void solve(){
	string s;
	cin>>s;
	int ans=0;
	for(int i=0;i<s.size();i++){
		if(s[i]=='A') ans++;
	}
	if(s[0]=='B' || s[s.size()-1]=='B'){
		cout<<ans<<"\n";
	} 
	else{
		int minn=0x3f3f3f3f;
		int jian=0;
		for(int i=0;i<s.size();i++){
			if(s[i]=='A') jian++;
			else{
				minn=min(minn,jian);
				jian=0;
			}
		}
		minn=min(minn,jian);
		//cout<<jian<<"\n";
		cout<<ans-minn<<"\n";
	}
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

HH

#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
    ll res=1;
    while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}
    return res;
}
const int N=400010;
int d[N/2];
int idx=0,e[N],ne[N],h[N],vist[N];
inline void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool st[N/2];
int t;
int n,stt,ed,dists=0x3f3f3f3f,diste=0x3f3f3f3f;
int tag;
void tp(int u){
	st[u]=true;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(st[j] || d[j]==0) continue;
		d[j]--,d[u]--;
		if(u==tag) tag=j;
		if(d[j]!=1) continue;
		tp(j);
	}
	st[u]=false;
}
void dfs(int u,int d){
	vist[u]=true;
	if(u==stt) dists=min(dists,d);
	if(u==ed) diste=min(diste,d);
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(vist[j]) continue;
		dfs(j,d+1);
	}
	vist[u]=false;
}
void solve(){
	cin>>n>>stt>>ed;
	tag=ed;
	idx=0;
	dists=diste=0x3f3f3f3f;
	//memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++){
		d[i]=0;
		h[i]=-1;
		st[i]=false;
		vist[i]=false;
	}
	for(int i=1;i<=n;i++){
		int a,b;
		cin>>a>>b;
		add(a,b),add(b,a);
		d[a]++,d[b]++;
	}
	for(int i=1;i<=n;i++){
		if(d[i]==1) tp(i);
	}
	//cout<<tag<<"\n";
	if(stt==ed){
		cout<<"NO\n";
		return;
	}
	if(d[ed]>=2){
		cout<<"YES\n";
		return;
	}
	dfs(tag,0);
	if(dists>diste) cout<<"YES\n";
	else cout<<"NO\n";
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--) solve(); 
    
    return 0;
}

最后阿巴阿巴,好希望能变强啊!