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 ;
}