Submission #1254078

#TimeUsernameProblemLanguageResultExecution timeMemory
1254078JuanJLBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
2322 ms96404 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i< b; i++)
#define mset(a,v) memset(a,v,sizeof(a))
#define FIN ios::sync_with_stdio(0); cout.tie(0); cin.tie(0); 
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef tree<pair<ll,ll>,null_type,less<pair<ll,ll>>,rb_tree_tag,tree_order_statistics_node_update> iset;

#define INF (ll)100000000000000000

struct STree{
	ll n;
	vector<ll> st;
	vector<ll> lazy;
	STree(ll n): n(n), st(4*n+5,-INF), lazy(4*n+5,0) {}
	void push(ll k, ll l, ll r){
		if(lazy[k]==0) return;
		st[k]+=lazy[k];
		if(l+1!=r){
			lazy[2*k]+=lazy[k];
			lazy[2*k+1]+=lazy[k];
		}
		lazy[k]=0;
	}
	void upd(ll k , ll l , ll r, ll  L ,ll R, ll v){
		push(k,l,r);
		if(l>=R||r<=L) return;
		
		if(l>=L&&r<=R){
			lazy[k]+=v;
			push(k,l,r);
			return;
		}
		ll mid = (l+r)/2;
		upd(2*k,l,mid,L,R,v); upd(2*k+1,mid,r,L,R,v);
		st[k]=max(st[2*k],st[2*k+1]);
	}
	
	ll query(ll k, ll l, ll r, ll L, ll R){
		push(k,l,r);
		if(l>=R||r<=L) return -2*INF;
		if(l>=L&&r<=R) return st[k];
		ll mid = (l+r)/2;
		return max(query(2*k,l,mid,L,R),query(2*k+1,mid,r,L,R));
	}
	void upd(ll l ,ll r, ll v){ upd(1,0,n,l,r,v); }
	ll query(ll l ,ll r){ return query(1,0,n,l,r); }
};

vector<pair<ll,ll>> vals; 
ll ind(pair<ll,ll> x){ return lower_bound(ALL(vals),x)-vals.begin(); }

std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){

	vector<int> nA = A;
	vector<int> res;
	
	
	forn(i,0,SZ(A)) vals.pb({A[i],i});
	forn(i,0,SZ(X)) vals.pb({V[i],X[i]});
	
	sort(ALL(vals));
	vals.erase(unique(ALL(vals)), vals.end());
	
	STree st(SZ(vals));
	//forn(j,0,SZ(vals)) cout<<st.query(j,j+1)<<" "; cout<<'\n';
	
	forn(i,0,SZ(A)){
		ll I = ind({A[i],i});
		st.upd(I,I+1,INF+i);
		st.upd(I+1,SZ(vals),-1);
		//forn(j,0,SZ(vals)) cout<<st.query(j,j+1)<<" "; cout<<'\n';
	}
//	cout<<"------------------\n";
//	
//	forn(j,0,SZ(vals)) cout<<st.query(j,j+1)<<" "; cout<<'\n';
	
	forn(i,0,SZ(X)){
		ll I = ind({A[X[i]],X[i]});
		st.upd(I,I+1,-(INF+X[i]));
		st.upd(I+1,SZ(vals),+1);
		I = ind({V[i],X[i]});
		st.upd(I,I+1,INF+X[i]);
		st.upd(I+1,SZ(vals),-1);
		res.pb(st.query(0,SZ(vals)));
//		forn(j,0,SZ(vals)) cout<<st.query(j,j+1)<<" "; cout<<'\n';
		A[X[i]]=V[i];
	}
	
//	forn(i,0,SZ(A)) is.insert({i,A[i]});
//	
//	iset nis;
//	
//	
//	vector<ll> cnt(SZ(A));
//	ll rres = 0;
//	
//	for(auto i:is){
//		nis.insert({i.snd,i.fst});
//		//cout<<i.snd<<" "<<ll(SZ(nis)-(nis.order_of_key({i.snd,i.fst})+1))<<'\n';
//		cnt[i.fst]=ll(SZ(nis)-(nis.order_of_key({i.snd,i.fst})+1));
//	}


//	forn(i,0,SZ(X)){
//		//is.erase(is.find({X[i],nA[X[i]]}));
//		
//		//is.insert({X[i],nA[X[i]]});
//		rres=0;
//		cnt[X[i]]=0;
//		forn(j,0,SZ(A)){
//			if(j>X[i]){
//				if(nA[X[i]]>nA[j]){
//					if(V[i]<=nA[j]) cnt[j]--;
//				}else{
//					if(V[i]>nA[j]) cnt[j]++;
//				}
//			}else{
//				if(j!=X[i] && nA[j]>V[i]) cnt[X[i]]++;
//			}
//			//cout<<cnt[j]<<" ";
//			rres=max(rres,cnt[j]);
//		}
//		
//		nA[X[i]]=V[i];
//		res.pb(rres);
//	}
//	
	
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...