コーディングウェブサイトソリューションからコードを理解しようとしましたが、多くのことを理解できませんでした。BITとフェンウィックの部分は理解できましたが、理解できなかったものはすべて以下に書き留めました。
このコードのソースはhttp://www.codechef.com/viewsolution/1816336
です。誰かが説明してくれると本当に助かります。標準の定義された入出力関数を使用する代わりに、なぜこれらを使用する傾向があるのかという概念:
char ioSpace[500000 * 17 + 128];
unsigned popcnt(unsigned x)
{
#ifndef ONLINE_JUDGE
return __builtin_popcount(x);
#else
unsigned ret;
asm("popcntl %1, %0;":"=r"(ret) :"r"(x));
return ret;
#endif
}
unsigned readUInt(char*& readPos)
{
unsigned num = 0;
unsigned c;
while ((c = *readPos++) >= '0')
num = num * 10 + (c - '0');
return num;
}
template<unsigned D>
void writeDigit(char*& writePos, unsigned& advance, unsigned& num)
{
unsigned digit = num / D;
num %= D;
if (digit)
advance = 1;
*writePos = digit + '0';
writePos += advance;
}
void writeUInt(char*& writePos, unsigned num)
{
unsigned advance = 0;
writeDigit<100000>(writePos, advance, num);
writeDigit<10000>(writePos, advance, num);
writeDigit<1000>(writePos, advance, num);
writeDigit<100>(writePos, advance, num);
writeDigit<10>(writePos, advance, num);
advance = 1; // for zero number
writeDigit<1>(writePos, advance, num);
*writePos++ = '\n';
}
次に、メイン入力関数で:
read(STDIN_FILENO, ioSpace, sizeof(ioSpace));
私はC++プログラミングにそのようなスタイルを取り入れようとしていて、理解不足のためにそうすることが避けられなかったので、誰かが私に手順全体を説明できますか?