This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "seats.h"
#include <bits/stdc++.h>
#define N 1000005
using namespace std;
set<int> sr[N],sc[N];
vector<int> r,c;
int h,w;
void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
h = H;
w = W;
r = R;
c = C;
for(int i = 0;i<h*w;i++){
sr[r[i]].insert(i+1);
sc[c[i]].insert(i+1);
}
}
int swap_seats(int a, int b) {
if(a > b)swap(a,b);
sr[r[a]].erase(a+1);
sc[c[a]].erase(a+1);
sr[r[b]].erase(b+1);
sc[c[b]].erase(b+1);
swap(r[a],r[b]);
swap(c[a],c[b]);
sr[r[a]].insert(a+1);
sc[c[a]].insert(a+1);
sr[r[b]].insert(b+1);
sc[c[b]].insert(b+1);
vector<pair<int,int>> rlen,clen;
vector<pair<int,int>> stdec,stinc;
for(int i = h-1;i>=0;i--){
int num = *sr[i].begin();
while(stdec.size() && stdec.back().first > num){
stdec.pop_back();
}
stdec.push_back({num,i});
}
for(int i = 0;i<h;i++){
int num = *sr[i].begin();
while(stinc.size() && stinc.back().first > num){
stinc.pop_back();
}
stinc.push_back({num,i});
}
// cout << "stdec: " << endl;
// for(auto u:stdec){
// cout << u.first << " " << u.second << endl;
// }
// cout << "stinc: " << endl;
// for(auto u:stinc){
// cout << u.first << " " << u.second << endl;
// }
int pt1 = 0,pt2 = 0;
rlen.push_back({1,stinc[pt2].second - stdec[pt1].second + 1});
while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
pt2++;
rlen.push_back({stinc[pt2].first,stinc[pt2].second - stdec[pt1].second + 1});
}
else{
pt1++;
rlen.push_back({stdec[pt1].first,stinc[pt2].second - stdec[pt1].second + 1});
}
}
stdec.clear(),stinc.clear();
for(int i = w-1;i>=0;i--){
int num = *sc[i].begin();
while(stdec.size() && stdec.back().first > num){
stdec.pop_back();
}
stdec.push_back({num,i});
}
for(int i = 0;i<w;i++){
int num = *sc[i].begin();
while(stinc.size() && stinc.back().first > num){
stinc.pop_back();
}
stinc.push_back({num,i});
}
pt1 = 0,pt2 = 0;
clen.push_back({1,stinc[pt2].second - stdec[pt1].second + 1});
while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
pt2++;
clen.push_back({stinc[pt2].first,stinc[pt2].second - stdec[pt1].second + 1});
}
else{
pt1++;
clen.push_back({stdec[pt1].first,stinc[pt2].second - stdec[pt1].second + 1});
}
}
// cout << "hey" << endl;
// for(auto u:rlen){
// cout << u.first << " " << u.second << endl;
// }
// cout << endl;
// for(auto u:clen){
// cout << u.first << " " << u.second << endl;
// }
//cout << "hey" << endl;
int ans = 0;
for(int i = 0;i<rlen.size();i++){
int l = rlen[i].first,r = h*w;
if(i + 1 != rlen.size())
r = rlen[i+1].first - 1;
int pos = (l + rlen[i].second-1) / rlen[i].second * rlen[i].second;
while(pos <= r){
int len = pos / rlen[i].second;
//cout << rlen[i].first << " " << rlen[i].second << " " << pos << " " << len << endl;
if(prev(upper_bound(clen.begin(),clen.end(),make_pair(pos+1,0)))->second == len)
ans++;
pos += rlen[i].second;
}
}
return ans;
}
Compilation message (stderr)
seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:68:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:68:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:69:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:69:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:100:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
100 | while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:100:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
100 | while(pt1 + 1 != stdec.size() || pt2 + 1 != stinc.size()){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:101:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
101 | if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:101:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
101 | if(pt1 + 1 == stdec.size() || (pt2 + 1 != stinc.size() && stdec[pt1+1].first > stinc[pt2+1].first)){
| ~~~~~~~~^~~~~~~~~~~~~~~
seats.cpp:124:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
124 | for(int i = 0;i<rlen.size();i++){
| ~^~~~~~~~~~~~
seats.cpp:126:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
126 | if(i + 1 != rlen.size())
| ~~~~~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |