关于时间复杂度
  • 板块学术版
  • 楼主字如其人
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/10/24 19:41
  • 上次更新2023/11/4 02:22:34
查看原帖
关于时间复杂度
128269
字如其人楼主2021/10/24 19:41

为什么 csp-s t1 这样写会TLE啊,我感觉是 O(nlog2n)O(nlog^2n) 的吧。

评测记录

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}
const int N=1e5+5;
struct Seg{
	int l,r,dat;
}t[N<<2];
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r,t[p].dat=1e9;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
}
void change(int p,int x,int k){
	if(t[p].l==t[p].r){t[p].dat=k;return ;}
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid)change(p<<1,x,k);
	else change(p<<1|1,x,k);
	t[p].dat=min(t[p<<1].dat,t[p<<1|1].dat);
}
int ask(int p,int L,int R){
	if(t[p].l==t[p].r)return t[p].dat;
	int mid=(t[p].l+t[p].r)>>1,Ans=1e9;
	if(L<=mid)Ans=min(Ans,ask(p<<1,L,R));
	if(R>mid) Ans=min(Ans,ask(p<<1|1,L,R));
	return Ans;
}
struct node{
	int x,y;
	inline bool operator <(const node X)const{return x<X.x;}
}a[N],b[N];
int n,m1,m2,A[N],B[N],sum1[N],sum2[N],cnt1,cnt2;
int main(){
	//freopen("airport3.in","r",stdin);
	n=read(),m1=read(),m2=read();
	for(int i=1;i<=m1;i++)a[i].x=read(),a[i].y=read();
	for(int i=1;i<=m2;i++)b[i].x=read(),b[i].y=read();
	sort(a+1,a+m1+1);sort(b+1,b+m2+1);
	if(m1){
		build(1,1,m1);
		change(1,1,a[1].y);
		A[++cnt1]=1;
		for(int i=2;i<=m1;i++){
			int l=1,r=cnt1,pos=cnt1+1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(1,1,mid)<a[i].x)r=mid-1,pos=min(pos,mid);
				else l=mid+1;
			}
			if(pos==cnt1+1)A[++cnt1]=1,change(1,cnt1,a[i].y);
			else A[pos]++,change(1,pos,a[i].y);
		}
	}
	if(m2){
		build(1,1,m2);
		change(1,1,b[1].y);
		B[++cnt2]=1;
		for(int i=2;i<=m2;i++){
			int l=1,r=cnt2,pos=cnt2+1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(1,1,mid)<b[i].x)r=mid-1,pos=min(pos,mid);
				else l=mid+1;
			}
			if(pos==cnt2+1)B[++cnt2]=1,change(1,cnt2,b[i].y);
			else B[pos]++,change(1,pos,b[i].y);
		}
	}
	for(int i=1;i<=m1;i++)sum1[i]=sum1[i-1]+A[i];
	for(int i=1;i<=m2;i++)sum2[i]=sum2[i-1]+B[i];
	int ans=0;
	for(int i=0;i<=n;i++)ans=max(ans,sum1[i]+sum2[n-i]);
	printf("%d",ans);
	return 0;
}
2021/10/24 19:41
加载中...