求助诡异 TLE 50 分
查看原帖
求助诡异 TLE 50 分
928972
ny_Dacong楼主2024/11/8 21:38

rt,50 分,后面 5 个点全 T 了。

下载数据,跑出来确实像死循环一样跑不出结果。但是想注释查看哪个函数写错了,结果发现处理操作 1 2 就都没有问题,能跑出来。所以求助。

调试的时候是这样调的:

  • 注释 81 行,在 1 秒之内跑完。
  • 注释 76~78 行,在 1 秒之内跑完。
  • 都不注释,直接给我死循环。

诶,还押上了?

总之怀疑是因为 delete 操作影响了 query 操作,然后区间范围传错导致死循环。

求大佬看看。

#include<bits/stdc++.h>
using namespace std;
long long n,m,ntot = 0;
long long num[2000005];
const long long inf = 0x3f3f3f3f;
struct node{
	long long ls,rs,del,Max,Min;
}tree[1000500<<2];
void push_up(long long p){
	tree[p].Max = max(tree[tree[p].ls].Max,tree[tree[p].rs].Max);
	tree[p].Min = min(tree[tree[p].ls].Min,tree[tree[p].rs].Min);
	tree[p].del = tree[tree[p].ls].del+tree[tree[p].rs].del;
	return;
}
long long build(long long pl,long long pr){
	long long p = ++ntot;
	tree[p].del = 0;
	if(pl == pr){
		tree[p].Max = tree[p].Min = num[pl];
		return p;
	}
	long long mid = pl+((pr-pl)>>1);
	tree[p].ls = build(pl,mid);
	tree[p].rs = build(mid+1,pr);
	push_up(p);
	return p;
}
void modify(long long p,long long pl,long long pr,long long opt){
	if(pl == pr){
		tree[p].Max = -inf,tree[p].Min = inf;
		tree[p].del = 1;
		return;
	}
	long long mid = pl+((pr-pl)>>1);
	if(opt <= (mid-pl+1-tree[tree[p].ls].del)){
		modify(tree[p].ls,pl,mid,opt);
	}else{
		modify(tree[p].rs,mid+1,pr,opt-(mid-pl+1-tree[tree[p].ls].del));
	}
	push_up(p);
	return;
}
pair<long long,long long> query(long long p,long long pl,long long pr,long long l,long long r){
	if(l == 1 && r == pr-pl+1){
		return {tree[p].Max,tree[p].Min};
	}
	long long mid = pl+((pr-pl)>>1);
	long long Size = (mid-pl+1-tree[tree[p].ls].del);
	pair<long long,long long> res,tp;
	res = {-inf,inf};
	if(l <= Size){
		tp = query(tree[p].ls,pl,mid,l,min(r,Size));
		res.first = max(res.first,tp.first);
		res.second = min(res.second,tp.second);
	}
	if(Size < r){
		tp = query(tree[p].rs,mid+1,pr,max(1ll,l-Size),r-Size);
		res.first = max(res.first,tp.first);
		res.second = min(res.second,tp.second);
	}
	return res;
}
int main(){
//	freopen("P6011_6.in","r",stdin);
//	freopen("P6011_6.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(long long i = 1; i <= n; i++){
		scanf("%lld",&num[i]);
	}
	build(1,n);
	while(m--){
		static long long tpa,tpb,tpc;
		static pair<long long,long long> tpd;
		scanf("%lld%lld",&tpa,&tpb);
		if(tpa>>1){
			scanf("%lld",&tpc);
			tpd = query(1,1,n,tpb,tpc);
			printf("%lld %lld\n",tpd.second,tpd.first);
			continue;
		}
		modify(1,1,n,tpb);
	}
	return 0;
}
2024/11/8 21:38
加载中...