codeforce educational div2 A-D

A.Passing the Ball

思路:看到一旦出现L就不能往后了,所以遍历一下即可
代码如下

#include <bits/stdc++.h>

using namespace std;

void solve()
{
	int n;cin >> n;
	string s;cin >> s;
	int cnt = 0;
	for(int i = 0;i < s.size(); i ++)
	{
		cnt ++;
		if(s[i] == 'L') break;	
	}	
	cout << cnt << '\n';
} 
int main()
{
	int t;cin >> t;
	while(t -- )solve();
	return 0;
}

B. Right Maximum

题目大意:给出一个序列,给出操作要求不断删除最大值后面的所有数(包括最大值本身),看一下删到空为止要多少次操作
题目思路:倒着遍历一遍,用mutliset模拟即可(遇到最大值就res ++ )
代码如下

#include <bits/stdc++.h>

using namespace std;

void solve()
{
	int n;cin >> n;
	vector<int>a(n);
	multiset<int,greater<int>>s;
	for(int i = 0 ;i < n ;i ++)
	{ 
		cin >> a[i];
		s.insert(a[i]);
	}
	int res = 0;
	for(int i = n- 1 ;i >= 0 ;i --)
	{
		if(*s.begin() == a[i]) res ++;
		s.erase(s.find(a[i]));
	}
	cout << res << '\n';
	
}
int main()
{
	int t;cin >> t;
	while(t -- )solve();
	return 0;
}

C. Spring

思路:最大公倍数 + 容斥原理

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll gcd(ll a, ll b) {return (b ? gcd(b, a % b) : a);}
void solve()
{
	ll a, b, c , m;cin >> a>> b >> c >> m;
	ll t1 = (m / a) * 6, t2 = (m / b) * 6, t3 = (m / c) * 6;
	ll lab = a * b / gcd(a, b), lac = a * c / gcd(a, c), lbc = b * c /gcd(b, c);
	ll labc = (lab* c)/gcd(lab, c);//算三者最小公倍数 
//	cout << "TEST : " << lab<< " " << lac<< " " << labc << '\n'; 
	t1 -= (m / lab + m / lac - 2 * (m / labc)) * 3 + (m / labc) * 4;
	t2 -= (m / lbc + m / lab - 2 * (m / labc)) * 3 + (m / labc) * 4;
	t3 -= (m / lbc + m / lac - 2 * (m / labc)) * 3 + (m / labc) * 4;
	cout << t1 << " " << t2 << " " << t3 << '\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int t;cin >> t;
	while(t -- )solve();
	return 0;
}

D. Alternating Path

思路:发现这个图如果符合alternating这个性质(不符合性质的情况就是从v开始走到了某条边因为环的存在导致这条边要即是指向v又是指出v的,不难观察到是奇数环会导致这种情况(也就只有奇数环会导致),那么不存在奇数环的无自环无重边的图就是二分图)。
那么就会存在且只存在两种情况我们只要看一下这两种情况下的集合大小取大的加到我们的答案里即可
而我们找判断和找二分图一般是用bfs或者dfs去遍历染色的(即为染色法)
以下是代码
1.bfs版本

#include <bits/stdc++.h>
#define ll long long
using namespace std; 
const int N = 3e5 + 10;
int q[N], tt = -1, hh = 0; 
void bfs(vector<vector<int>>&g,vector<int>&r, int x,int& col)//染色法判断二分图
{
	tt = -1, hh = 0;
	q[++ tt ] = x;
	r[x] = 0;//0 - black, 1 - red
	int black = 1, red = 0;
	bool flag = true;
	while(tt >= hh)
	{
		int t = q[hh ++];
 		// cout << "TEST : " << x << " " << t << endl;
		for(int i = 0; i < g[t].size() ; i ++)
		{
			int v = g[t][i];
			// if(x == 5)
			// {
				// cout << "TEST : " << r[t] << " " << r[v] << endl;
			// }
			if(r[v] == -1)
			{
				r[v] = r[t]^1;
				if(r[v] == 0) black ++;
				else red ++;
				q[++ tt] = v;
			}
			else if(r[v] != r[t]^1) flag = false;
		}		
	}
	// cout << "TEST : " << x <<" " <<  flag << " " << red << " " << black << endl;
	if(flag) col = max(red, black);
	else col = -1;//图不是二分图
}
void solve()
{
	int n, m;cin >> n >> m;
	if(!m)
	{
		cout << n << '\n';
		return;	
	} 
	vector<vector<int>>g(n + 1);
	vector<int>r(n + 1, -1);
	
	for(int i = 0 ;i < m ;i ++)
	{
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	} 
	int res = 0;
	for(int i =1 ;i <= n ;i ++)
	{
		if(r[i] == -1)
		{
			int col = 0;
			bfs(g ,r,i , col);
			if(col != -1) res += col;
		}
	}
	
//	for(int i = 1 ;i <= n ;i ++) cout << r[i] << " \n"[i == n]; 
	
	
	cout << res << '\n'; 
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int t;cin >> t;
	while(t -- )solve();
	return 0;
}
// self-loops or multiple edges.自环和重边 
//arbitrarily
//vertex

2dfs版本

#include <bits/stdc++.h>
#define ll long long
using namespace std; 
bool dfs(vector<vector<int>>&g,vector<int>&r,vector<int>&cnt, int x, int col)//染色法判断二分图
{
	bool flag = true; 
	for(int i = 0 ;i < g[x].size(); i ++)
	{
		int v = g[x][i];
		if(r[v]== -1)
		{
			r[v] = r[x]^1;
			cnt[r[v]] ++;
			if(!dfs(g, r, cnt, v, r[v])) flag = false;
		}
		else if(col^1 != r[v])flag = false;
	}
	return flag;
}
void solve()
{
	int n, m;cin >> n >> m;
	if(!m)
	{
		cout << n << '\n';
		return;	
	} 
	vector<vector<int>>g(n + 1);
	vector<int>r(n + 1, -1);
	
	for(int i = 0 ;i < m ;i ++)
	{
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	} 
	int res = 0;
	for(int i =1 ;i <= n ;i ++)
	{
		if(r[i] == -1)
		{
			vector<int>cnt(2, 0);
			r[i] = 0;
			cnt[0] = 1;
			if(dfs(g ,r ,cnt, i, 0)) res += max(cnt[0], cnt[1]);
		}
	}	
	cout << res << '\n'; 
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int t;cin >> t;
	while(t -- )solve();
	return 0;
}
// self-loops or multiple edges.自环和重边 
//arbitrarily
//vertex
posted @ 2026-03-28 14:52  Mikan_QWQ  阅读(2)  评论(0)    收藏  举报