bzoj 4184: shallot (线段树维护线性基)

题面

\(solution:\)

\(code:\)

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>

#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
#define pb push_back
#define midd int mid=(l+r)>>1
#define klr int k,int l,int r
#define zuo k<<1,l,mid
#define you k<<1|1,mid+1,r

using namespace std;

map<int,int> h;
vector<int> a[500005<<2];

int d[31];
int n,v,sl,sr;
int c[500005];

struct ji{
    int b[31];
    ji(){memset(b,0,sizeof(0));}
    inline void add(int x){
        for(rg i=30;i>=0;--i)
            if(x&d[i]){
                if(b[i])x^=b[i];
                else {b[i]=x;return;}
            }
    }
    inline int ask(){
        int res=0;
        for(rg i=30;i>=0;--i)
            if(b[i]&&!(res&d[i]))res^=b[i];
        return res;
    }
}base;

inline int qr(){
    char ch; int sign=1;
    while((ch=getchar())<'0'||ch>'9')
        if(ch=='-')sign=-1;
    int res=ch^48;
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+(ch^48);
    return res*sign;
}

inline void add(klr){
    if(sl<=l&&r<=sr){ a[k].pb(-v); return ;}
    midd; if(sl<=mid)add(zuo); if(sr>mid)add(you);
}

inline void dfs(klr,ji t){
    for(rg i=0,j=a[k].size();i<j;++i) t.add(a[k][i]);
    if(l==r){printf("%d\n",t.ask());return ;}
    midd; dfs(zuo,t); dfs(you,t);
}

int main(){
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    n=qr();
    for(rg i=30;i>=0;--i)d[i]=1<<i;
    for(rg i=1;i<=n;++i){
        if((c[i]=v=qr())>=0)h[v]=i;
        else sl=h[-v],h[-v]=0,sr=i-1,add(1,1,n);
    }
    for(rg i=1;i<=n;++i)
        if(c[i]>0&&h[c[i]])
            sl=h[c[i]],sr=n,v=-c[i],add(1,1,n);
    dfs(1,1,n,base);
    return 0;
}

原文地址:https://www.cnblogs.com/812-xiao-wen/p/10363555.html

时间: 2024-10-09 01:39:06

bzoj 4184: shallot (线段树维护线性基)的相关文章

线段树维护线性基并——17西安icpc a

#include<bits/stdc++.h> using namespace std; #define N 10005 int a[N],n,k,q; struct LB{ int b[35]; LB(){memset(b,0,sizeof b);} int check(int x){ for(int i=29;i>=0;i--)if(x>>i & 1){ if(!b[i])return 0; x^=b[i]; } return 1; } void insert(i

UVALive - 8512 线段树维护线性基(仅观赏)

题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 目前提交处于TLE状态,原因待查 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<ve

【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路的两端都是城市(可能两端是同一个城市),保证任意两个城市都可以通过高速公路互达. 国正在筹划“八纵八横”的高铁建设计划,计划要修建一些高速铁路,每条高速铁路两端也都是城市(可能两端是同一个城市),也都有一个非负整数的经济影响因子.国家还计划在“八纵八横”计划建成之后,将“一带一路”扩展为“一带_路一

Codeforces 938G 线段树分治 线性基 可撤销并查集

Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问x到y的路径异或最小值 保证图在任意时刻连通 首先连通图路径异或相当于从x到y的任意一条路径再异或上若干个环得到的,只要在dfs过程中把非树边成的环丢到线性基里就好了,其他环一定可以通过这些环异或组合出来 有加边删边操作怎么做呢?线段树时间分治!注意到不能保证在线段树的任意一个节点图是连通的,需要用

HAOI2017 八纵八横——线段树分治+线性基

题目大意 给定一个图,每次加一些边,或者删掉一些后来加上去的边,定义一个环的价值为环上所有的边的异或和,重复走的边重复算.每次询问这个时刻图中的所有经过1号点的环的最大价值. 思路 首先考虑对于一个静态的图如何求解图中所有经过1号点的环的最大价值,发现这个经过1号点就是唬人的,图中任意一个环都可以经过1号点再走回来. 于是题目变成了求解图中环的最大价值,可以将图中所有的简单环给拎出来放到线性基里面求最大价值,不难发现这是对的. 然后题目转化为了如何求图中所有的简单环,一般我们可以直接对图dfs找

2017 ICPC西安区域赛 A - XOR (线段树并线性基)

链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its element is A[i]A[i] (1 \le i \le n)(1≤i≤n) . Then gives two integers QQ, KK, and QQ queries follow . Each query , give you LL, RR, you can get ZZ by the foll

【bzoj4184】shallot 线段树+高斯消元动态维护线性基

题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大. 这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为Oi选手的你,你能帮帮他吗? 你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出0. 输入 第一行一个正整数n表示总时间:第二行n个整数a1,a2...an,

[BZOJ 4184] shallot 以时间为基底建线段树

题意 给定时长 $n$ , 每个时刻有某个元素出现或者消失, 求每个时刻所有元素的最大异或值. $n \le 500000$ . 分析 通过 map 或者 hash , 我们可以知道 $O(n)$ 个 "一个元素 $x$ 在 $[l, r]$ " 出现的信息. 对时间建立线段树, 每个节点开一个 vector , 对区间 $[l, r]$ 对应的所有节点插入一个 $x$ . 对线段树进行 DFS , 同时动态维护线性基. 实现 #include <cstdio> #incl

[BZOJ 1018] [SHOI2008] 堵塞的交通traffic 【线段树维护联通性】

题目链接:BZOJ - 1018 题目分析 这道题就说明了刷题少,比赛就容易跪..SDOI Round1 Day2 T3 就是与这道题类似的..然而我并没有做过这道题.. 这道题是线段树维护联通性的经典模型. 我们线段树的一个节点表示一个区间的联通性,有 6 个 bool 值,表示这个区间的 4 个角上的点之间的联通性. 然后用两个子区间的联通性和两个子区间之间的连边情况合并出整个区间的联通性. 修改某条边时,先在边的数组中修改,然后从这条边所在的点的线段树叶子开始向上 Update . 询问两