社区讨论
劣解求 hack
P14567【MX-S12-T2】区间参与者 10已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mifdaupu
- 此快照首次捕获于
- 2025/11/26 10:10 3 个月前
- 此快照最后确认于
- 2025/11/26 12:37 3 个月前
直接对 个区间进行计算(没有对包含其他区间的区间进行排除),时间复杂度 。
可以通过当前所有 hack。
CPP#include<bits/stdc++.h>
#define mid ((le+ri)>>1)
#define ls (u<<1)
#define rs ((u<<1)|1)
#define lp ls,le,mid
#define rp rs,mid+1,ri
using namespace std;
typedef long long ll;
const int N=1e6+10,M=1010,V=1000;
struct nd{
int l,r;
nd(){
l=0,r=1e6;
}
nd(int x,int y){
l=x,r=y;
}
};
struct sgt{
int mx[N<<2],t[N<<2];
void ch(int u,int k){
mx[u]+=k;
t[u]+=k;
}
void push_down(int u){
ch(ls,t[u]);
ch(rs,t[u]);
t[u]=0;
}
void push_up(int u){
mx[u]=max(mx[ls],mx[rs]);
}
void add(int u,int le,int ri,int x,int y,int k){
if(x<=le&&ri<=y){
ch(u,k);
return;
}
push_down(u);
if(x<=mid) add(lp,x,y,k);
if(y>mid) add(rp,x,y,k);
push_up(u);
}
int que_pos(int u,int le,int ri,int x,int y,int k){
if(le==ri){
if(mx[u]>=k) return le;
return -1;
}
push_down(u);
if(x<=mid&&mx[ls]>=k){
int w=que_pos(lp,x,y,k);
if(w!=-1) return w;
}
if(y>mid&&mx[rs]>=k){
int w=que_pos(rp,x,y,k);
if(w!=-1) return w;
}
return -1;
}
}t;
int n,a[N],b[N],c[N],s[N],cnt[N];
int l[N],r[N],d[M],tg[N];
vector<int> g[N];
vector<nd> h[N];
nd ge(int k,int x){
if(x==(int)g[k].size()){
return nd(g[k][x-1],n);
}
else if(x==0){
return nd(1,g[k][x]-1);
}
return nd(g[k][x-1],g[k][x]-1);
}
void app(vector<nd> &v,int tc){
for(nd tp:v){
// cerr<<tp.l<<" "<<tp.r<<" "<<tc<<"\n";
if(tp.l>tp.r) continue;
t.add(1,1,n,tp.l,tp.r,tc);
}
}
void rep(int k,int x){
app(h[k],-1);
// cerr<<k<<"\n";
if(x==0){
if((int)g[k].size()==0){
// cerr<<"*1\n";
h[k]={nd(1,n)};
}
else{
// cerr<<"*2\n";
h[k]={ge(k,0),ge(k,g[k].size())};
}
}
else{
// cerr<<"*3\n";
h[k]={ge(k,x)};
}
app(h[k],1);
}
signed main(){
// freopen("interval.in","r",stdin);
// freopen("interval.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
g[a[i]].push_back(i);
}
for(int i=1;i<=n;i++){
cin>>b[i];
s[i]=s[i-1]+b[i];
}
for(int i=1;i<=n;i++){
cin>>c[i];
d[c[i]]++;
}
for(int i=1;i<=n;i++){
rep(i,0);
}
for(int i=1;i<=n;i++){
l[i]=i;
r[i]=t.que_pos(1,1,n,i,n,n);
if(r[i]!=-1&&l[i]<=r[i]){
tg[i]=1;
}
cnt[a[i]]++;
rep(a[i],cnt[a[i]]);
}
ll ans=1e18;
for(int i=1;i<=n;i++){
if(!tg[i]) continue;
int pos=l[i];
int h=r[i];
// cerr<<i<<" "<<l[i]<<" "<<r[i]<<"\n";
ll res=0;
for(int j=1;j<=V;j++){
if(pos+d[j]-1<=h){
res+=1ll*j*(s[pos+d[j]-1]-s[pos-1]);
pos+=d[j];
}
else{
res+=1ll*j*(s[h]-s[pos-1]);
break;
}
if(res>=ans) break;
}
ans=min(ans,res);
}
cout<<ans<<"\n";
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...