2019 ICPC中国南昌ナショナルインビテーショナル国際シルクロードプログラミングコンテスト - F.Sequence(+演奏テーブルセグメント木)

質問意図されている:あなたの長さの配列のN- $ $、関数$ F(L、R)の定義= A_ {1} \ oplus A_ {L + 1} \ oplus ... \ oplus A_ {R} $、$を与えますF(L、R)は、F(L、L)\ oplusのF(L、L + 1)\ oplus ... \ F(L、R)oplus \ oplusのF(L + 1、L + 1)\ oplus = (L + 1、R)\ oplus ... \ F oplus(R、R)$ F、二つの動作があり、配列内の最初の要素は$ ... [X]の$ $ yはなります$、第2の算出$ F(L、R)$値。

思考:テーブルを再生することが見出された後のみなら$ L $と$ R&LTの$同時に他の場合には奇数又は偶数$ F(L、R)$はない$ 0 $であったが、ある$ F(L、R)$である$ 0 $そして$ F(L、R)は= [L] \ oplus A [L + 2] \ oplus ... \ oplus [R-2] \ oplus A [R] $、2つのクエリが変更を伴うので動作モード、セグメントツリーを維持するために使用され、各ノードは2つの値を維持する:$ $奇数XOR結果の間隔を表すW、間隔は$ $ WW偶数番目のXORの結果を表しました。

ときに最初の成果

  • 奇数番現在のアイテム、$ツリー[K] .W $値を入力し、$ツリー[K] .WW = 0 $する間
  • 現在のアイテムのも、用語、$ツリー[K] .W = 0 $する間$ツリー[K] .WW $値を、入力

操作を変更する場合

  • 奇数用語のエントリを変更する必要性は、その後、$ツリー[k]は変更$を.W
  • 入力項目を修正する必要が、その後も$ツリー[K] .WW $が変更されました

場合は、クエリ操作

  • $ $ Lが奇数の場合は、答えを更新するために$ ANS = ANS \ツリーoplus [K] .W $によって、
  • $ $ Lが偶数であれば、答えを更新するために$ ANS = ANS \ツリーoplus [K] .WW $と

 

書式#include <iostreamの> 
の#include <cstdioを>

使用して 名前空間はstdを、

const  int型 N = 100010 ;

構造体ノード{
     int型のL、R、WW、W。
}。

int型、B、X、Y、年。
ノードツリー[ 4 * N]。

のビルド(int型 K、int型の LEF、int型リグ)
{
    ツリー[K] .L = LEF、ツリー[K] .R = リグ。
    もし(ツリー[K] .L == ツリー[K] .R){
         場合0 ==ツリー[K] .L%2 ){
            ツリー[K] .W = 0、scanf関数(" %のD "、&ツリー[K] .WW)。
        }
        他の{
            ツリー[K] .WW = 0、scanf関数(" %のD "、&ツリー[K] .W)。
        }
        返します
    }
    INT半ば=(LEF +リグ)/ 2 
    構築(K * 2、LEF、半ば)。構築(K * 2 + 1、ミッド+ 1 、リグ)。
    ツリー[K] .W =ツリー[K * 2 ] .W ^ツリー[K * 2 + 1 ] .W。
    ツリー[K] .WW =ツリー[K * 2 ] .WW ^ツリー[K * 2 + 1 ] .WW。
}

無効 change_point(int型のk)
{
    もし(ツリー[K] .L == ツリー[K] .R){
         場合(ツリー[K] .L%2 == 0)ツリー[K] .WW = Y。
        他のツリー[K] .W = Y。
        返します
    }
    INT半ば=(ツリー[K] .L +ツリー[K] .R)/ 2 もし(x <= MID)change_point(2 * K)。
     change_point(2 * K + 1 )。
    ツリー[K] .W =ツリー[ 2 * K] .W ^ツリー[ 2 * K + 1 ] .W。
    ツリー[K] .WW =ツリー[ 2 * K] .WW ^ツリー[ 2 * K + 1 ] .WW。
}

無効 ask_interval(int型のk)
{
    もし(ツリー[K] .L> = &&ツリー[K] .R <= B){
         場合0 ==%2)ANS ^ = ツリー[K] .WW。
        他の ANS ^ = ツリー[K] .W。
        返します
    }
    INT半ば=(ツリー[K] .L +ツリー[K] .R)/ 2 もし(<= MID)ask_interval(2 * K)。
    もし(B> MID)ask_interval(2 * K + 1 )。
}

int型のmain()
{
    INT T、T、N、Q、ICAS = 0 
    scanf関数(" %のD "、&T)。
    一方、(T-- ){
        printf(" ケース#%dの:\ N "、++ ICAS)。
        scanf関数(" %d個の%のD "、&​​N、&Q)、(ビルド11 、n)を。
        一方、(q-- ){
            scanf関数(" %のD "、&T)。
            もし0 == T){
                scanf関数(" %dの%のD "、およびX&Y)。
                change_point(1 )。
            }
            他の{
                ANS = 0、scanf関数(" %D%dの"、&​​、&B)。
                もし(%2 == B%2)ask_interval(1 )。
                printf(" %d個の\ n " 、ANS)。
            }
        }
    }
    リターン 0 ;
}

 

 

おすすめ

転載: www.cnblogs.com/zzzzzzy/p/11706173.html