随笔 - 164  文章 - 0  评论 - 4  阅读 - 9917

2022ICPC沈阳 - C D F L

The 2022 ICPC Asia Shenyang Regional Contest

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

C. Clamped Sequence

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

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=n×(n+1)2×m×(m+1)2

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

  • li=m
  • li×(li+1)2=m×(m+1)4

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

L. Tavern Chess

注意在题目所给的限制条件下,每一轮进攻必定死一个随从
又数据范围 1n,m7,所以利用 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   Qiansui  阅读(190)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示