제출 #1290255

#제출 시각아이디문제언어결과실행 시간메모리
1290255ackhava자리 배치 (IOI18_seats)C++20
0 / 100
419 ms86564 KiB
#include "seats.h" #include <bits/stdc++.h> #define pb push_back #define fi first #define se second using namespace std; std::vector<int> r; struct segment_tree{ vector<pair<pair<int,int>,pair<int,int>>> vec; pair<pair<int,int>,pair<int,int>> e = {{1e8,-1}, {1e8,-1}}; pair<pair<int,int>,pair<int,int>> merge(pair<pair<int,int>,pair<int,int>> a, pair<pair<int,int>,pair<int,int>> b){ return {{min(a.fi.fi,b.fi.fi), max(a.fi.se,b.fi.se)},{min(a.se.fi,b.se.fi), max(a.se.se,b.se.se)}}; } void update(int pos, int l, int r, int q, pair<int,int> v){ if(r < q)return; if(l > q)return; if(l==r){ vec[pos] = {{v.fi,v.fi},{v.se,v.se}}; return; } int m = (l+r)/2; update(pos*2+1,l,m,q,v); update(pos*2+2,m+1,r,q,v); vec[pos] = merge(vec[pos*2+1],vec[pos*2+2]); } pair<pair<int,int>,pair<int,int>> query(int pos, int l, int r, int ql, int qr){ if(r < ql)return e; if(l > qr)return e; if(ql <= l && r <= qr)return vec[pos]; int m = (l+r)/2; return merge(query(pos*2+1,l,m,ql,qr),query(pos*2+2,m+1,r,ql,qr)); } }; segment_tree segtree; vector<int> R,C; int H,W; int N; set<int> valid; void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { ::R=R; ::C=C; ::H=H; ::W=W; ::N=H*W; segtree.vec.resize(4*N+100, segtree.e); for(int i=0;i<(N);i++){ segtree.update(0,0,N,i,{R[i],C[i]}); auto res = segtree.query(0,0,N,0,i); // cerr<<i<<": "<<res.fi.fi<<" "<<res.fi.se<<" "<<res.se.fi<<" "<<res.se.se<<"\n"; if(((res.fi.se-res.fi.fi+1)*(res.se.se-res.se.fi+1)) == (i+1)){ valid.insert(i); } } } int swap_seats(int a, int b) { if(a > b)swap(a,b); while(valid.lower_bound(a) != valid.upper_bound(b))valid.erase(valid.lower_bound(a)); swap(R[a],R[b]); swap(C[a],C[b]); int i=a; while(i<=b){ segtree.update(0,0,N,i,{R[i],C[i]}); auto res = segtree.query(0,0,N,0,i); if(((res.fi.se-res.fi.fi+1)*(res.se.se-res.se.fi+1)) == (i+1)){ valid.insert(i); } i = max(((res.fi.se-res.fi.fi+1)*(res.se.se-res.se.fi+1))-1,i+1); } // valid.clear(); // for(int i=0;i<(N);i++){ // segtree.update(0,0,N,i,{R[i],C[i]}); // auto res = segtree.query(0,0,N,0,i); // // cerr<<i<<": "<<res.fi.fi<<" "<<res.fi.se<<" "<<res.se.fi<<" "<<res.se.se<<"\n"; // if(((res.fi.se-res.fi.fi+1)*(res.se.se-res.se.fi+1)) == (i+1)){ // valid.insert(i); // } // } return valid.size(); }
#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...