很神奇,loj 上可以通过,但是 at 上就过不了。
#include <iostream>
#include <cstdio>
#include <vector>
#define int long long
using namespace std;
int n;
int t[2000001],tag[2000001],R[200001],pos[200001];
vector<int> v[200001];
struct Node { int a,b; }B[200001],A[200001];
void build(int x, int l, int r) {
if (l==r) {
t[x]=R[l]-l;
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
t[x]=min(t[x<<1],t[x<<1|1]);
}
void pushdown(int x) {
if (tag[x]) {
t[x<<1]+=tag[x],t[x<<1|1]+=tag[x];
tag[x<<1]+=tag[x],tag[x<<1|1]+=tag[x];
tag[x]=0;
}
}
void upd(int x,int l,int r,int L,int R,int k) {
if (L>R) return;
if (L<=l and r<=R) {
t[x]+=k,tag[x]+=k;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if (L<=mid) upd(x<<1,l,mid,L,R,k);
if (R>mid) upd(x<<1|1,mid+1,r,L,R,k);
t[x]=min(t[x<<1],t[x<<1|1]);
}
signed main() {
scanf("%lld",&n);
for (int i=n;i>=1;i--) scanf("%lld%lld",&A[i].a,&A[i].b);
for (int i=n;i>=1;i--) scanf("%lld%lld",&B[i].a,&B[i].b);
for (int i=1;i<=n;i++) {
R[i]=R[i-1];
while (R[i]<n and A[R[i]+1].b<=B[i].b) R[i]++,pos[R[i]]=i;
}
// for (int i=1;i<=n;i++) printf("(%d,%d) ",R[i],i);
// printf("\n");
build(1,1,n);
int ans=n;
for (int i=1;i<=n;i++) {
for (int j=R[i-1]+1;j<=R[i];j++) v[A[j].a].emplace_back(j);
if (v[B[i].a].empty()) continue;
int p=pos[v[B[i].a].back()];
upd(1,1,n,p,i-1,-1);
if (t[1]>=0) ans--,v[B[i].a].pop_back();
else upd(1,1,n,p,i-1,1);
}
printf("%lld",ans);
return 0;
}
/*
3
3 500
2 200
1 100
1 1000
3 700
3 400
*/