0分全部WA求教!
  • 板块P3863 序列
  • 楼主July14th
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/27 08:40
  • 上次更新2024/1/27 11:33:27
查看原帖
0分全部WA求教!
531207
July14th楼主2024/1/27 08:40
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Max 100010
struct Add{
	int x,y;
	int time;
}ad[Max<<1];
struct Find{
	int x,y;
	int time;
	int index; 
}fi[Max];
int cnt1,cnt2;
int ans[Max];
int cost[Max];
int n,m;
int block[Max];
int bll[Max],blr[Max];
int addx[Max];
int ts[Max],fs[Max];
int size;
//template<class T>inline void read(T &num){
//	char ch;
//	int f=1;
//	while(!isdigit(ch=getchar())){
//		if(ch=='-'){
//			f=-1;
//		}
//	}
//	num=ch-'0';
//	while(isdigit(ch=getchar())){
//		num=num*10+ch-'0';
//	}
//	num=num*f;
//} 
inline bool cmp_add(Add a,Add b){
	return a.x!=b.x?a.x<b.x:a.time<b.time; 
}
inline bool cmp_find(Find a,Find b){
	return a.x!=b.x?a.x<b.x:a.time<b.time; 
}
inline bool cmp(int a,int b){
	return a>b;
}
inline void resort(int x){
	for(int i=bll[x];i<=blr[i];i++){
		fs[i]=ts[i];
	}
	std::sort(fs+bll[x],fs+blr[x]+1,cmp);
	return;
}
inline void change(int l,int r,int w){
	l=std::max(l,0ll);
	r=std::min(r,m);
	if(block[l]==block[r]){
		for(register int i=l;i<=r;i++){
			ts[i]+=w;
		}
		resort(block[l]);
		return;
	}
	for(register int i=l;i<=blr[block[l]];i++){
		ts[i]+=w;
	}
	resort(block[l]);
	for(register int i=r;i>=bll[block[r]];i--){
		ts[i]+=w;
	} 
	resort(block[r]);
	for(register int i=block[l]+1;i<=block[r]-1;i++){
		addx[i]+=w;
	}
	return;	
}
inline int query(int l,int r,int w){
	int cnt=0;
	if(block[l]==block[r]){
		for(register int i=l;i<=r;i++){
			if(ts[i]+addx[block[i]]>=w){
				cnt++;
			}
		}
		return cnt;
	}
	for(register int i=l;i<=blr[block[l]];i++){
		if(ts[i]+addx[block[i]]>=w){
			cnt++;
		}
	}
	for(register int i=r;i>=bll[block[r]];i--){
		if(ts[i]+addx[block[i]]>=w){
			cnt++;
		}
	}
	for(register int i=block[l]+1;i<=block[r]-1;i++){
		int ll,rr,ans;
		ll=bll[i];
		rr=blr[i];
		ans=bll[i]-1;
		while(ll<=rr){
			int mid=(ll+rr)>>1;
			if(fs[mid]+addx[block[mid]]>=w){
				ans=mid;
				ll=mid+1;
			}
			else{
				rr=mid-1;
			}
		}
		cnt+=ans-bll[i]+1;
	}
	return cnt;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(register int i=1;i<=n;i++){
		scanf("%lld",&cost[i]);
	}
	for(register int i=1,opt;i<=m;i++){
		scanf("%lld",&opt);
		if(opt==1){
			int l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			ad[++cnt1].x=l;
			ad[cnt1].time=i;
			ad[cnt1].y=x;
			ad[++cnt1].x=r+1;
			ad[cnt1].time=i;
			ad[cnt1].y=-x;
		}
		else{
			int p,y;
			scanf("%lld%lld",&p,&y);	
			fi[++cnt2].x=p;
			fi[cnt2].index=cnt2;
			fi[cnt2].y=y;
			fi[cnt2].time=i;
		}
	}
	std::sort(ad+1,ad+cnt1+1,cmp_add);
	std::sort(fi+1,fi+cnt2+1,cmp_find);
	size=sqrt(m);
	for(register int i=0;i<=m;i++){
		block[i]=i/size+1;
	}
	for(register int i=1;(i-1)*size<=m;i++){
		bll[i]=(i-1)*size;
		blr[i]=std::min(i*size-1,m);
	}
	int now=1;
	for(register int i=1;i<=cnt2;i++){
		while((ad[now].x<fi[i].x||(ad[now].x==fi[i].x&&ad[now].time<fi[i].time))&&now<=cnt1){
			change(ad[now].time,m,ad[now].y);
			now++; 
		}
		ans[fi[i].index]=query(0,fi[i].time-1,fi[i].y-cost[fi[i].x]);
	}
	for(register int i=1;i<=cnt2;i++){
		printf("%lld\n",ans[i]);
	}	
	return 0;
} 
2024/1/27 08:40
加载中...