Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)

A

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define mst(Arr, x)	memset(Arr, x, sizeof(Arr));
#define pb push_back
#define mk make_pair
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int n;
int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b){
	return a / gcd(a, b) * b;
}

int main(){
	LL a, b;
	scanf("%lld%lld", &a, &b);
	if(a >= b){
		printf("1\n");
		return 0;
	}
	for(int i = 2; ; ++i){
		a = a * 3LL;
		b = b * 2LL;
		if(a > b){
			printf("%d\n", i);
			return 0;
		}
	}
	return 0;
}

B

對於每一個連通塊,都要求是一個完全字圖

也就是每一個節點的度數都等於這個連通塊頂點的個數 -  1

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define mst(Arr, x)	memset(Arr, x, sizeof(Arr));
#define pb push_back
#define mk make_pair
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 3e5 + 10;
const int INF = 1e9 + 10;
int n, m;
int deg[qq];
int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b){
	return a / gcd(a, b) * b;
}
int fa[qq];
int Find(int x){
	return fa[x] == -1 ? x : fa[x] = Find(fa[x]);
}
queue<int> Q[qq];
int main(){
	mst(fa, -1);
	mst(deg, 0);
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; ++i){
		int a, b;
		scanf("%d%d", &a, &b);
		deg[a]++, deg[b]++;
		int x = Find(a), y = Find(b);
		if(x != y)	fa[y] = x;
	}
	for(int i = 1; i <= n; ++i){
		Q[Find(i)].push(i);
	}
	bool flag = true;
	for(int i = 1; i <= n; ++i){
		if(Q[i].size() == 0)	continue;
		int k = Q[i].size() - 1;
		Q[i].pop();
		while(!Q[i].empty()){
			int v = Q[i].front();
			Q[i].pop();
			if(k != deg[v])	flag = false;
		}
	}
	if(flag)	printf("YES\n");
	else	printf("NO\n");
	return 0;
}

C

對於每一個假設第i個區間是NO, 假設這個區間的最右端是r, 讓str[r] = str[r - k + 1] 相等即可, 它不影響其他的連續區間

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cctype>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>

using namespace std;
#define LL long long
#define mst(Arr, x)	memset(Arr, x, sizeof(Arr));
#define pb push_back
#define mk make_pair
#define REP(i, x, n)	for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int n, k;
int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b){
	return a / gcd(a, b) * b;
}
string str[105];
string name[105];
int num[105];
string f;
map<string, bool> mp;
int main(){
	for(int i = 1; i <= 26; ++i)
		name[i] = 'A' + (i - 1);
	for(int i = 27; i <= 26*2; ++i){
		name[i] = name[i - 26] + "c";
	}
	cin >> n >> k;
	int p = 1;
	for(int i = 1; i < k; ++i)
		str[i] = name[p++];
	for(int i = k; i <= n; ++i){
		cin >> f;
		if(f == "YES"){
			str[i] = name[p++];
		}else{
			str[i] = str[i - k + 1];
		}
	}
	for(int i = 1; i <= n; ++i){
		if(str[i] == "")	str[i] = name[p++];
	}
	for(int i = 1; i <= n; ++i)
		cout << str[i] << " ";
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值