社区讨论
奇妙做法求hack
P14567【MX-S12-T2】区间参与者 2已保存回复 19
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 18 条
- 当前快照
- 1 份
- 快照标识符
- @mih52dve
- 此快照首次捕获于
- 2025/11/27 15:55 3 个月前
- 此快照最后确认于
- 2025/11/28 19:31 3 个月前
如何hack如下做法:
CPP#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
#define eb emplace_back
#define pii pair<int, int>
#define double long double
#define viclear(x) vector<int>().swap(x)
#define mse(x, y) memset(x, y, sizeof x)
#define mcp(x, y) memcpy(x, y, sizeof x)
#define rep(x, l, r) for (int x = l; x <= r; x++)
#define drep(x, r, l) for (int x = r; x >= l; x--)
#define FASTIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
const int MAXN = 1e6 + 5, inf = 0x0101010101010101;
int n, c[MAXN], v[MAXN], f[MAXN], ans = inf, C[MAXN], wha[MAXN], vis[MAXN], cnt;
struct node{ int l, r, col; } E[MAXN];
bool cmp(node x, node y){ return (x.r - x.l + 1 < y.r - y.l + 1 && x.l != inf); }
void Get(int id){
vis[id] = cnt;
int l = E[id].l, r = E[id].r;
queue<int> vec;
rep(i, l, r){
if(vis[c[i]] && vis[c[i]] != cnt) return ;
vec.push(i);
}
while(vec.size()){
int u = vec.front(); vec.pop();
if(vis[c[u]] == cnt) continue;
if(vis[c[u]]) return ;
if(E[c[u]].l < l || E[c[u]].r > r) vis[c[u]] = cnt;
drep(i, l - 1, E[c[u]].l){
if(vis[c[i]] && vis[c[i]] != cnt) return ;
vec.push(i);
}
rep(i, r + 1, E[c[u]].r){
if(vis[c[i]] && vis[c[i]] != cnt) return ;
vec.push(i);
}
l = min(l, E[c[u]].l), r = max(r, E[c[u]].r);
}
int Sum = 0;
rep(i, l, r) Sum += v[i] * f[i - l + 1];
ans = min(ans, Sum);
}
signed main(){
FASTIO;
cin >> n;
rep(i, 1, n) cin >> c[i];
rep(i, 1, n) cin >> v[i];
rep(i, 1, n) cin >> f[i];
rep(i, 1, n){
if(!E[c[i]].l) E[c[i]].l = i, E[c[i]].col = c[i];
E[c[i]].r = max(E[c[i]].r, i);
}
rep(i, 1, n) if(!E[i].l) E[i].l = E[i].r = inf;
sort(E + 1, E + n + 1, cmp);
rep(i, 1, n) wha[E[i].col] = i;
rep(i, 1, n) c[i] = wha[c[i]];
rep(i, 1, n) if(E[i].l != inf) ++cnt, Get(i);
cout << ans;
return 0;
}
回复
共 19 条回复,欢迎继续交流。
正在加载回复...