#include "treasure.h"
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pll pair<ll, ll>
#define vll vector<ll>
#define pb push_back
typedef long long ll;
namespace{
const ll mxN=4e4;
const ll mxM=1e9+2;
const ll LOG=21;
struct BIT{
vll tree;
ll siz;
void init(ll sz){
siz=sz+1;
tree=vll(siz, 0);
}
void update(ll idx, ll val){
idx++;
for(;idx<siz;idx+=(idx&(-idx))){
tree[idx]+=val;
}
}
ll getpre(ll idx){
idx++;
ll re=0;
for(;idx>0;idx-=(idx&(-idx))){
re+=tree[idx];
}
return re;
}
ll getsum(ll a, ll b){
return getpre(b)-getpre(a-1);
}
ll bs(ll tar){ // find last smaller or equal to tar
ll sum=0;
ll pt=0;
for(ll i=LOG-1;i>=0;i--){
ll add=(1LL<<i);
if(pt+add>=siz) continue;
if(sum+tree[pt+add]<=tar){
pt+=add;
sum+=tree[pt];
}
}
return pt-1;
}
};
}
vector<int> encode(vector<pair<int, int>> P) {
ll n=P.size();
vector<int> re;
vector<pll> con1, con2;
for(ll i=0;i<n;i++){
con1.pb({P[i].F, i});
con2.pb({P[i].S, i});
}
// sort(P.begin(), P.end());
sort(con1.begin(), con1.end());
sort(con2.begin(), con2.end());
// con1.erase(unique(con1.begin(), con1.end()), con1.end());
// con2.erase(unique(con2.begin(), con2.end()), con2.end());
// auto id1=[&](ll tar){
// return lower_bound(con1.begin(), con1.end(), tar)-con1.begin();
// };
// auto id2=[&](ll tar){
// return lower_bound(con2.begin(), con2.end(), tar)-con2.begin();
// };
for(auto &it:con1){
re.pb((int) it.F*2);
}
for(auto &it:con2){
re.pb((int) it.F*2+1);
}
vector<pll> cor(n);
for(ll i=0;i<n;i++){
cor[con1[i].S].F=i;
}
for(ll i=0;i<n;i++){
cor[con2[i].S].S=i;
}
vll perm(n);
for(ll i=0;i<n;i++){
ll idx=con1[i].S;
perm[i]=cor[idx].S;
}
ll pt=mxM;
ll siz=n;
BIT bit;
bit.init(n);
for(ll i=0;i<n;i++){
bit.update(i, 1);
}
// vector<bool> done(n);
auto id=[&](ll tar){
return bit.getsum(0, tar-1);
// ll cnt=0;
// for(ll i=0;i<tar;i++){
// if(!done[i]) cnt++;
// }
// return cnt;
};
for(ll i=0;i<n;i++){
re.pb(pt+id(perm[i]));
bit.update(perm[i], -1);
pt+=siz;
siz--;
}
// for(auto &it:re){
// cout<<it<<' ';
// }
// cout<<'\n';
return re;
}
vector<pair<int, int>> decode(vector<int> S) {
vll con1, con2, con3;
for(auto &it:S){
if(it<mxM){
if(it%2==0){
con1.pb(it/2);
}
else{
con2.pb(it/2);
}
}
else{
con3.pb(it);
}
}
sort(con1.begin(), con1.end());
sort(con2.begin(), con2.end());
sort(con3.begin(), con3.end());
ll n=con3.size();
vector<pair<int, int>> re;
ll pt=mxM;
ll siz=n;
BIT bit;
bit.init(n);
for(ll i=0;i<n;i++){
bit.update(i, 1);
}
// vector<bool> done(n);
auto f=[&](ll idx){
return bit.bs(idx)+1;
};
for(ll i=0;i<n;i++){
ll cur=con3[i];
cur-=pt;
ll tep=f(cur);
bit.update(tep, -1);
re.pb({(int) con1[i], (int) con2[tep]});
pt+=siz;
siz--;
}
return re;
// return {0, 0};
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |