Submission #1290734

#TimeUsernameProblemLanguageResultExecution timeMemory
1290734Math4Life2020Seats (IOI18_seats)C++20
0 / 100
4096 ms39964 KiB
#include "seats.h" #include <bits/stdc++.h> using namespace std; using ll = int; using pii = pair<ll,ll>; const ll INF = 5e8; vector<vector<ll>> vals; vector<pii> locs; // pii fz(pii p1, pii p2) { // if (p1.first<p2.first) { // return p1; // } // if (p2.first<p1.first) { // return p2; // } // assert(p1.first==p2.first); // return {p1.first,p1.second+p2.second}; // } // struct Node { // ll xl=-1; ll xr=-1; // Node *l=nullptr,*r=nullptr; // pii val = {INF,-1}; //val, qty: store min value in subtree and multiplicity // ll lz = 0; //lazy tag: applied to this but not to children // Node(){}; // Node(ll _xl, ll _xr) { // xl = _xl; xr = _xr; // val = {0,xr-xl+1}; // if (xl!=xr) { // ll xm = (xl+xr)/2; // l = new Node(xl,xm); // r = new Node(xm+1,xr); // } // } // void pdn() { // if (xl==xr) { // lz=0; return; // } // l->val.first += lz; // l->lz += lz; // r->val.first += lz; // r->lz += lz; // lz = 0; // } // void lft() { // assert(lz==0); // if (xl==xr) { // return; // } // val = fz(l->val,r->val); // } // void appl(ll ql, ll qr, ll v) { //change ql,qr by v // if (qr<xl || ql>xr) { // return; // } // pdn(); // if (ql<=xl && xr<=qr) { // val.first+=v; // lz+=v; // return; // } // assert(xl!=xr); // l->appl(ql,qr,v); // r->appl(ql,qr,v); // lft(); // } // ll extr() { // //cout << "val = "<<val.first<<", "<<val.second<<"\n"; // assert(val.first>=4); // if (val.first==4) { // return val.second; // } // return 0; // } // }; // Node* root = new Node(); vector<ll> vf; void appl(ll a, ll b, ll v) { for (ll x=a;x<=b;x++) { vf[x]+=v; } } ll extr() { ll ans = 0; for (ll x: vf) { assert(x>=4); if (x==4) { ans++; } } return ans; } void prc(ll x, ll y, ll v) { //process square; determine whether to add or subtract //cout << "prc: x,y="<<x<<","<<y<<"\n"; vector<ll> v0; v0.push_back(vals[x][y]); v0.push_back(vals[x][y+1]); v0.push_back(vals[x+1][y]); v0.push_back(vals[x+1][y+1]); sort(v0.begin(),v0.end()); assert(v0[0]<v0[1]); //cout << "apply add to: "<<v0[0]<<","<<(v0[1]-1)<<"\n"; // root->appl(v0[0],v0[1]-1,v); appl(v0[0],v0[1]-1,v); } void psq(ll x, ll y, ll v) { //center x,y prc(x-1,y-1,v); prc(x,y-1,v); prc(x-1,y,v); prc(x,y,v); } void give_initial_chart(int H, int W, vector<int> R, vector<int> C) { //ll vals[H+2][W+2]; vals = vector<vector<ll>> (H+2,vector<ll>(W+2,-1)); for (int h=0;h<(H+2);h++) { for (int w=0;w<(W+2);w++) { vals[h][w]=H*W; } } //pii locs[H*W]; ll N = H*W; locs = vector<pii>(N); for (ll i=0;i<N;i++) { locs[i]={R[i]+1,C[i]+1}; vals[R[i]+1][C[i]+1]=i; } //root = new Node(0,N-1); vf = vector<ll>(N,0); for (ll h=0;h<(H+1);h++) { for (ll w=0;w<(W+1);w++) { prc(h,w,1); } } //cout << (root->extr()) <<"=ival\n"; } int swap_seats(int a, int b) { psq(locs[a].first,locs[a].second,-1); psq(locs[b].first,locs[b].second,-1); swap(locs[a],locs[b]); vals[locs[a].first][locs[a].second]=a; vals[locs[b].first][locs[b].second]=b; psq(locs[a].first,locs[a].second,1); psq(locs[b].first,locs[b].second,1); //return (root->extr()); return extr(); }
#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...