제출 #1023877

#제출 시각아이디문제언어결과실행 시간메모리
1023877Dzadzo자리 배치 (IOI18_seats)C++17
100 / 100
2270 ms204544 KiB
#include <bits/stdc++.h> #include "seats.h" #define ll long long // #define int ll #define pb push_back #define S second #define F first #define pii pair<int,int> #define vi vector <int> #define vvi vector <vi> #define vvvi vector <vvi> #define vp vector <pii> #define vvp vector <vp> #define vb vector<bool> #define vvb vector<vb>; #define INF INT_MAX #define MOD 1000000007 #define MAXN 1000000 using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") vp t(4*MAXN+1); int lazy[4*MAXN+1]; pii merge(pii a,pii b) { if (a.F>b.F)return b; if (a.F<b.F)return a; return {a.F,a.S+b.S}; } void build(int v,int tl,int tr) { if (tl==tr)t[v]={0,1};else { int tm=(tl+tr)/2; build(v*2,tl,tm); build(v*2+1,tm+1,tr); t[v]=merge(t[v*2],t[v*2+1]); } } void push(int v) { t[2*v].F+=lazy[v]; t[2*v+1].F+=lazy[v]; lazy[2*v]+=lazy[v]; lazy[2*v+1]+=lazy[v]; lazy[v]=0; } void up(int v,int tl,int tr,int l,int r,int delta) { if (l>r)return; if (tl==l && tr==r) { t[v].F+=delta; lazy[v]+=delta; }else { push(v); int tm=(tl+tr)/2; up(v*2,tl,tm,l,min(r,tm),delta); up(v*2+1,tm+1,tr,max(l,tm+1),r,delta); t[v]=merge(t[v*2],t[v*2+1]); } } vvi arr; vector <vector <bool>> seen; int n,H,W; void add(int x,int y,int t) { vi v; v.pb(arr[x][y]); v.pb(arr[x+1][y]); v.pb(arr[x][y+1]); v.pb(arr[x+1][y+1]); sort(v.begin(),v.end()); up(1,1,n,v[0],min(n,v[1]-1),t); up(1,1,n,v[2],min(n,v[3]-1),t); } vi R,C; void give_initial_chart(int h, int w, vi r, vi c) { R=r; C=c; H=h; W=w; n=H*W; build(1,1,n); for (int i=0;i<=H+1;i++) { vi cur; vb CUR; for (int j=0;j<=W+1;j++) { cur.pb(0); CUR.pb(false); } seen.pb(CUR); arr.pb(cur); } for (int i=0;i<n;i++)arr[R[i]+1][C[i]+1]=i+1; for (int i=0;i<=W+1;i++)arr[0][i]=INF,arr[H+1][i]=INF; for (int i=0;i<=H+1;i++)arr[i][0]=INF,arr[i][W+1]=INF; for (int i=0;i<=H;i++) { for (int j=0;j<=W;j++) { add(i,j,1); } } // cout<<t[1].S; } int swap_seats(int a,int b) { vp cur; cur.pb({R[a]+1,C[a]+1}); cur.pb({R[a],C[a]+1}); cur.pb({R[a]+1,C[a]}); cur.pb({R[a],C[a]}); cur.pb({R[b]+1,C[b]+1}); cur.pb({R[b]+1,C[b]}); cur.pb({R[b],C[b]+1}); cur.pb({R[b],C[b]}); for (auto &[x,y]:cur){ if (!seen[x][y])add(x,y,-1); seen[x][y]=true; } for (auto &[x,y]:cur)seen[x][y]=false; swap(arr[R[a]+1][C[a]+1],arr[R[b]+1][C[b]+1]); swap(R[a],R[b]); swap(C[a],C[b]); for (auto &[x,y]:cur){ if (!seen[x][y])add(x,y,1); seen[x][y]=true; } for (auto &[x,y]:cur)seen[x][y]=false; return t[1].S; } /*signed main(){ give_initial_chart(1,5,{0, 0, 0, 0, 0},{0, 1, 2, 3, 4}); cout<<swap_seats(0,1)<<'\n'; cout<<swap_seats(0,3)<<'\n'; cout<<swap_seats(4,0)<<'\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...