Submission #718523

# Submission time Handle Problem Language Result Execution time Memory
718523 2023-04-04T09:24:47 Z myrcella Sorting (IOI15_sorting) C++17
20 / 100
323 ms 405024 KB
//by szh
#include<bits/stdc++.h>
#include <unordered_map>
using namespace std;

#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<long long,long long>
#define pb push_back
#define debug(x) cerr<<#x<<"="<<x<<endl
#define pq priority_queue
#define inf 0x3f
#define rep(i,a,b) for (int i=a;i<(b);i++)
#define MP make_pair
#define SZ(x) (int(x.size()))
#define ll long long
#define mod 1000000007
#define ALL(x) x.begin(),x.end()
void inc(int &a,int b) {a=(a+b)%mod;}
void dec(int &a,int b) {a=(a-b+mod)%mod;}
int lowbit(int x) {return x&(-x);}
ll p0w(ll base,ll p) {ll ret=1;while(p>0){if (p%2ll==1ll) ret=ret*base%mod;base=base*base%mod;p/=2ll;}return ret;}

#include "sorting.h"

const int maxn = 6e5+10;

int n,m;
int a[maxn],b[maxn];
pii ans[maxn];
pii p[maxn];
deque <int> q[maxn];
int id[maxn];
pii pos[maxn];	
map <pii,int> cntt;
vector <pii> nxt1,nxt2;
pii qid[maxn];

void update(int x,int y,int val) {
	if (pos[x].fi!=pos[x].se) {
		pii tmp = {min(pos[x].fi,pos[x].se),max(pos[x].fi,pos[x].se)};
		cntt[tmp]+=val;
		int hi = cntt[tmp];
		if (hi==1) nxt1.pb(tmp);
		else if (hi==2) nxt2.pb(tmp);
	}
	if (pos[y].fi!=pos[y].se) {
		pii tmp = {min(pos[y].fi,pos[y].se),max(pos[y].fi,pos[y].se)};
		cntt[tmp]+=val;
		int hi = cntt[tmp];
		if (hi==1) nxt1.pb(tmp);
		else if (hi==2) nxt2.pb(tmp);
	}
}
 
bool check(int cnt) {
	cntt.clear();
	while (!nxt1.empty())nxt1.pop_back();
	while (!nxt2.empty())nxt2.pop_back();
	rep(i,0,n) {
		while (!q[i].empty()) q[i].pop_back();
		q[i].pb(i);
		id[i] = i;
		b[i] = a[i];
	}
	rep(i,0,cnt) {
		int x=p[i].fi,y=p[i].se;
		q[id[x]].pb(y);
		q[id[y]].pb(x);
		swap(id[x],id[y]);
		qid[i] = {id[x],id[y]};
	}
	rep(i,0,n) {
		pos[q[i].back()].fi = q[i].front();
		pos[a[i]].se = i;
	}
	rep(i,0,n) if (pos[i].fi!=pos[i].se) {
		pii tmp = {min(pos[i].fi,pos[i].se),max(pos[i].fi,pos[i].se)};
		cntt[tmp]++;
		if (cntt[tmp]==2) nxt2.pb(tmp);
		else nxt1.pb(tmp);
	}
	rep(i,0,cnt) {
		int x = p[i].fi,y=p[i].se;
		swap(b[x],b[y]);
		update(b[x],b[y],-1);
		pos[b[x]].se = x,pos[b[y]].se = y;
		update(b[x],b[y],1);
		
		update(q[qid[i].fi].back(),q[qid[i].se].back(),-1);
		q[qid[i].fi].pop_front(),q[qid[i].se].pop_front();
		pos[q[qid[i].fi].back()].fi = q[qid[i].fi].front();
		pos[q[qid[i].se].back()].fi = q[qid[i].se].front();
		update(q[qid[i].fi].back(),q[qid[i].se].back(),1);
		
		pii cur = {0,0};
		while (!nxt2.empty() and cntt[nxt2.back()]!=2) nxt2.pop_back();
		while (!nxt1.empty() and cntt[nxt1.back()]!=1) nxt1.pop_back();
		if (!nxt2.empty()) cur = nxt2.back();
		else if (!nxt1.empty()) cur = nxt1.back();
		x = cur.fi,y=cur.se;
		swap(b[x],b[y]);
		update(b[x],b[y],-1);
		pos[b[x]].se = x,pos[b[y]].se = y;
		update(b[x],b[y],1);
		ans[i] = cur;
		if (cur.fi==cur.se) return true;
		while (!nxt2.empty() and cntt[nxt2.back()]!=2) nxt2.pop_back();
		while (!nxt1.empty() and cntt[nxt1.back()]!=1) nxt1.pop_back();
		if (nxt1.empty() and nxt2.empty()) return true;
	}
	return false;
}
 
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	n = N,m= M;
    int l=0,r=M;
    rep(i,0,n) a[i] =S[i];
    rep(i,0,M) p[i] = {X[i],Y[i]};
    while (l<r) {
		int mid=l+r>>1;
		if (check(mid)) r = mid;
		else l = mid+1;
	}
	assert(check(l));
	rep(i,0,l) P[i] = ans[i].fi, Q[i] = ans[i].se;
	return l;
}

Compilation message

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:122:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  122 |   int mid=l+r>>1;
      |           ~^~
# Verdict Execution time Memory Grader output
1 Correct 229 ms 404228 KB Output is correct
2 Correct 229 ms 404240 KB Output is correct
3 Correct 230 ms 404260 KB Output is correct
4 Correct 231 ms 404236 KB Output is correct
5 Correct 231 ms 404172 KB Output is correct
6 Correct 239 ms 404164 KB Output is correct
7 Correct 239 ms 404228 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 229 ms 404228 KB Output is correct
2 Correct 229 ms 404240 KB Output is correct
3 Correct 230 ms 404260 KB Output is correct
4 Correct 231 ms 404236 KB Output is correct
5 Correct 231 ms 404172 KB Output is correct
6 Correct 239 ms 404164 KB Output is correct
7 Correct 239 ms 404228 KB Output is correct
8 Correct 230 ms 404228 KB Output is correct
9 Correct 225 ms 404228 KB Output is correct
10 Correct 234 ms 404228 KB Output is correct
11 Correct 323 ms 404304 KB Output is correct
12 Correct 232 ms 404344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 232 ms 404228 KB Output is correct
2 Correct 233 ms 404260 KB Output is correct
3 Correct 259 ms 404296 KB Output is correct
4 Correct 234 ms 404240 KB Output is correct
5 Correct 234 ms 404316 KB Output is correct
6 Incorrect 228 ms 404240 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 229 ms 404228 KB Output is correct
2 Correct 229 ms 404240 KB Output is correct
3 Correct 230 ms 404260 KB Output is correct
4 Correct 231 ms 404236 KB Output is correct
5 Correct 231 ms 404172 KB Output is correct
6 Correct 239 ms 404164 KB Output is correct
7 Correct 239 ms 404228 KB Output is correct
8 Correct 230 ms 404228 KB Output is correct
9 Correct 225 ms 404228 KB Output is correct
10 Correct 234 ms 404228 KB Output is correct
11 Correct 323 ms 404304 KB Output is correct
12 Correct 232 ms 404344 KB Output is correct
13 Correct 232 ms 404228 KB Output is correct
14 Correct 233 ms 404260 KB Output is correct
15 Correct 259 ms 404296 KB Output is correct
16 Correct 234 ms 404240 KB Output is correct
17 Correct 234 ms 404316 KB Output is correct
18 Incorrect 228 ms 404240 KB Output isn't correct
19 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 317 ms 404788 KB Output is correct
2 Correct 286 ms 404700 KB Output is correct
3 Incorrect 310 ms 405024 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 317 ms 404788 KB Output is correct
2 Correct 286 ms 404700 KB Output is correct
3 Incorrect 310 ms 405024 KB Output isn't correct
4 Halted 0 ms 0 KB -