2022ICPC沈阳 - C D F L

The 2022 ICPC Asia Shenyang Regional Contest

C 暴力
D 签到
F 思维
L 搜索

C. Clamped Sequence

注意到数据范围 \(2 \le n \le 5000\),故可以枚举每个数作为选定区间的下界和上界,\(O(n^2 )\) 遍历结果取大即可

ll n, d, a[N], b[N], ans;

void calc(ll l, ll r){
	ll sum = 0;
	for(int i = 0; i < n; ++ i){
		if(a[i] > r) b[i] = r;
		else if(a[i] < l) b[i] = l;
		else b[i] = a[i];
		if(i) sum += abs(b[i] - b[i - 1]);
	}
	ans = max(ans, sum);
	return ;
}

void solve(){
	cin >> n >> d;
	for(int i = 0; i < n; ++ i) cin >> a[i];
	for(int i = 0; i < n; ++ i){
		calc(a[i] - d, a[i]);
		calc(a[i], a[i] + d);
	}
	cout << ans << '\n';
	return ;
}

D. DRX vs. T1

统计哪个字母出现了3次即可

void solve(){
	string ss;
	cin >> ss;
	int d = 0, t = 0;
	for(auto ch : ss){
		if(ch == 'D') ++ d;
		else if(ch == 'T') ++ t;
	}
	if(d == 3) cout << "DRX\n";
	else cout << "T1\n";
	return ;
}

F. Half Mixed

易得子矩阵总共的个数为 \(tot = \frac{n \times (n + 1)}{2} \times \frac{m \times (m + 1)}{2}\)

那么仅当 tot 为偶数时有解
假设 \(\frac{m \times (m + 1)}{2}\) 为偶数,那么我们只需要找到一组 \(l_i\),满足:

  • \(\sum l_i = m\)
  • \(\sum \frac{l_i \times (l_i + 1)}{2} = \frac{m \times (m + 1)}{4}\)

利用这一组 \(l_i\) 间隔放置01形成一行,再用该行放置所有行即可
可以贪心的找 \(l_i\),一定存在解
此题代码不放了,个人还做不出来
VP代码传送门

L. Tavern Chess

注意在题目所给的限制条件下,每一轮进攻必定死一个随从
又数据范围 \(1 \le n, m \le 7\),所以利用 dfs 遍历所有情况即可

double alice = 0, atie = 0, bob = 0;

void dfs(vector<pii> & a, vector<pii> & b, int x, int y, int t, double p){
	if(a.empty() && b.empty()){ atie += p; return ; }
	if(a.empty()) { bob += p; return ; }
	if(b.empty()) { alice += p; return ; }
	x %= a.size();
	y %= b.size();
	if(t == 0){
		for(int i = 0; i < b.size(); ++ i){
			vector<pii> na = a, nb = b;
			int nx = x, ny = y;
			na[x].second -= nb[i].first;
			nb[i].second -= na[x].first;
			if(na[x].second <= 0) na.erase(na.begin() + x);
			else ++ nx;
			if(nb[i].second <= 0){
				nb.erase(nb.begin() + i);
				if(i < y) -- ny;
			}
			dfs(na, nb, nx, ny, 1 - t, p / b.size());
		}
	}else{
		for(int i = 0; i < a.size(); ++ i){
			vector<pii> na = a, nb = b;
			int nx = x, ny = y;
			na[i].second -= nb[y].first;
			nb[y].second -= na[i].first;
			if(na[i].second <= 0){
				na.erase(na.begin() + i);
				if(i < x) -- nx;
			}
			if(nb[y].second <= 0) nb.erase(nb.begin() + y);
			else ++ ny;
			dfs(na, nb, nx, ny, 1 - t, p / a.size());
		}
	}
	return ;
}

void solve(){
	int n, m;
	cin >> n >> m;
	vector<pii> a(n), b(m);// {atk, hp}
	for(int i = 0; i < n; ++ i){
		int x;
		cin >> x;
		a[i] = {x, x};
	}
	for(int i = 0; i < m; ++ i){
		int x;
		cin >> x;
		b[i] = {x, x};
	}
	if(n > m)
		dfs(a, b, 0, 0, 0, 1.0);
	else if(n < m)
		dfs(a, b, 0, 0, 1, 1.0);
	else{
		dfs(a, b, 0, 0, 0, 0.5);
		dfs(a, b, 0, 0, 1, 0.5);
	}
	cout << fixed << setprecision(10)
		<< alice << '\n'
		<< bob << '\n'
		<< atie << '\n';
	return ;
}
posted on 2023-11-12 14:30  Qiansui  阅读(40)  评论(0编辑  收藏  举报