(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #286841

#TimeUsernameProblemLanguageResultExecution timeMemory
286841tmwilliamlin168Seats (IOI18_seats)C++14
100 / 100
2382 ms105956 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; #define ar array int h, w, lz[1<<21], b[1000001]; vector<int> r, c; vector<vector<int>> a; ar<int, 2> st[1<<21]; void cmb(int i) { st[i]={min(st[2*i][0], st[2*i+1][0])}; st[i][1]=(st[2*i][0]>st[i][0]?0:st[2*i][1])+(st[2*i+1][0]>st[i][0]?0:st[2*i+1][1]); } void bld(int i=1, int l2=0, int r2=h*w-1) { if(l2==r2) { st[i]={b[l2], 1}; return; } int m2=(l2+r2)/2; bld(2*i, l2, m2); bld(2*i+1, m2+1, r2); cmb(i); } void app(int i, int x) { st[i][0]+=x; lz[i]+=x; } void upd(int l1, int r1, int x, int i=1, int l2=0, int r2=h*w-1) { if(!st[1][1]) { b[l1]+=x; b[r1+1]-=x; return; } if(l1<=l2&&r2<=r1) { app(i, x); return; } int m2=(l2+r2)/2; app(2*i, lz[i]); app(2*i+1, lz[i]); lz[i]=0; if(l1<=m2) upd(l1, r1, x, 2*i, l2, m2); if(m2<r1) upd(l1, r1, x, 2*i+1, m2+1, r2); cmb(i); } void cs(int x, int y, int z) { vector<int> v; for(int d=!x-1; d<(x<h); ++d) for(int e=!y-1; e<(y<w); ++e) v.push_back(a[x+d][y+e]); sort(v.begin(), v.end()); upd(v[0], (v.size()>1?v[1]:h*w)-1, z); if(v.size()>2) upd(v[2], v[3]-1, z); } void give_initial_chart(int h, int w, vector<int> r, vector<int> c) { ::h=h; ::w=w; ::r=r; ::c=c; a=vector<vector<int>>(h, vector<int>(w)); for(int i=0; i<h*w; ++i) a[r[i]][c[i]]=i; for(int i=0; i<=h; ++i) for(int j=0; j<=w; ++j) cs(i, j, 1); for(int i=0; i<h*w; ++i) b[i+1]+=b[i]; bld(); } int swap_seats(int x, int y) { vector<ar<int, 2>> v; for(int i : {x, y}) for(int d : {0, 1}) for(int e : {0, 1}) v.push_back({r[i]+d, c[i]+e}); sort(v.begin(), v.end()); v.resize(unique(v.begin(), v.end())-v.begin()); for(auto a : v) cs(a[0], a[1], -1); swap(a[r[x]][c[x]], a[r[y]][c[y]]); swap(r[x], r[y]); swap(c[x], c[y]); for(auto a : v) cs(a[0], a[1], 1); return st[1][1]; }
#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...