好菜啊这次打的 都是思维题 不难的 自己打的好菜 菜的无话可说
https://codeforces.com/contest/1217

A.Creating a Character

就是让 exp 分给 str 和 in 保证str 严格大于in
这样的话 我们考虑把他们分屏的基础上算最多可以分几次
用 (exp + str和in 的差 + 1 )/ 2 算出分配状态
但是 这坑了 然后str 非常大 in 怎么也补补上 那样的话 ans = exp + 1;
所以先wa了

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 5;
typedef pair<int, int> P;
int n, m, k, p1, p2;
 
signed main() {
	cin >> p1;
	while(p1 --) {
		cin >> n >> m >> k;
		cout << max(min((n + k - m + 1)/2, k + 1), 0ll) << endl;
	}
	return 0;
}

B. Zmei Gorynich

小学数学题 砍到 (m - 这轮最大值)/ 实际能砍 + 1

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 5;
const long long INF = 0x3f3f3f3f3f3f3f3f;
typedef long long ll;
typedef pair<int, int> P;
int n, m, k, p1, p2, t;
 
const int p = 998244353;
 
signed main() {
	cin >> t;
	while(t --) {
		cin >> n >> m;
		int mad = -1, mid = -1;
		for(int i = 1; i <= n; i ++) {
			cin >> p1 >> p2;
			mid = max(mid, p1 - p2);
			mad = max(p1, mad);
		}
		if(mad >= m) cout << 1 << endl;
		else if(mid <= 0) cout << -1 << endl;
		else cout << (m - mad) / mid + ((m - mad) % mid != 0) + 1 << endl;
	}
	return 0;
}

C. The Number Of Good Substrings

唉 T23
考虑 01 串 我们暴力往后面找显然复杂度不对 我直接减了一个二进制数转10进制不大于5000 T了
何时01串二进制 == 长度 而且优化的比较好呢
我们还是枚举长度 因为最多 20位 我们设二进制现在值为tmp
当tmp < len还好说 但是大于 我们考虑用前导0去补 这样 复杂度就下来了

#include <bits/stdc++.h>
using namespace std;
 
int n, m, cas;
string s;
 
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> cas;
    while(cas --) {
        cin >> s;
        int len = s.size();
        int ans = 0, cnt = 0;
        for(int i = 0; i < len; ++ i) {
            if(s[i] == '0') cnt ++;
            else {
                int tmp = 1;
                for(int j = 1; j <= 20 && i + j - 1 < len; j ++) {
                    if(tmp <= cnt + j) ans ++;
                    tmp = tmp * 2 + (s[i + j] == '1');
                }
                cnt = 0;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

D. Coloring Edges

这题可能比上一道题还简单
很容易猜到 有环 就是2 无环 就是1
而且 我们只要把最后成环的边换成2就好了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;

int n, m, cas;
int head[maxn], cnt;
int to[maxn << 1], nxt[maxn << 1], val[maxn << 1];
int vis[maxn], ans[maxn];

void ade(int a, int b, int c) {
    to[++ cnt] = b, val[cnt] = c;
    nxt[cnt] = head[a], head[a] = cnt;
}
int f = 0;
void dfs(int u) { // 有向图 用 1 2 表达 现在链 和 之前链
    vis[u] = 1;
    for(int i = head[u]; i; i = nxt[i]) {
        int v = to[i], id = val[i];
        if(!vis[v]) dfs(v), ans[id] = 1;
        else if(vis[v] == 2) {
            ans[id] = 1;
        } else {
            ans[id] = 2;
            f = 1;
        }
    }
    vis[u] = 2;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n >> m;
    for(int i = 1, a, b; i <= m; ++ i) {
        cin >> a >> b;
        ade(a, b, i);
    }
    for(int i = 1; i <= n; i ++) {
        if(!vis[i]) dfs(i);
    }
    cout << (f ? 2 : 1) << endl;
    for(int i = 1; i <= m; ++ i) cout << ans[i] << " ";
    return 0;
}