线段树超时什么原因?
查看原帖
线段树超时什么原因?
1332453
__Florie_楼主2024/11/4 22:33

有奖悬赏Aaaa

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define ldb long double
template<typename T>
inline void read(T &x){
	bool f=1; x=0; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=!f; ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch-'0'); ch=getchar();}
	x=(f?x:-x); return ;
}
template<typename T>
inline void print(T x){
	if(x<0) {putchar('-'); x=-x;}
	if(x>9) print(x/10);
	putchar(x%10+'0'); return ;
}

const int N=100010,M=400010;
int n,len,ans,a[N],aa[N],numl[M],numr[M],lhs[N],rhs[N];
map<int,int>lev;
void updatel(int k,int l,int r,int p){
	if(p<l||p>r) return ;
	if(l==r) {numl[k]++; return ;}
	int mid=(l+r)>>1;
	updatel(k<<1,l,mid,p); updatel((k<<1)|1,mid+1,r,p);
	numl[k]=numl[k<<1]+numl[(k<<1)|1];
	return ;
}
void updater(int k,int l,int r,int p){
	if(p<l||p>r) return ;
	if(l==r) {numr[k]++; return ;}
	int mid=(l+r)>>1;
	updater(k<<1,l,mid,p); updater((k<<1)|1,mid+1,r,p);
	numr[k]=numr[k<<1]+numr[(k<<1)|1];
	return ;
}
int queryl(int k,int l,int r,int lhs,int rhs){
	if(l>rhs||r<lhs||lhs>rhs) return 0;
	if(l==r) return numl[k];
	int mid=(l+r)>>1,ans=0;
	ans=ans+queryl(k<<1,l,mid,lhs,rhs);
	ans=ans+queryl((k<<1)|1,mid+1,r,lhs,rhs);
	return ans;
}
int queryr(int k,int l,int r,int lhs,int rhs){
	if(l>rhs||r<lhs||lhs>rhs) return 0;
	if(l==r) return numr[k];
	int mid=(l+r)>>1,ans=0;
	ans=ans+queryr(k<<1,l,mid,lhs,rhs);
	ans=ans+queryr((k<<1)|1,mid+1,r,lhs,rhs);
	return ans;
}

signed main(){
	read(n);
	for(int i=1;i<=n;i++) {read(a[i]); aa[i]=a[i];}
	sort(aa+1,aa+n+1); len=unique(aa+1,aa+n+1)-aa;
	for(int i=1;i<len;i++) lev[aa[i]]=i;
	for(int i=1;i<=n;i++){
		lhs[i]=queryl(1,1,len-1,lev[a[i]]+1,len-1);
		updatel(1,1,len-1,lev[a[i]]);
	}
	for(int i=n;i>=1;i--){
		rhs[i]=queryr(1,1,len-1,lev[a[i]]+1,len-1);
		updater(1,1,len-1,lev[a[i]]);
	}
	for(int i=1;i<=n;i++) if(lhs[i]>rhs[i]*2||rhs[i]>lhs[i]*2) ans++;
	printf("%lld\n",ans);
	return 0;
}
2024/11/4 22:33
加载中...