关于本题 AC 代码
查看原帖
关于本题 AC 代码
420129
Nt_Tsumiki楼主2023/11/13 18:34

很神奇,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
*/
2023/11/13 18:34
加载中...