Submission #1148310

#TimeUsernameProblemLanguageResultExecution timeMemory
1148310imarnTowers (NOI22_towers)C++20
100 / 100
451 ms76764 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vvi vector<vi>
#define pp pair<ll,int>
#define ub(x,i) upper_bound(all(x),i)-x.begin()
#define lb(x,i) lower_bound(all(x),i)-x.begin()
#define t3 tuple<int,int,int>
using namespace std;
const int mxn=1e6+5;
vector<pii>mp[mxn];
int fs[mxn],ls[mxn];
pii dp[mxn],dp2[mxn];
bool vis[mxn]{0};
bool done[mxn]{0};
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n;cin>>n;priority_queue<int>pq;
    for(int i=1;i<=n;i++){
        int x,y;cin>>x>>y;
        if(mp[x].size()==0)pq.push(x);
        mp[x].pb({y,i});
        fs[x]=0;ls[x]=(int)mp[x].size()-1;
        dp[y]=dp2[y]={-1,-1};
    }
    for(int i=1;i<mxn;i++){
        sort(mp[i].begin(),mp[i].end());
    }
    while(!pq.empty()){
        int x=pq.top();pq.pop();
        if(done[x])continue;bool ch=0;
        pii l=mp[x][fs[x]];
        pii r=mp[x][ls[x]];
        if(fs[x]>ls[x])continue;
        if(fs[x]<=ls[x]&&!vis[l.s]){
            if(dp[l.f].f==-1)vis[l.s]=1,dp[l.f]={l.s,x};
            else if(dp2[l.f].f==-1){
                vis[l.s]=1,dp2[l.f]={l.s,x};
                if(dp2[l.f].s>dp[l.f].s)swap(dp[l.f],dp2[l.f]);
            }
            else {
                if(x<dp2[l.f].s){
                    pii rs=dp2[l.f];vis[rs.f]=0;dp2[l.f]={l.s,x};vis[l.s]=1;
                    if(mp[rs.s][fs[rs.s]].f==l.f)fs[rs.s]++;
                    else if(mp[rs.s][ls[rs.s]].f==l.f)ls[rs.s]--;
                    done[rs.s]=0;pq.push(rs.s);
                }
                else if(x>dp[l.f].s){
                    pii rs=dp[l.f];vis[rs.f]=0;dp[l.f]={l.s,x};vis[l.s]=1;
                    if(mp[rs.s][fs[rs.s]].f==l.f)fs[rs.s]++;
                    else if(mp[rs.s][ls[rs.s]].f==l.f)ls[rs.s]--;
                    done[rs.s]=0;pq.push(rs.s);
                }
                else{
                    fs[x]++;ch=1;
                }
            }
        }
        if(fs[x]<ls[x]&&!vis[r.s]){
            if(dp[r.f].f==-1)vis[r.s]=1,dp[r.f]={r.s,x};
            else if(dp2[r.f].f==-1){
                vis[r.s]=1,dp2[r.f]={r.s,x};
                if(dp2[r.f].s>dp[r.f].s)swap(dp[r.f],dp2[r.f]);
            }
            else {
                if(x<dp2[r.f].s){
                    pii rs=dp2[r.f];vis[rs.f]=0;dp2[r.f]={r.s,x};vis[r.s]=1;
                    if(mp[rs.s][fs[rs.s]].f==r.f)fs[rs.s]++;
                    else if(mp[rs.s][ls[rs.s]].f==r.f)ls[rs.s]--;
                    done[rs.s]=0;pq.push(rs.s);
                }
                else if(x>dp[r.f].s){
                    pii rs=dp[r.f];vis[rs.f]=0;dp[r.f]={r.s,x};vis[r.s]=1;
                    if(mp[rs.s][fs[rs.s]].f==r.f)fs[rs.s]++;
                    else if(mp[rs.s][ls[rs.s]].f==r.f)ls[rs.s]--;
                    done[rs.s]=0;pq.push(rs.s);
                }
                else {
                    ls[x]--;ch=1;
                }
            }
        }if(!ch)done[x]=1;
        else pq.push(x);
    }
    for(int i=1;i<=n;i++)cout<<vis[i];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...