int (または実際には int64) の使用についてコメントしたので、それを書き留めて、それが価値があるかどうかを評価してください。このようなものになります。私の子供たちが土曜日の朝の途方もなくくだらない漫画を見ている間、私はこれをブラウザにぶつけているだけなので、エラーを許してください.
// I'm gonna assume 32-bit ints here. Makes the other maths clearer.
// Sorry about all the '4' and '32' constants =P
const size_t arrLen = 100000 / 4 + 1;
int arr[arrLen];
//This gets filled with your data...
memset((void*)arr, 0, arrLen*4);
cin >> x >> y;
int leftMask = 0xffffffff >> (x % 32); // "(x & 0x1f)" faster?
int rightMask = ~(0x7fffffff >> (y % 32)); // "(y & 0x1f)" faster?
x /= 32; // "x >>= 5" faster?
y /= 32; // "y >>= 5" faster?
if( x == y )
{
// Intersect the masks
leftMask &= rightMask;
arr[x] = (arr[x] & ~leftMask) | (~arr[x] & leftMask);
}
else if( x < y )
{
// Flip the left and right ends
arr[x] = (arr[x] & ~leftMask) | (~arr[x] & leftMask);
arr[y] = (arr[y] & ~rightMask) | (~arr[y] & rightMask);
// Flip everything in between
for( int i = x+1; i < y; i++ ) {
arr[i] ^= 0xffffffff; // Or arr[i] = ~arr[i] -- whichever is faster
}
}
違いがある場合は、上記のループの代替...
// Flip everything in between
for( int *a = arr+x+1, *b = arr+y; a < b; a++ ) {
*a = ~*a;
}
演習は、64 ビット整数で試すことです。個人的には、数ビットしか反転しない場合を除いて、このアプローチは他の何よりも高速であると考えています。
右側のマスクに 1 ビットずつずれているエラーがある可能性があります。誰かがそれを見つけたら、コメントしてください。脳が空っぽ。=)