社区讨论

线段树 TLE 求助

P10798 「CZOI-R1」消除威胁参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lyw5s323
此快照首次捕获于
2024/07/22 06:57
2 年前
此快照最后确认于
2024/07/22 09:39
2 年前
查看原帖
求助Subtask #3TLE Subtask #4TLE但AC最后一个点 求助Subtask #5 也是TLE 但AC最后一个点
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10; 
struct re{
	int l,r;
	int val;
}tr[N*4];
int n;
int a[N];
struct ree{
	int p;
	int next;
}e[N];
unordered_map<int,int> h;
unordered_map<int,int> last;
int ll(int x){
	return x<<1;
}
int rr(int x){
	return x<<1|1;
}
void init(int p,int l,int r){
	tr[p].l=l;tr[p].r=r;
	if(l==r){
		tr[p].val=abs(a[l]);
		return ;
	}
	int mid=l+r>>1;
	init(ll(p),l,mid);
	init(rr(p),mid+1,r);
	tr[p].val=max(tr[ll(p)].val,tr[rr(p)].val);
}
int ask(int p,int x,int y){
	if(x<=tr[p].l&&y>=tr[p].r){
		return tr[p].val;
	}
	int ans=-1e18;
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) ans=max(ask(ll(p),x,y),ans);
	if(y>mid) ans=max(ask(rr(p),x,y),ans);
	return ans;
}
signed main(){
	scanf("%d",&n);
	bool pd=true;
	int r=1e9+1;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(r==1e9+1) r=abs(a[i]);
		else if(r!=abs(a[i])) pd=false;
		if(last[abs(a[i])]==0){
			if(a[i]>0) a[i]=-a[i];
			last[abs(a[i])]=1;
		}else{
			if(a[i]<0) a[i]=-a[i];
			last[abs(a[i])]=0;
		}
		e[i].p=i;
		e[i].next=h[a[i]];
		h[a[i]]=i;
	}
	if(pd){
		long long x=n/2;
		long long y=(n+1)/2;
		printf("%lld",x*(x-1)/2+y*(y-1)/2);
		return 0;
	}
	init(1,1,n);
	int sum=0; 
	for(int i=1;i<=n;i++){
		for(int j=h[a[i]];j!=0;j=e[j].next){
			if(e[j].p<=i) break;;
			if(ask(1,i,e[j].p)==abs(a[i])) sum++;
		}
	}
	printf("%lld",sum);
	return 0;
} 

回复

8 条回复,欢迎继续交流。

正在加载回复...