Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
хотелось поломать голову и познакомится с чем-нибудь новым
O(n) = nlogn
inline int read_int()
{
register int c = getchar_unlocked();
int x = 0;
int neg = 0;
if(c=='-')
{
neg = 1;
c = getchar_unlocked();
}
for(; '0'<=c && c<='9' ; c = getchar_unlocked()) {
x = (x<<1) + (x<<3) + c - '0';
}
return neg ? -x : x;
}
Забавно смотреть на ваши оптимизации, расположенные по соседству со считыванием через cin
зачем в цикле считать битыЛюбое число — совокупность бит. В угоду производительности, там где это оправданно, а в этом случае это оправданно — можно и биты посчитать. К тому же решение весьма простое и абстракция в виде функции несомненно проста в использовании и потому эффективна.
и не стоит игнорировать ихТезис верный, но не стоит принимать его за аксиому. Всему свое место и там где уместно использование готовых функций конечно же не стоит городить велосипеды.
5 — 6 битовых операций это не так сложноне понимаю тогда чем решение, предложенное мной, сложно.
результат := 0
текБит := максБит()
пока текБит ≠ 0
новРез := результат + текБит
если новРез <= Б
то результат := новРез
текБит >>= 1
результатА := 0
текБит := максБит()
пока текБит ≠ 0
новРезБ := результатА + текБит
новРезА := результатА + текБит − 1
если новРезБ > R то
ничего не делать
иначе если новРезА < L то
результатА := новРезБ
иначе
результатА := новРезА
результатБ := новРезБ
стоп
текБит >>= 1
результатБ := результатА // перестраховка
int maxxor(int a,int b){
int c=a^b;
if(c<0) c=max(~a,b);
while(c&(c+1)) c|=c>>1;
return c;
}
for(k=1;c&(c+1);k<<=1) c|=c>>k;
int maxxor(int L,int R){
int c=L^R;
int d=~L|R;
c=(c|(c>>31))&(d|(d>>31));
c|=c>>1;
c|=c>>2;
c|=c>>4;
c|=c>>8;
return c|(c>>16);
}
int maxXor(int l, int r) {
unsigned q = l ^ r;
int t = 0;
while(q >> 1) {
t++;
q>>=1;
}
// заполняем все единичками. 2^(t-1) - 1
return (1u<<(t+1)) - 1;
}
Максимальное XOR