给一个1-base数组{a},有N次操作,每次操作会使一个位置无效。一个区间的权值定义为这个区间里选出一些数的异或和的最大值。求在每次操作前,所有不包含无效位置的区间的权值的最大值。

线性基删除不知道怎么维护,不妨逆向添加

然后区间连通性的维护自然要应用到并查集,每次操作mark一下当前位置,如果在操作时左边的区间已经mark过就搞它,右边同理

注意find时谁的基被插入

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<bitset>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iin(a) scanf("%d",&a)
#define lin(a) scanf("%lld",&a)
#define din(a) scanf("%lf",&a)
#define s0(a) scanf("%s",a)
#define s1(a) scanf("%s",a+1)
#define print(a) printf("%lld",(ll)a)
#define enter putchar('\n')
#define blank putchar(' ')
#define println(a) printf("%lld\n",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int MAXN = 1e5+11;
const double EPS = 1e-7;
typedef long long ll;
typedef unsigned long long ull;
const ll MOD = 10086;
unsigned int SEED = 17;
const ll INF = 1ll<<60;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct LB{
ll b[66];
void clear(){
rep(i,0,62) b[i]=0;
}
void insert(ll x){
rrep(i,62,0) if(x>>i&1){
if(b[i]) x^=b[i];
else{
b[i]=x;
rrep(j,i-1,0) if(b[j]&&(b[i]>>j&1)) b[i]^=b[j];
rep(j,i+1,62) if(b[j]>>i&1) b[j]^=b[i];
break;
}
}
}
ll rk1(){
ll res=0;
rrep(i,62,0) res^=b[i];
return res;
}
void merge(LB rhs){
rep(i,0,62) if(rhs.b[i]) insert(rhs.b[i]);
}
}B[MAXN];
struct UF{
int p[MAXN];
void init(int n){
rep(i,1,n) p[i]=i;
}
int find(int x){
if(x==p[x]) return x;
// int o=p[x];
int t=find(p[x]);
B[t].merge(B[x]);
return p[x]=t;
}
ll link(int a,int b){
a=find(a);b=find(b);
if(a==b) return B[a].rk1();
p[a]=b;B[b].merge(B[a]);
return B[b].rk1();
}
}uf;
ll a[MAXN],n,x[MAXN],ans[MAXN];
bool vis[MAXN];
int main(){
while(cin>>n){
uf.init(n);
memset(vis,0,sizeof vis);
rep(i,1,n) a[i]=read();
rep(i,1,n) x[i]=read();
rep(i,1,n) B[i].clear();
rep(i,1,n) B[i].insert(a[i]);
ll mx=0;
rrep(i,n,1){
if(i==n) mx=ans[i]=a[x[n]],vis[x[n]]=1;
else{
ans[i]=-1;
vis[x[i]]=1;
if(vis[x[i]-1]&&x[i]-1>0){
int a=uf.find(x[i]-1);
mx=ans[i]=max(mx,uf.link(x[i],a));
}
if(vis[x[i]+1]&&x[i]+1<=n){
int a=uf.find(x[i]+1);
mx=ans[i]=max(mx,uf.link(x[i],a));
}
if(ans[i]==-1){
mx=ans[i]=max(mx,a[x[i]]);
}
}
//rep(j,1,n) cout<<j<<" "<<uf.p[j]<<endl;
}
rep(i,1,n) println(ans[i]);
}
return 0;
}

Wannafly挑战赛14 - E 并查集维护线性基区间的更多相关文章

  1. 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)

    [CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...

  2. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  3. hihoCoder #1291 : Building in Sandbox 逆向处理+并查集维护

    /** 题目:#1291 : Building in Sandbox 链接:https://hihocoder.com/problemset/problem/1291 题意:就是一个三维的空间里,按照 ...

  4. [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]

    题面 传送门 思路 真是一道神奇的题目呢 题目本身可以转化为二分图匹配问题,要求右半部分选择的点的最大编号最小的一组完美匹配 注意到这里左边半部分有一个性质:每个点恰好连出两条边到右半部分 那么我们可 ...

  5. Codeforces325 D【并查集维护连通性】

    参考:大牛blog 思路: 因为是环,所以可以复制一下图,先判断一下和他是不是和与他相邻的8个之一的一个障碍使得构成了一个环,环就是一个连通,用并查集维护即可: 如果没有就ans++,然后并把这个点加 ...

  6. 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)

    题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树.  开始和队友 ...

  7. 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...

  8. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

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

    题面 \(solution:\) 这一题绝对算的上是一道经典的例题,它向我们诠释了一种新的线段树维护方式(神犇可以跳过了).像这一类需要加入又需要维护删除的问题,我们曾经是遇到过的像莫对,线段树... ...

随机推荐

  1. jqentitydetail

    using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...

  2. YDNJS(上卷):this 的绑定对象

    函数中的 this 是在调用时被绑定的,this 指向谁完全取决于函数的调用位置. 确定 this 的绑定对象的方式有 4 种. 默认绑定 默认绑定就是将函数中的 this 绑定给了全局对象 wind ...

  3. 如何看待那些不能重现的bug?

    在我们日常测试活动中,经常会发现一些bug,但是这些bug可能就是昙花一现,再也无法(或者很难)重现出来,内心灰常崩溃.那到底有哪些方面可能会导致这类的缺陷发生呢? 我以自己工作中所遇到的给出一些自己 ...

  4. WEB缓存初探

    WEB缓存初探 概念理解 缓存--缓存就是数据交换的缓冲区(称作Cache) 缓存 的作用说白了就是用来就近获取东西,比如我们会把已经拿到的常用的东西放在手边(与自己相对较近的地方),方便下次需要时去 ...

  5. Jquery delegate的理解

    $(".step4TagList .albumShow", "#divStep4").delegate(" .abmFct .icoRt", ...

  6. Snapshot--使用脚本创建快照

    USE master; SET NOCOUNT ON; GO ); --数据库名 );--快照名 );--保存路径 SET @dbname='DB1'; SET @snapname='DB1_SNAP ...

  7. 三、Node.js-HelloWorld案例

    之前我们编写的JavaScript代码都是在浏览器中运行的,因此,我们可以直接在浏览器中敲代码,然后直接运行. 在Node,我们编写的JavaScript代码将不能在浏览器环境中执行了,而是在Node ...

  8. php+jquery 实现 ajax上传图片到非当前服务器

    用 html file控件上传图片,因为 $_FILES["file"] 是传到当前服务器,想要上传到另外一个服务器需要通过服务器脚本实现. 1.图片上传 引入jquery 和 a ...

  9. JMeter Bean Shell

    1.什么是bean Shell BeanShell是一种脚本语言,一种完全符合java语法的java脚本语言,并且又拥有自己的一些语法和方法,beanShell是一种松散类型的脚本语言(这点和JS类似 ...

  10. ZED 常用资料汇总

    Calibration file Location: /usr/local/zed/settings/SN10027507.conf I suggest the calibration file sh ...