ああ...
トピックリンクします。https://www.luogu.org/problem/P5057
この質問は、最初ので間違いなくバイナリに関連し、0と1のみ発見されました。この質問は間隔をサポートする必要があり、その後、最初に考えたのは、排他的または意味の違い配列ですので、変更とクエリ操作の単一のポイントを発見したので、彼は彼自身の差動アレー、本当に良い書き込み、しかし非常に遅い(私は書かないでも書きました優れた)、以下は、排他的または意味5の下のコードの違いです。
1の#include <cstdioを> 2の#include <iostreamの> 3 4 使用して 名前空間STDを、 5 6 INT [ 100005 ]、B [ 100005 ]。 7 8 INT メイン(){ 9 int型N、M、T、L、R、X。 10 のscanf(" %D%dの"、&N、&M)。 11 のために(int型 i = 1 ; iが<= N; iが++)B [I] = [I] ^ [I - 1 ]。 12 のためには、(int型、I = 1 ; I <= M、I ++){ 13 のscanf(" %dの"、&T)。 14 であれば(Tの== 1 ){ 15 のscanf(" %dの%のD "、&L&R)。 16件の B [L] ^ = 1 ; 17件の B [R + 1 ] ^ = 1 ; 18 のために(int型 i = 1 ; iが<= N; iが++ ) 19 [I] = [I - 1 ] ^ Bを[I]。 20 } 21 他{ 22 のscanf(" %dの"、およびX) 23 のprintf(" %d個の\ n " 、[X])。 24 } 25 } 26 リターン 0 。 27 } 28
もちろん、私は時間の複雑性O(MN)、そのタイムアウトの違いについて書きました...
正の解は、ツリーの変更間隔と配列が問い合わせの単一ポイントをサポートするため、ツリーを維持するためにアレイを使用することです。お問い合わせのシングルポイントの後、また、ほとんどの魔法の場所のタイトルであることに注意してください、小数点以下2%のクエリは、あなたが最後の一つは(も奇数の動作が変更されますように、そのバイナリへの答えに理解することができますされて得ることができ、偶数回操作は変更されません)
ACコード:
書式#include <cstdioを> する#include <iostreamの> 使用して名前空間はstdを、int型、N、T [ 1000005 ]。 インラインINT lowbit(INT X){ 戻り X& - X。 } // lowbit インラインボイド変化(int型のx、int型K){ 一方(X <= N){ T [X] + = K。 X + = lowbit(X)。 } を返します。 } // 区间更改 インラインint型チェック( INT X){ int型 ANS = 0 。 一方、(X> 0 ){ ANS + = T [X]。 X - = lowbit(X)。 } 戻りANS。 } // 单点查询 INT のmain(){ int型のM、L、R、F、D。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 1 ; I <= M; iは++ ){ scanf関数(" %のD "、&F)。 もし ==(F1 ){ scanf関数(" %dの%のD "、&L&R)。 変更(L、1 )。 変更(R + 1、 - 1 )。 } 他{ scanf関数(" %のD "、&D)。 printf(" %Dを\ n "、チェック(D)%2)。// 核心 } } の戻り 0 ; }