제출 #138726

#제출 시각아이디문제언어결과실행 시간메모리
138726ckodser자리 배치 (IOI18_seats)C++14
11 / 100
4018 ms48440 KiB
#include "seats.h"
#include<bits/stdc++.h>
#define ll int
#define pb push_back
#define ld long double
#define F first
#define S second
#define mp make_pair
#define pii pair<ll,ll> 

using namespace :: std;

const ll maxn=1e5+500;
const ll inf=1e9+900;


ll mn[2][maxn*4];
ll mx[2][maxn*4];
ll n;
pii findM(ll b,ll L,ll R,ll node,ll l,ll r){
    if(l<=L && R<=r){
	return mp(mn[b][node],mx[b][node]);
    }
    if(R<=l || r<=L){
	return mp(inf,0);
    }
    ll mid=(L+R)/2;
    pii w1=findM(b,L,mid,2*node,l,r);
    pii w2=findM(b,mid,R,2*node+1,l,r);
    return mp(min(w1.F,w2.F),max(w1.S,w2.S));
}
ll nxtmn(ll b,ll L,ll R,ll node,ll v){// akharin jaee ke mn>v
    if(L+1==R){
	if(mn[b][node]>v)return R;
	return L;
    }
    ll mid=(L+R)/2;
    if(mn[b][2*node]>v)return nxtmn(b,mid,R,2*node+1,v);
    else 	       return nxtmn(b,L,mid,2*node  ,v);	
}
ll nxtmx(ll b,ll L,ll R,ll node,ll v){// akharin jaee ke mx<v
    if(L+1==R){
	if(mx[b][node]<v)return R;
	return L;
    }
    ll mid=(L+R)/2;
    if(mx[b][2*node]<v)return nxtmx(b,mid,R,2*node+1,v);
    else 	       return nxtmx(b,L,mid,2*node  ,v);	
}

vector<ll> a[2];

vector<ll> get(ll b,ll w){
    vector<ll> ans;
    for(ll i=0;i<=w;i++){
	ans.pb(nxtmn(b,0,n,1,i)-1);
	ans.pb(nxtmx(b,0,n,1,i)-1);
    }
    return ans;
}





void update(ll b,ll l,ll r,ll node,ll x,ll v){
    if(l+1==r){
	mx[b][node]=v;
	mn[b][node]=v;
	return;
    }
    ll mid=(l+r)/2;
    if(x<mid)
	update(b,l,mid,2*node  ,x,v);
    else 
	update(b,mid,r,2*node+1,x,v);
    mn[b][node]=min(mn[b][2*node],mn[b][2*node+1]);
    mx[b][node]=max(mx[b][2*node],mx[b][2*node+1]);
}

bool isGood(ll x){
    pii w1=findM(0,0,n,1,0,x+1);
    pii w2=findM(1,0,n,1,0,x+1);
    ll r1=w1.S-w1.F+1;
    ll r2=w2.S-w2.F+1;

    return (r1*r2==x+1);
}





void bild(ll b,ll l,ll r,ll node){
    for(ll i=0;i<n;i++){
	update(b,l,r,node,i,a[b][i]);
    }
}
ll ww,hh;
int findANS(){
    vector<ll> imp;
    if(ww+hh<2100){
	imp.pb(0);
	imp.pb(n-1);
	vector<ll> v1=get(0,hh);
	vector<ll> v2=get(1,ww);
	for(auto x:v1)imp.pb(x);
	for(auto x:v2)imp.pb(x);
    }else{
	ll ans=0;
	pii w0=mp(inf,0);
	pii w1=mp(inf,0);
	for(ll i=0;i<n;i++){
	    w0.F=min(w0.F,a[0][i]);
	    w0.S=max(w0.S,a[0][i]);
	    w1.F=min(w1.F,a[1][i]);
	    w1.S=max(w1.S,a[1][i]);
	    ll r0=w0.S-w0.F+1;
	    ll r1=w1.S-w1.F+1;
	    ans+=(r0*r1==i+1);
	}
	return ans;
    }
    sort(imp.begin(),imp.end());
    imp.resize(unique(imp.begin(),imp.end())-imp.begin());
    ll ans=0;
    for(auto x:imp){
	ans+=isGood(x);
    }
    return ans;
}

void give_initial_chart(int H, int W,vector<int> R,vector<int> C) {
    if(H>W){
	swap(H,W);
	swap(R,C);
    }
    ww=W;
    hh=H;
    n=W*H;
    a[0]=R;
    a[1]=C;
    bild(0,0,n,1);
    bild(1,0,n,1);
}
int swap_seats(int A, int B){
    ll ra=a[0][A];
    ll rb=a[0][B];
    ll ca=a[1][A];
    ll cb=a[1][B];
    swap(a[0][A],a[0][B]);
    swap(a[1][A],a[1][B]);
    update(0,0,n,1,A,rb);
    update(0,0,n,1,B,ra);
    update(1,0,n,1,A,cb);
    update(1,0,n,1,B,ca);
    return findANS();
}
#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...