답안 #1047096

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1047096 2024-08-07T08:53:57 Z 정희우(#11025) 청소 (JOI20_sweeping) C++17
21 / 100
18000 ms 902208 KB
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;
using lint = long long;
using vint = vector<int>;
using pii = pair<int,int>;

const int MAX_Q=1000010;

struct Obj
{
    int x,d,i;
    bool operator < (const Obj &o) const
    {
        if(x!=o.x)return x<o.x;
        return d<o.d;
    }
};

struct Segtree
{
    struct Seg
    {
        int xi,yi;
        Seg()
        {
            xi=yi=MAX_Q;
        }
        void upd(int d,int i)
        {
            if(d==0) xi=i;
            else yi=i;
        }
    };
    int sz;
    vector<Obj> obj;
    vector<Seg> seg;
    void merge_(Seg &p,const Seg &l,const Seg &r)
    {
        p.xi=l.xi;
        if(l.yi>r.xi)p.xi=min(p.xi,r.xi);
        p.yi=r.yi;
        if(r.xi>l.yi)p.yi=min(p.yi,l.yi);
    }
    void init_seg(int i,int s,int e)
    {
        if(s+1==e)
        {
            seg[i].upd(obj[s].d,obj[s].i);
            return;
        }
        init_seg(i<<1,s,(s+e)>>1);
        init_seg(i<<1|1,(s+e)>>1,e);
        merge_(seg[i],seg[i<<1],seg[i<<1|1]);
    }
    Seg find_(int i,int s,int e,int l,int r)
    {
        if(s>=r || e<=l)return {};
        if(l<=s && e<=r)return seg[i];
        Seg v;
        merge_(v,find_(i<<1,s,(s+e)>>1,l,r),find_(i<<1|1,(s+e)>>1,e,l,r));
        return v;
    }
    int findx(int i,int s,int e,int l,int r,Seg j)
    {
        if(s>=r || e<=l)return -1;
        if(l<=s && e<=r && seg[i].xi>=j.yi)return -1;
        if(s+1==e)return s;
        Seg j2;
        merge_(j2,j,find_(i<<1,s,(s+e)>>1,l,r));
        int v=findx(i<<1|1,(s+e)>>1,e,l,r,j2);
        if(v!=-1)return v;
        return findx(i<<1,s,(s+e)>>1,l,r,j);
    }
    int findy(int i,int s,int e,int l,int r,Seg j)
    {
        if(s>=r || e<=l)return -1;
        if(l<=s && e<=r && seg[i].yi>=j.xi)return -1;
        if(s+1==e)return s;
        Seg j2;
        merge_(j2,find_(i<<1|1,(s+e)>>1,e,l,r),j);
        int v=findy(i<<1,s,(s+e)>>1,l,r,j2);
        if(v!=-1)return v;
        return findy(i<<1|1,(s+e)>>1,e,l,r,j);
    }
    int max_i(int i,int s,int e)
    {
        if(s+1==e)
            return i;
        return max_i(i<<1|1,(s+e)>>1,e);
    }
    void init_()
    {
        sz=obj.size();
        sort(obj.begin(),obj.end());
        seg.resize(max_i(1,0,sz)+1);
        init_seg(1,0,sz);
        Seg v;
    }
    pii calc(pii p)
    {
        int lx=p.first,rx=p.second;
        int l=lower_bound(obj.begin(),obj.end(),(Obj){lx,0,0})-obj.begin();
        int r=upper_bound(obj.begin(),obj.end(),(Obj){rx,1,0})-obj.begin();
        int fx=findx(1,0,sz,l,r,(Seg){});
        int fy=findy(1,0,sz,l,r,(Seg){});
        if(fx!=-1)
            lx=obj[fx].x;
        if(fy!=-1)
            rx=obj[fy].x;
        return {lx,rx};
    }
};

struct Ask
{
    pii p;
    int l,r;
};

int n,m,q;
vector<pii> pos;
vint pin;
vector<Obj> qry;
vector<Ask> ask;
Segtree sseg[MAX_Q<<2];

void init_(int i,int s,int e)
{
    if(i>=MAX_Q<<2)while(1);
    if(s+1==e)
    {
        sseg[i].obj.push_back(qry[s]);
        sseg[i].init_();
        return;
    }
    init_(i<<1,s,(s+e)>>1);
    init_(i<<1|1,(s+e)>>1,e);
    for(auto o : sseg[i<<1].obj)
        sseg[i].obj.push_back(o);
    for(auto o : sseg[i<<1|1].obj)
        sseg[i].obj.push_back(o);
    sseg[i].init_();
}

pii calc(int i,int s,int e,int l,int r,pii p)
{
    if(s>=r || e<=l)return p;
    if(l<=s && e<=r)return sseg[i].calc(p);
    return calc(i<<1|1,(s+e)>>1,e,l,r,calc(i<<1,s,(s+e)>>1,l,r,p));
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n >> m >> q;
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin >> x >> y;
        pos.push_back({x,n-y});
        pin.push_back(0);
    }
    for(int i=0;i<q;i++)
    {
        int t,x,y;
        cin >> t >> x;
        if(t==1)
        {
            ask.push_back({pos[x-1],pin[x-1],(int)qry.size()});
        }
        else if(t==2)
            qry.push_back({n-x,0,(int)qry.size()});
        else if(t==3)
            qry.push_back({x,1,(int)qry.size()});
        else
        {
            cin >> y;
            pos.push_back({x,n-y});
            pin.push_back(qry.size());
        }
    }
    int qn=qry.size();
    init_(1,0,qn);
    for(auto a : ask)
    {
        pii p=calc(1,0,qn,a.l,a.r,a.p);
        cout << p.first << ' ' << n-p.second << '\n';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 220240 KB Output is correct
2 Correct 33 ms 220508 KB Output is correct
3 Execution timed out 18070 ms 219660 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3292 ms 552252 KB Output is correct
2 Correct 3378 ms 551056 KB Output is correct
3 Correct 3514 ms 551476 KB Output is correct
4 Correct 1256 ms 549720 KB Output is correct
5 Correct 1272 ms 551900 KB Output is correct
6 Correct 1912 ms 549728 KB Output is correct
7 Correct 3555 ms 551044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3903 ms 570480 KB Output is correct
2 Correct 3950 ms 570480 KB Output is correct
3 Correct 1949 ms 570220 KB Output is correct
4 Correct 2594 ms 570496 KB Output is correct
5 Correct 3788 ms 570344 KB Output is correct
6 Correct 3855 ms 570540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3903 ms 570480 KB Output is correct
2 Correct 3950 ms 570480 KB Output is correct
3 Correct 1949 ms 570220 KB Output is correct
4 Correct 2594 ms 570496 KB Output is correct
5 Correct 3788 ms 570344 KB Output is correct
6 Correct 3855 ms 570540 KB Output is correct
7 Correct 3639 ms 570424 KB Output is correct
8 Correct 3752 ms 570532 KB Output is correct
9 Correct 4014 ms 570516 KB Output is correct
10 Correct 2245 ms 569864 KB Output is correct
11 Correct 2868 ms 570804 KB Output is correct
12 Correct 3613 ms 570612 KB Output is correct
13 Correct 3466 ms 570524 KB Output is correct
14 Correct 1098 ms 902208 KB Output is correct
15 Execution timed out 18052 ms 247096 KB Time limit exceeded
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 220240 KB Output is correct
2 Correct 33 ms 220508 KB Output is correct
3 Execution timed out 18070 ms 219660 KB Time limit exceeded
4 Halted 0 ms 0 KB -