제출 #930095

#제출 시각아이디문제언어결과실행 시간메모리
930095HuyQuang_re_Zero자리 배치 (IOI18_seats)C++14
100 / 100
3031 ms140112 KiB
#include <bits/stdc++.h>
#define ll long long
#define db long double
#define maxn 1000005
#define II pair <ll,ll>
#define III pair <ll,II>
#define IV pair <vector <int>,vector <int> >
#define IDB pair <db,int>
#define TII pair <treap*,treap*>
#define fst first
#define snd second
#define BIT(x,i) ((x>>i)&1)
#define pi acos(-1)
#define to_radian(x) (x*pi/180.0)
#define to_degree(x) (x*180.0/pi)
#define Log(x) (31-__builtin_clz((int)x))
#define LogLL(x) (63-__builtin_clzll((ll)x)
using namespace std;
#include "seats.h"
struct pt
{
    int mi3,mi1,slmi;
    friend pt operator + (pt a,pt b)
    {
        if(a.mi3<b.mi3) return a;
        if(b.mi3<a.mi3) return b;
        if(a.mi1<b.mi1) return a;
        if(b.mi1<a.mi1) return b;
        return { a.mi3,a.mi1,a.slmi+b.slmi };
    }
};
struct Interval_Tree
{
    pt st[4*maxn];
    int lz3[4*maxn],lz1[4*maxn];
    void change(int id,int k3,int k1)
    {
        st[id].mi3+=k3;
        st[id].mi1+=k1;
        lz3[id]+=k3;
        lz1[id]+=k1;
    }
    void down(int id)
    {
        change(id*2,lz3[id],lz1[id]);
        change(id*2+1,lz3[id],lz1[id]);
        lz3[id]=lz1[id]=0;
    }
    void build(int id,int l,int r)
    {
        if(l==r) { st[id]={ 0,0,1 }; return ; }
        int mid=(l+r)>>1;
        build(id*2,l,mid); build(id*2+1,mid+1,r);
        st[id]=st[id*2]+st[id*2+1];
    }
    void update(int id,int l,int r,int u,int v,int k3,int k1)
    {
        if(u>r || v<l) return ;
        if(u<=l && r<=v) { change(id,k3,k1); return ; }
        down(id);
        int mid=(l+r)>>1;
        update(id*2,l,mid,u,v,k3,k1); update(id*2+1,mid+1,r,u,v,k3,k1);
        st[id]=st[id*2]+st[id*2+1];
    }
} IT;

vector <int> a[maxn];
int n,m,x[maxn],y[maxn],i,j;
void Work(int x,int y,int k)
{
    if(a[x][y]==-1 || a[x][y+1]==-1 || a[x+1][y]==-1 || a[x+1][y+1]==-1) return ;
    vector <int> vec;
    vec.push_back(a[x][y]);
    vec.push_back(a[x][y+1]);
    vec.push_back(a[x+1][y]);
    vec.push_back(a[x+1][y+1]);
    sort(vec.begin(),vec.end());
    IT.update(1,1,n*m,vec[0],vec[1]-1,0,k);
    IT.update(1,1,n*m,vec[2],vec[3]-1,k,0);
}
void give_initial_chart(int _n,int _m,vector <int> _X,vector <int> _Y)
{
    n=_n; m=_m;
    for(i=0;i<n*m;i++) x[i+1]=_X[i]+1,y[i+1]=_Y[i]+1;
    for(i=0;i<=n+1;i++) a[i].resize(m+2);
    for(i=1;i<=n*m;i++) a[x[i]][y[i]]=i;
    for(i=0;i<=m+1;i++) a[0][i]=a[n+1][i]=n*m+1;
    for(i=1;i<=n;i++) a[i][0]=a[i][m+1]=n*m+1;

    IT.build(1,1,n*m);
    for(i=0;i<=n;i++)
        for(j=0;j<=m;j++) Work(i,j,1);
}


int swap_seats(int u,int v)
{
    u++; v++;
    Work(x[u]-1,y[u]-1,-1);
    Work(x[u]-1,y[u],-1);
    Work(x[u],y[u]-1,-1);
    Work(x[u],y[u],-1);
    a[x[u]][y[u]]=-1;
    Work(x[v]-1,y[v]-1,-1);
    Work(x[v]-1,y[v],-1);
    Work(x[v],y[v]-1,-1);
    Work(x[v],y[v],-1);
    a[x[v]][y[v]]=-1;

    swap(x[u],x[v]);
    swap(y[u],y[v]);
    a[x[u]][y[u]]=u;
    Work(x[u]-1,y[u]-1,1);
    Work(x[u]-1,y[u],1);
    Work(x[u],y[u]-1,1);
    Work(x[u],y[u],1);

    a[x[v]][y[v]]=v;
    Work(x[v]-1,y[v]-1,1);
    Work(x[v]-1,y[v],1);
    Work(x[v],y[v]-1,1);
    Work(x[v],y[v],1);

    return IT.st[1].slmi;
}

/*
int main()
{
    freopen("seats.inp","r",stdin);
    freopen("seats.out","w",stdout);
    int n,m,q,i,x,y,k;
    vector <int> X,Y;
    cin>>n>>m>>q;
    for(i=1;i<=n*m;i++) cin>>x>>y,X.push_back(x),Y.push_back(y);
    give_initial_chart(n,m,X,Y);
    for(i=1;i<=q;i++) cin>>x>>y,cout<<swap_seats(x,y)<<'\n';
}
*/
#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...