蒟蒻求卡常tle36pts。玄关
  • 板块题目总版
  • 楼主youakioi
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/26 10:15
  • 上次更新2024/7/26 11:19:01
查看原帖
蒟蒻求卡常tle36pts。玄关
696748
youakioi楼主2024/7/26 10:15

rt.

由乃打扑克

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+10,M=1e5+10;
struct node{
	int id,k;
	bool operator<(const node &x)const{
		return k<x.k;
	}
}a[N],c[M],d[M],e[M];
struct kuai{
	int l,r,maxn,minn,tag;
	kuai(){
		maxn=-1e18,minn=1e18;
	}
}b[N]; 
int n,m,len;
int ce,cc,cd,f[M],cf,dy[N];
int k=1;
inline void init(){
	for(int i=1;i<=n;i+=len,k++){
		b[k].l=i,b[k].r=min(i+len-1,n);
		for(int j=b[k].l;j<=b[k].r;++j){
			b[k].maxn=max(b[k].maxn,a[j].k);
			b[k].minn=min(b[k].minn,a[j].k); 
		}
		sort(a+b[k].l,a+b[k].r+1);
	}
//	for(int i=1;i<=k;++i) cout<<b[i].l<<' '<<b[i].r<<endl;
}
inline void gb(){
	ce=0;
	int pc=1,pd=1;	
	while(pc<=cc&&pd<=cd){
		if(c[pc].k<=d[pd].k) e[++ce]=c[pc++];
		else e[++ce]=d[pd++];
	}
	while(pc<=cc) e[++ce]=c[pc++];
	while(pd<=cd) e[++ce]=d[pd++];
}

inline int qk(int x){
	if(x%len==0) return x/len;
	return x/len+1;
}

inline void change(int l,int r,int p){
	if(qk(l)==qk(r)){
		//左右两边在同一个块 
		cc=0,cd=0;
		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i){ 
			if(l<=a[i].id&&a[i].id<=r) a[i].k+=p,c[++cc]={a[i].id,a[i].k};
			else d[++cd]={a[i].id,a[i].k};
		}
		
//		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) cout<<a[i].k<<' '<<a[i].id<<'\n';
//		cout<<'#'<<endl;
		
		gb();
		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) a[i]=e[i-b[qk(l)].l+1];
		
//		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) cout<<e[i-b[qk(l)].l+1].k<<' '<<e[i-b[qk(l)].l+1].id<<'\n';
//		cout<<'#'<<endl;

		b[qk(l)].maxn=a[b[qk(l)].r].k+b[qk(l)].tag,b[qk(l)].minn=a[b[qk(l)].l].k+b[qk(l)].tag;
		return;
	}
//	cout<<'C'<<L<<' '<<R<<endl;
	for(int i=qk(l)+1;i<=qk(r)-1;++i) b[i].maxn+=p,b[i].minn+=p,b[i].tag+=p;
	//左端点 l~L-1
	cc=0,cd=0;
	for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i){
		if(l<=a[i].id&&a[i].id<=r) c[++cc]={a[i].id,a[i].k+p};
		else d[++cd]={a[i].id,a[i].k};
	} 
	gb();
	for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) a[i]=e[i-b[qk(l)].l+1];
	b[qk(l)].minn=a[b[qk(l)].l].k+b[qk(l)].tag,b[qk(l)].maxn=a[b[qk(l)].r].k+b[qk(l)].tag;
	//右端点 R+1~r
	cc=0,cd=0;
	for(int i=b[qk(r)].l;i<=b[qk(r)].r;++i){
		if(l<=a[i].id&&a[i].id<=r) c[++cc]={a[i].id,a[i].k+p};
		else d[++cd]={a[i].id,a[i].k};
	}
	gb();
	for(int i=b[qk(r)].l;i<=b[qk(r)].r;++i) a[i]=e[i-b[qk(r)].l+1];
	b[qk(r)].maxn=a[b[qk(r)].r].k+b[qk(r)].tag,b[qk(r)].minn=a[b[qk(r)].l].k+b[qk(r)].tag;
	
	//调试 
//	for(int i=1;i<=n;++i) cout<<a[i].id<<' '<<a[i].k<<" #";
//	cout<<endl;
//	for(int i=1;i<=k;++i) cout<<b[i].l<<' '<<b[i].r<<' '<<b[i].minn<<' '<<b[i].maxn<<' '<<b[i].tag<<endl;
//	cout<<'!'<<endl;
}
inline int qsum(int l,int r,int x){
	if(qk(l)==qk(r)){
		int sum=0;
		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i){
			if(l<=a[i].id&&a[i].id<=r&&a[i].k+b[qk(l)].tag<=x) sum++; 
		}
		return sum;
	}
	int sum=0;
	int L=b[qk(l)+1].r;
	int R=b[qk(r)-1].r;
	for(int i=qk(l)+1;i<=qk(r)-1;++i){
		int k=upper_bound(a+b[i].l,a+b[i].r+1,node({100000,x-b[i].tag}))-a;
		sum+=k-b[i].l;
	}
//	cout<<l<<' '<<r<<' '<<x<<' '<<sum<<endl;
	//散块暴力找
	//左 
	for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) 
		if(l<=a[i].id&&a[i].k+b[qk(l)].tag<=x) sum++;
	//右
	for(int i=b[qk(r)].l;i<=b[qk(r)].r;++i){
		if(a[i].id<=r&&a[i].k+b[qk(r)].tag<=x) sum++;
	} 
	return sum;                                                                                 
}
inline void query(int l,int r,int p){
	if(r-l+1<p){
		cout<<-1<<endl;
		return; 
	}
	if(qk(l)==qk(r)){ 
		if(p==1){
			int minn=1e18;
			for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i){
				if(a[i].id>=l&&a[i].id<=r) minn=min(a[i].k+b[qk(l)].tag,minn);
			}
			cout<<minn<<endl;
			return;
		}
		cf=0;
		for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i) if(l<=a[i].id&&a[i].id<=r) f[++cf]=a[i].k+b[qk(l)].tag;
		sort(f+1,f+cf+1);
//		cout<<cf<<endl;	
		int sum=1;
		if(cf>=p) cout<<f[p]<<endl;
		else cout<<-1<<endl;
		return;
	}
	int l_=1e18,r_=-1e18,ans=1e18;
//	cout<<L<<' '<<R<<endl;
	for(int i=qk(l)+1;i<=qk(r)-1;++i) l_=min(l_,b[i].minn),r_=max(r_,b[i].maxn);
//	cout<<l_<<' '<<r_<<endl;
	for(int i=b[qk(l)].l;i<=b[qk(l)].r;++i){
		if(a[i].id>=l) l_=min(l_,a[i].k+b[qk(l)].tag),r_=max(r_,a[i].k+b[qk(l)].tag);
	}
//	cout<<l_<<' '<<r_<<endl;
	for(int i=b[qk(r)].l;i<=b[qk(r)].r;++i){
		if(a[i].id<=r) l_=min(l_,a[i].k+b[qk(r)].tag),r_=max(r_,a[i].k+b[qk(r)].tag);
	}
//	cout<<l_<<' '<<r_<<endl;
	while(l_<=r_){
		int mid=(l_+r_)>>1;
		if(qsum(l,r,mid)>=p) r_=mid-1,ans=mid;
		else l_=mid+1;
	}
	if(ans!=1e18) cout<<ans<<endl; 
	else cout<<-1<<endl;
}
signed main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	len=700;
	for(int i=1;i<=n;++i) cin>>a[i].k,a[i].id=i;
	init();
//	for(int i=1;i<=n;++i) cout<<a[i].k<<' '<<a[i].id<<endl;
//	cout<<'#'<<endl;
//	cout<<m<<endl;
	for(int i=1;i<=m;++i){
		int op,l,r,k;
		cin>>op>>l>>r>>k; 
		if(op==1) query(l,r,k);
		else change(l,r,k);
//			cout<<'q'<<qsum(1,5,7)<<endl;
	}
	return 0;
}
2024/7/26 10:15
加载中...