Codeforces Round #419 (Div. 1), problem: (E) Karen and Neighborhood Solution In C/C++

#include <bits/stdc++.h>
using namespace std;

typedef pair<long long,long long> ii;

long long n,k,i,w,res;
long long m[65];
map <long long,long long> num,f,c;

long long get(long long t) {
if (f[t]>=0) return f[t];
f[t]=get((t-1)/2)+get(t/2);
if (c[t]==1) f[t]++;
return f[t];
}

void cal(long long t) {
if (c[t]==1) k–;
if (k==0) {
res+=(t-1)/2+1;
return;
}

if (f[(t-1)/2]>=k) cal((t-1)/2);
else {
res+=t-(t/2);
k-=f[(t-1)/2];
cal(t/2);
}
}

int main() {
#ifndef ONLINE_JUDGE
freopen(“815E.inp”,”r”,stdin);
freopen(“815E.out”,”w”,stdout);
#endif // ONLINE_JUDGE

scanf(“%lld %lld”,&n,&k);

if (k==1) {
printf(“1”);
return 0;
}
if (k==2) {
printf(“%lld”,n);
return 0;
}

k-=2; n-=2;

for (i=1;i<=60;i++) {
if (i==1) {
m[1]=n;
num[n]=1;
}
else {
m[i]=(m[i-1]-1)/2;
num[m[i]]+=num[m[i-1]];
num[m[i-1]/2]+=num[m[i-1]]+num[m[i-1]+1];
num[m[i]+1]+=num[m[i-1]+1];
}
f[m[i]]=-1; f[m[i]+1]=-1;
if (m[i]==0) break;
}
num[0]=0;
num[1]+=num[2];
num[2]=0;

for (i=1;i<=60;i++) {
if (k<=num[m[i]]+num[m[i]+1]) {
if (m[i]%2==1) {
c[m[i]]=1;
c[m[i]+1]=1;
}
else {
if (k<=num[m[i]+1]) c[m[i]+1]=1;
else c[m[i]]=1,k-=num[m[i]+1];
}
break;
}
else k-=num[m[i]]+num[m[i]+1];
}
if (c[1]==1) c[2]=1;
f[0]=0;
get(n);
cal(n);
printf(“%lld”,res+1);
}

(Visited 14 times, 1 visits today)

About the Author:

Leave A Comment