关于CE
  • 板块学术版
  • 楼主Iwara
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/24 09:26
  • 上次更新2024/7/24 09:30:18
查看原帖
关于CE
252549
Iwara楼主2024/7/24 09:26

RT

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5;
ll n,m;
ll a[MAXN];
ll op,x,y,z,blen;
struct block{
	ll b_l,b_r,lazy_add;
}b[MAXN];
ll b_id[MAXN];
ll cnt;
struct node{
	ll num,id;
}t[MAXN];
bool cmp_num(node n1,node n2){
	return n1.num<n2.num;
}
bool cmp_id(node n1,node n2){
	return n1.id<n2.id;
}
ll count(ll L,ll R,ll X){
    return (ll)(upper_bound(a+L,a+R+1,X)-a-1);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>t[i].num;
		t[i].id=i;
	}
	blen=sqrt(n);
	for(int i=1;i<=n;i+=blen)b[++cnt]=(block){i,min(i+blen-1,n),0};
	for(int i=1;i<=cnt;i++)for(int j=b[i].b_l;j<=b[i].b_r;j++)b_id[j]=i;
	for(int i=1;i<=cnt;i++)sort(a+b[i].b_l,a+b[i].b_r+1,cmp_num);
    for(int i=1;i<=m;i++){
        cin>>op>>x>>y>>z;
        if(op==2){
            if(b_id[x]==b_id[y]){
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_id);
                for(int i=x;i<=y;i++)a[i]+=z;
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_num);
            }
            else{
                for(int i=b_id[x]+1;i<b_id[y];i++)b[i].lazy_add+=z;
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_id);
                for(int i=x;i<=b[b_id[x]].b_r;i++)a[i]+=z;
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_num);
                sort(a+b[b_id[y]].b_l,a+b[b_id[y]].b_r+1,cmp_id);
                for(int i=b[b_id[y]].b_l;i<=y;i++)a[i]+=z;
                sort(a+b[b_id[y]].b_l,a+b[b_id[y]].b_r+1,cmp_num);
            }
        }
        else{
            if(b_id[x]==b_id[y]){
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_id);
                cout<<a[x+z-1]<<'\n';
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_num);
                continue;
            }
            ll L=1e15,R=-1e15,mid=0,ans=0;
            for(int i=b_id[x];i<=b_id[y];i++)L=min(L,a[b[i].b_l]+b[i].lazy_add),R=max(R,a[b[i].b_r]+b[i].lazy_add);
            while(L<=R){
                mid=(L+R)>>1;
                ll s=0;
                for(int i=b_id[x]+1;i<b_id[y];i++)s+=count(b[i].b_l,b[i].b_r,mid-b[i].lazy_add);
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_id);
                for(int i=x;i<=b[b_id[x]].b_r;i++)s+=(a[i]+b[b_id[x]].lazy_add<=mid);
                sort(a+b[b_id[x]].b_l,a+b[b_id[x]].b_r+1,cmp_num);
                sort(a+b[b_id[y]].b_l,a+b[b_id[y]].b_r+1,cmp_id);
                for(int i=b[b_id[y]].b_l;i<=y;i++)s+=(a[i]+b[b_id[y]].lazy_add<=mid);
                sort(a+b[b_id[y]].b_l,a+b[b_id[y]].b_r+1,cmp_num);
                if(s<z)L=mid+1;
                else R=mid-1,ans=mid;
            }
            cout<<ans<<'\n';
        }
    }
	return 0;
}

为什么这份代码CE了啊

2024/7/24 09:26
加载中...