QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#618156#2559. Endless RoadfzxWA 15ms140872kbC++146.7kb2024-10-06 19:18:132024-10-06 19:18:14

Judging History

你现在查看的是最新测评结果

  • [2024-10-06 19:18:14]
  • 评测
  • 测评结果:WA
  • 用时:15ms
  • 内存:140872kb
  • [2024-10-06 19:18:13]
  • 提交

answer

#include <bits/stdc++.h>
#define int long long 
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int INF=1e6+5;

struct P3{
    int l,r,id;
}aa[INF];
int n,ll[INF],rr[INF],pre[INF];
pii A[INF]; 
// A 维护合法的左端点
vector <int> cnt;
set <int> s3;

set < pii > s; // s 集合维护所有合法的区间
struct P2{
    int l,id;
    bool operator < (const P2 &x) const {
        if (x.l!=l) return x.l>l;
        else return x.id<id;
    }
};
set <P2> s2[INF];
int Get(int x) {return lower_bound(cnt.begin(),cnt.end(),x)-cnt.begin()+1;}
struct BIT{
    int tree[INF];
    void add(int x,int y) {for (int i=x;i<=1e6;i+=i&-i) tree[i]+=y;}
    int query(int x) {int sum=0;for (int i=x;i;i-=i&-i) sum+=tree[i];return sum;}
}T1;
struct Segment{
    #define ll tl[id]
    #define rr tr[id]
    #define ls(x) x<<1
    #define rs(x) x<<1|1
    int tl[INF<<2],tr[INF<<2],lazy[INF<<2];
    pii sum[INF<<2];int sum2[INF<<2];
    void push_up(int id) {
        sum[id]=min(sum[ls(id)],sum[rs(id)]);
        sum2[id]=min(sum2[ls(id)],sum2[rs(id)]);
    }
    void push_down(int id) {
        if (!lazy[id]) return ;
        int rt=ls(id),x=lazy[id];
        sum[rt].fi+=x;lazy[rt]+=x;
        rt=rs(id),x=lazy[id];
        sum[rt].fi+=x;lazy[rt]+=x;
        lazy[id]=0;
    }
    void build(int l,int r,int id) {
        ll=l;rr=r;
        if (ll==rr) {
            int N=1e18;
            if (A[ll].se) 
                sum[id]={cnt[ll-1]-A[ll].fi,A[ll].se},
                sum2[id]=aa[pre[A[ll].se]].l;
            else sum[id]={N,0},sum2[id]=N;
            return ;
        }
        int Mid=(ll+rr)>>1;
        build(ll,Mid,ls(id));
        build(Mid+1,rr,rs(id));
        push_up(id);
    }
    void add(int l,int id) {
        if (ll==rr) {
            int N=1e18;
            if (A[ll].se) 
                sum[id]={A[ll].fi,A[ll].se},
                sum2[id]=aa[pre[A[ll].se]].l;
            else sum[id]={N,0},sum2[id]=N;
            return ;
        }
        push_down(id);
        int Mid=(ll+rr)>>1;
        if (l<=Mid) add(l,ls(id));
        else add(l,rs(id));
        push_up(id);
//        cerr<<ll<<" "<<rr<<" "<<sum[id].fi<<" "<<sum[id].se<<" qaqqwq?\n";
    }
    void add2(int l,int r,int x,int id) {
        if (l<=ll && rr<=r) {
            sum[id].fi+=x;
            lazy[id]+=x;
            return ;
        }
        push_down(id);
        int Mid=(ll+rr)>>1;
        if (l<=Mid) add2(l,r,x,ls(id));
        if (Mid<r) add2(l,r,x,rs(id));
        push_up(id);
    }
    int query2(int l,int L,int id) {
        if (rr<l) return -1;
//        cerr<<sum2[id]<<" "<<L<<" "<<rr<<" "<<l<<" "<<id<<" qweiorj!!!!!!!!!!!!!!!!!!!!!!!!1\n";
        if (sum2[id]>=L) return -1;
        if (ll==rr) return ll;
        push_down(id);
        int ba=query2(l,L,rs(id));
        if (ba==-1) ba=query2(l,L,ls(id)); 
        return ba;
    }
    #undef ll
    #undef rr
    #undef ls
    #undef rs
}T2;
struct Segment2{
    #define ll tl[id]
    #define rr tr[id]
    #define ls(x) x<<1
    #define rs(x) x<<1|1
    int tl[INF<<2],tr[INF<<2],sum[INF<<2];
    void push_up(int id) {sum[id]=max(sum[ls(id)],sum[rs(id)]);}
    void build(int l,int r,int id) {
        ll=l;rr=r;
        if (ll==rr) {if (s2[ll].size()) sum[id]=s2[ll].begin()->l;else sum[id]=-1e18;return ;}
        int Mid=(ll+rr)>>1;
        build(ll,Mid,ls(id));
        build(Mid+1,rr,rs(id));
        push_up(id);
    }
    void add(int l,int id) {
        if (ll==rr) {
            if (s2[ll].size()) sum[id]=s2[ll].begin()->l;
            else sum[id]=-1e18;
            return ;
        }
        int Mid=(ll+rr)>>1;
        if (l<=Mid) add(l,ls(id));
        else add(l,rs(id));
        push_up(id);
    }
    int query(int l,int L,int id) {
        if (rr<l) return -1;
        if (sum[id]<L) return -1;
        if (ll==rr) return ll;
        int ba=query(l,L,ls(id));
        if (ba==-1) ba=query(l,L,rs(id)); 
        return ba;
    }
    #undef ll
    #undef rr
    #undef ls
    #undef rs
}T3;
void del(int x,int X) {
    // [cnt[x-2],cnt[x-1]]
    int T=T2.query2(X,cnt[x-2],1);
//    cerr<<cnt[x-2]<<" "<<cnt[x-1]<<" "<<x-1<<" "<<T<<" qaqqwq?\n";
    if (T!=-1) {T2.add2(X,T,-(cnt[x-1]-cnt[x-2]),1);}
}
signed main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for (int i=1;i<=n;i++) 
        cin>>ll[i]>>rr[i],cnt.pb(ll[i]),cnt.pb(rr[i]);
    sort(cnt.begin(),cnt.end());
    cnt.erase(unique(cnt.begin(),cnt.end()),cnt.end());
    for (int i=1;i<=n;i++) aa[i]={ll[i],rr[i],i};
    sort(aa+1,aa+1+n,[](P3 xx,P3 yy){return xx.r!=yy.r?xx.r<yy.r:(xx.l!=yy.l?xx.l>yy.l:xx.id<yy.id);});
    int L=-1;
    for (int i=1;i<=n;i++) {
        if (aa[i].l<=L) s2[Get(aa[i].r)].insert({aa[i].l,aa[i].id});
        else L=max(L,aa[i].l),A[Get(aa[i].r)]={aa[i].l,aa[i].id},s.insert({aa[i].l,aa[i].r});
    }
    for (int i=1;i<=n;i++) pre[aa[i].id]=i;
    int len=cnt.size();
    for (int i=1;i<=len;i++) s3.insert(i);
    T2.build(1,len,1);int T=n;
    T3.build(1,len,1);
    
//    cerr<<len<<"\n";
//    for (int i=1;i<=len;i++) cerr<<cnt[i-1]<<" ";
//    cerr<<" endl\n";
//    T=5; // ATTTTT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    while (T--) {
        int id=T2.sum[1].se;
        cout<<id<<" ";
        id=pre[id];
        // aa[id].l aa[id].r
        int it2=Get(aa[id].l)+1,it3=Get(aa[id].r);
        auto I=s3.lower_bound(it2);
        auto I2=s.lower_bound({aa[id].l,aa[id].r});
        vector <int> cnt5;
        for (auto it=I;it!=s3.end();it++) {
            if (*it>it3) break;cnt5.pb(*it);
        }
        for (int i:cnt5) {
        	auto Is=I2;Is++;
        	if (Is!=s.end()) del(i,Is->se);
            s3.erase(i),T1.add(i,cnt[i-1]-cnt[i-2]);
//        	cerr<<i<<" "<<cnt[i-1]-cnt[i-2]<<" iroweqj\n";
		}
        int LL=-1;
        if (I2!=s.begin()) {
            auto Ij2=I2;Ij2--;
            LL=Get(Ij2->fi);
        }
        int RR=len+1;
        auto Is=I2;Is++;
        if (Is!=s.end()) RR=Get(Is->se);
		A[it3]={0,0};
		T2.add(it3,1);
        int la=it3;
        while (la<RR) {
            int F=T3.query(la,LL,1);
            if (F==-1) break;
            if (F>=RR) break;
//            cerr<<F<<" "<<cnt[F-1]<<" "<<RR<<" "<<s.size()<<" qweorji\n";
            la=F+1;auto it5=*(--s2[F].end());
			s2[F].erase(--s2[F].end());s.insert({aa[pre[it5.id]].l,aa[pre[it5.id]].r});
//            cerr<<F<<" "<<cnt[F-1]-it5.l-(T1.query(F)-T1.query(Get(it5.l)))<<" "<<it5.id<<" bomb?\n";
			T3.add(F,1);A[F]={cnt[F-1]-it5.l-(T1.query(F)-T1.query(Get(it5.l))),it5.id};
			T2.add(F,1);
        }        
        s.erase(I2);
    }
    cout<<"\n";
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 11ms
memory: 140872kb

input:

6
1 2
2 3
3 4
4 5
1 3
3 5

output:

1 2 5 3 4 6 

result:

ok 6 tokens

Test #2:

score: -100
Wrong Answer
time: 15ms
memory: 138852kb

input:

4
3 7
10 14
1 6
6 11

output:

1 2 3 4 

result:

wrong answer 2nd words differ - expected: '3', found: '2'