为什么 csp-s t1 这样写会TLE啊,我感觉是 O(nlog2n) 的吧。
#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;
}