日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CF1100F】 Ivan and Burgers (分治+线性基)

發(fā)布時(shí)間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CF1100F】 Ivan and Burgers (分治+线性基) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

description

戳我看題目(づ ̄3 ̄)づ╭?~

solution

異或和最大 ——關(guān)聯(lián)線性基

線性基:

  • 原序列的每一個(gè)數(shù)都能由線性基里若干個(gè)數(shù)異或得到
  • 線性基里若干個(gè)數(shù)的異或結(jié)果不可能為0
  • 如果直接線段樹合并線性基時(shí)間復(fù)雜度是無法接受

    離線下來,考慮分治

    一樣的,只在左區(qū)間或右區(qū)間的分治下去處理,考慮詢問跨越了中點(diǎn)midmidmid

    處理[l,mid][l,mid][l,mid]區(qū)間每個(gè)點(diǎn)的后綴線性基,[mid+1,r][mid+1,r][mid+1,r]區(qū)間每個(gè)點(diǎn)的前綴線性基

    暴力合并線性基即可

    code

    #include <cstdio> #include <cstring> #define maxn 500005 int n, Q; int a[maxn], ql[maxn], qr[maxn], p[maxn]; int left[maxn], right[maxn], ans[maxn];struct node {int f[20];void insert( int x ) {for( int i = 19;~ i;i -- )if( ( 1 << i ) & x ) {if( ! f[i] ) { f[i] = x; break; }else x ^= f[i];}}void clear() {memset( f, 0, sizeof( f ) );}}base[maxn];int merge( node x, node y ) { //線性基合并 int num = 0;for( int i = 19;~ i;i -- )x.insert( y.f[i] );for( int i = 19;~ i;i -- )if( ( num ^ x.f[i] ) > num ) num ^= x.f[i];return num; }void solve( int L, int R, int l, int r ) {if( L > R || l > r ) return;if( l == r ) {for( int i = L;i <= R;i ++ )ans[p[i]] = a[l];return;}int mid = ( l + r ) >> 1, lenl = 0, lenr = 0;//暴力重構(gòu)區(qū)間[l',r']的線性基base[mid].clear(); //不要忘記清空了!! base[mid].insert( a[mid] );for( int i = mid - 1;i >= l;i -- )base[i] = base[i + 1], base[i].insert( a[i] );for( int i = mid + 1;i <= r;i ++ )base[i] = base[i - 1], base[i].insert( a[i] );for( int i = L;i <= R;i ++ ) {int id = p[i];if( ql[id] <= mid ) {if( qr[id] <= mid ) //完全在左區(qū)間 遞歸處理 left[++ lenl] = id;elseans[id] = merge( base[ql[id]], base[qr[id]] );}else //完全在右區(qū)間 遞歸處理 right[++ lenr] = id;}for( int i = 1;i <= lenl;i ++ ) p[L + i - 1] = left[i];for( int i = 1;i <= lenr;i ++ ) p[L + lenl + i - 1] = right[i];solve( L, L + lenl - 1, l, mid );solve( L + lenl, L + lenl + lenr - 1, mid + 1, r ); }int main() {scanf( "%d", &n ); for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );scanf( "%d", &Q );for( int i = 1;i <= Q;i ++ ) {scanf( "%d %d", &ql[i], &qr[i] );p[i] = i;}solve( 1, Q, 1, n );for( int i = 1;i <= Q;i ++ )printf( "%d\n", ans[i] );return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的【CF1100F】 Ivan and Burgers (分治+线性基)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。