十二省聯考2019 異或粽子

2022-06-01 09:15:10 字數 1324 閱讀 2738

去年打醬油的時候,我還不會字典樹= =

貌似我\(\require\enclose\)的分都沒拿滿?

洛谷異或?l~r的連續區間?

明顯可以字首和優化

接下來就變成了求前\(k\)大的點對異或值了

看題解得知,這種型別的問題可以這麼解決:

先把所有的字首和插入進一棵字典樹中,注意要插入0

此字典樹需要記錄的資訊有:

1.兩個兒子(常規操作)

2.子樹大小(記錄這條路走下去可以最多選出多少個數)

然後我們可以將每乙個字首和的查詢的最大值插進優先佇列

每次取出最大的乙個,累加答案,然後求出次大的值,放回優先佇列...

迴圈做\(k\)次,就完事了

嗎?no!由於\(s_i \oplus s_j=s_j \oplus s_i\),所以每個較大值會出現兩次,我們要將\(2k\)個較大數累加起來,最後將答案除以二即可

時間複雜度為\(o(nlog_2n)\)

注意開\(long\ long\)

//12252024832524

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 500005;

const int maxlog = 32;

int n,k;

ll s[maxn],ans;

ll read()

while(c >= '0' && c <= '9')

return x * f;

}void put1(ll x)

void put(ll x,char c = -1)

template t max(t x,t y)

template t min(t x,t y)

template t abs(t x)

struct node

node(int id1,int rk1,ll val1)

bool operator < (const node &px) const

};priority_queueq;

int tot;

struct node

t[maxn * maxlog];

void ins(ll x)

}ll query(int rk,ll w)

else now = t[now].ch[id];

} return ret;

}int main()

put(ans >> 1);

return 0;

}

十二省聯考 2019 異或粽子

題目鏈結 演算法 首先把字首異或和統計出來,再將得到的每乙個字首異或和 包括pre 0 0 塞進字典樹中,接下來有乙個貪心的思路 每當我拿著其中乙個異或和的值時,我在字典樹中盡可能找二進位制高位與其對應的位不相同的異或和,這樣兩者異或運算後,所得值最大。所以我們有了這樣乙個思路,對於每乙個pre i...

十二省聯考2019 異或粽子

點此看題 方法1 發現這道題k kk很小,先考慮用字首和表示異或和,建出一顆tire text tire 樹,然後把每個點的最優值丟進優先佇列中 因為其他值沒有這個值優 然後依次取出,再把次大值塞進去。由於每個區間會被統計兩次,所以我們找2k2k 2k次,最後把答案除以2 22即可。方法2 和k k...

十二省聯考2019 異或粽子

其實和超級鋼琴那個題思路挺像的,就是我們弄乙個二元組,乙個pos,乙個sum。求一下字首異或和,然後在它pos前面的01trie裡面查詢第k大即可。如下 luogu judger enable o2 include include include include include include de...