分块骗分代码10pts求调
查看原帖
分块骗分代码10pts求调
1662988
_zfz_楼主2025/6/16 22:22

#1、#3~#8WA

#2、#9TLE

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+5;
const int maxl=3e2+5;
int a[maxn],b[maxn],sd[maxn],l[maxl],r[maxl],s,n,m;
inline int read(){
	int x=0,f=1;
    char ch=getchar();
	while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
	while(ch>='0'&&ch<='9'){
        x=x*10+ch-48;
        ch=getchar();
    }
	return x*f;
}
void write(int k,char ch=0){
	if(k<0){
		k=-k;
		putchar('-');
	}
	if(k>=10)
		write(k/10,0);
	putchar(k%10+'0');
	if(ch) putchar(ch);
}
void init(){
    s=sqrt(n);
    for(int i=1;i<=s;i++){
        l[i]=r[i-1]+1;
        r[i]=i*s;
    }
    r[s]=n;
    for(int i=1;i<=s;i++)
        for(int j=l[i];j<=r[i];j++)
            b[j]=i;
}
pair<int,bool> get_k(int x,int y,int k){
    int ks=b[x],kd=b[y];
    bool flag=false;
    if(ks==kd){
        int j=1;
        for(int i=x;i<=y;i++)
            if(a[i]<k) j++;
            else if(a[i]==k) flag=true;
        return {j,flag};
    }
    int j=1;
    for(int i=x;i<=r[ks];i++)
        if(a[i]<k) j++;
        else if(a[i]==k) flag=true;
    for(int i=l[kd];i<=y;i++)
        if(a[i]<k) j++;
        else if(a[i]==k) flag=true;
    for(int i=ks+1;i<kd;i++){
        int t=(lower_bound(sd+l[i],sd+r[i]+1,k)-sd)-l[i]-1;
        if(t>0) j+=t;
        else if(sd[t+1]==k) flag=true;
    }
    return {j,flag};
}
int get_pre(int x,int y,int k){
    int ks=b[x],kd=b[y];
    if(ks==kd){
        int j=-2147483647;
        for(int i=x;i<=y;i++)
            if(a[i]<k) j=max(j,a[i]);
        return j;
    }
    int j=-2147483647;
    for(int i=x;i<=r[ks];i++)
        if(a[i]<k) j=max(j,a[i]);
    for(int i=l[kd];i<=y;i++)
        if(a[i]<k) j=max(j,a[i]);
    for(int i=ks+1;i<kd;i++){
        int t=lower_bound(sd+l[i],sd+r[i]+1,k)-sd;
        if(t>l[i]) j=max(j,sd[t-1]);
    }
    return j;
}
int get_nxt(int x,int y,int k){
    int ks=b[x],kd=b[y];
    if(ks==kd){
        int j=2147483647;
        for(int i=x;i<=y;i++)
            if(a[i]>k) j=min(j,a[i]);
        return j;
    }
    int j=2147483647;
    for(int i=x;i<=r[ks];i++)
        if(a[i]>k) j=min(j,a[i]);
    for(int i=l[kd];i<=y;i++)
        if(a[i]>k) j=min(j,a[i]);
    for(int i=ks+1;i<kd;i++){
        int t=upper_bound(sd+l[i],sd+r[i]+1,k)-sd;
        if(t<=r[i]) j=min(j,sd[t]);
    }
    return j;
}
int get_kth(int x,int y,int k){
    int l1=0,r1=1e8,ans,mid;
    // for(int i=x;i<=::r[b[x]];i++)
    //     l=min(l,a[i]),r=max(r,a[i]);
    // for(int i=::l[b[y]];i<=y;i++)
    //     l=min(l,a[i]),r=max(r,a[i]);
    // for(int i=b[x]+1;i<b[y];i++)
    //     l=min(sd[::l[i]],l),r=max(sd[::r[i]],r);
    while(l1<=r1){
        mid=(l1+r1)>>1;
        int ch=get_k(x,y,mid).first;
        if(ch>=k){
            r1=mid-1;
            ans=mid;
        }else{
            l1=mid+1;
        }
    }
    // cout<<ans<<endl;
    bool flg=get_k(x,y,ans).second;
    if(!flg){
        int f=get_pre(x,y,ans);
        int g=get_nxt(x,y,ans);
        if(get_k(x,y,g).first>k){
            return f;
        }else{
            return g;
        }
    }
    return ans;
}
void update(int id,int k){
    int kk=b[id];
    for(int i=l[kk];i<=r[kk];i++){
        if(i==id) a[i]=k;
        sd[i]=a[i];
    }
    sort(sd+l[kk],sd+r[kk]+1);
}
int main(){
    n=read();
    m=read();
    init();
    for(int i=1;i<=n;i++)
        sd[i]=a[i]=read();
    for(int i=1;i<=s;i++)
        sort(sd+l[i],sd+r[i]+1);
    while(m--){
        int opt;
        cin>>opt;
        if(opt==1){
            int l,r,k;
            cin>>l>>r>>k;
            write(get_k(l,r,k).first,'\n');
        }else if(opt==2){
            int l,r,k;
            cin>>l>>r>>k;
            write(get_kth(l,r,k),'\n');
        }else if(opt==3){
            int pos,k;
            cin>>pos>>k;
            update(pos,k);
        }else if(opt==4){
            int l,r,k;
            cin>>l>>r>>k;
            write(get_pre(l,r,k),'\n');
        }else{
            int l,r,k;
            cin>>l>>r>>k;
            write(get_nxt(l,r,k),'\n');
        }
    }
    return 0;
}
2025/6/16 22:22
加载中...