제출 #1332742

#제출 시각아이디문제언어결과실행 시간메모리
1332742activedeltorre자리 배치 (IOI18_seats)C++20
11 / 100
4094 ms49252 KiB
#include "seats.h"
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <vector>
std::vector<int> r;
int hmax[1000005];
int hmin[1000005];
int wmax[1000005];
int wmin[1000005];
int x[1000005];
int y[1000005];
int aint[1000005][4];
void update(int node,int st,int dr,int poz,int r,int c)
{
    if(st>poz || dr<poz)
    {
        return;
    }
    if(st==dr)
    {
        aint[node][0]=r;
        aint[node][1]=r;
        aint[node][2]=c;
        aint[node][3]=c;
        return ;
    }
    int mij=(st+dr)/2;
    update(node*2,st,mij,poz,r,c);
    update(node*2+1,mij+1,dr,poz,r,c);
    aint[node][0]=max(aint[node*2][0],aint[node*2+1][0]);
    aint[node][1]=min(aint[node*2][1],aint[node*2+1][1]);
    aint[node][2]=max(aint[node*2][2],aint[node*2+1][2]);
    aint[node][3]=min(aint[node*2][3],aint[node*2+1][3]);
}
int v[4];
void query(int node,int st,int dr,int qst,int qdr)
{
    if(st>qdr || st>dr || qst>dr || qst>qdr)
    {
        return;
    }
    if(qst<=st && dr<=qdr)
    {
        v[0]=max(v[0],aint[node][0]);
        v[1]=min(v[1],aint[node][1]);
        v[2]=max(v[2],aint[node][2]);
        v[3]=min(v[3],aint[node][3]);
        return ;
    }
    int mij=(st+dr)/2;
    query(node*2,st,mij,qst,qdr);
    query(node*2+1,mij+1,dr,qst,qdr);
}
int n;
int go ()
{
    int poz=1,cnt=1;
    v[0]=x[0];
    v[1]=x[0];
    v[2]=y[0];
    v[3]=y[0];
    while(poz<n)
    {
        query(1,0,n-1,0,poz);
        int arie=(v[0]-v[1]+1)*(v[2]-v[3]+1);
        if(arie-1==poz)
        {
            cnt++;
            poz++;
        }
        else
        {
            poz=arie-1;
        }
    }
    return cnt;
}
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
    n=H*W;
    for(int i=0;i<n;i++)
    {
        x[i]=R[i];
        y[i]=C[i];
        update(1,0,n-1,i,x[i],y[i]);
    }
}

int swap_seats(int a, int b) {
    swap(x[a],x[b]);
    swap(y[a],y[b]);
    update(1,0,n-1,a,x[a],y[a]);
    update(1,0,n-1,b,x[b],y[b]);
    return go ();
}
#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...