Why TLE F
  • 板块学术版
  • 楼主Pink_Cut_Tree
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/4/27 21:41
  • 上次更新2024/4/28 10:25:43
查看原帖
Why TLE F
793625
Pink_Cut_Tree楼主2024/4/27 21:41

感觉复杂度正确但常数略大,不知为什么 TLE。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+5;
int a[N];
int n,ans;
vector<int>v,v2;
map<int,int>ds,ds2;
int find(int x){
	int l=0,r=v.size()-1,mid;
	while(l<=r){
		mid=l+r>>1;
		if(v[mid]<x&&v[mid+1]>x){
			return mid+1;
		}
		if(v[mid]<x){
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
return l;
}
int find2(int x){
	int l=0,r=v2.size()-1,mid;
	while(l<=r){
		mid=l+r>>1;
		if(v2[mid]<x&&v2[mid+1]>x){
			return mid+1;
		}
		if(v2[mid]<x){
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
return l;
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		int pos=find(a[i]);
		ds[a[i]]+=pos;
		v.insert(upper_bound(v.begin(),v.end(),a[i]),a[i]);
	}
	for(int i=n;i>=1;i--){
		int pos=find2(-a[i]);
		ds2[-a[i]]+=pos;
		v2.insert(lower_bound(v2.begin(),v2.end(),-a[i]),-a[i]);
	}
	for(auto it=ds.begin();it!=ds.end();it++){
		ans+=(*it).first*(*it).second;
	}
	for(auto it=ds2.begin();it!=ds2.end();it++){
		ans+=(*it).first*(*it).second;
	}
	cout<<ans;
return 0;
}

并求一下这题正解

2024/4/27 21:41
加载中...