LOJ

洛谷


最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值。

bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\)的。(这就有\(70\)分?)

因为最开始的图是连通的,可以先求一个\(dis[i]\)表示\(1\)到\(i\)的异或和。每次加边会形成环,就是在线性基中插入一个元素。

因为有撤销,所以线段树分治就好了。线段树上每个节点开一个线性基。同一时刻只需要\(\log\)个线性基的空间。

复杂度\(O(\frac{q\log qL^2}{w})\)。

话说这题好无聊啊=-= 我现在怎么老在做这些模板套模板的题=-=

线段树里bitset直接传参比拿个栈分配空间快多了=-=

另外好像是有非线段树分治且在线的做法(见LOJ统计?)。


//187ms	2.64MB
#include <cstdio>
#include <cctype>
#include <vector>
#include <bitset>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e3+5,M=N<<1;
typedef std::bitset<N> Bit; int tot,lim,Enum,H[N],nxt[N],to[N],las[M];
std::bitset<N> len[N],dis[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline char GetOpt()
{
register char c=gc(); while(c!='A'&&c!='C') c=gc();
return gc();
}
void ReadBit(Bit &bit)
{
static char s[N];
scanf("%s",s+1); int l=strlen(s+1);
/*bit.reset(),*/ lim=std::max(lim,l-1);
for(int i=1; i<=l; ++i) bit[l-i]=s[i]-48;
}
inline void AE(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
ReadBit(len[Enum]), len[Enum-1]=len[Enum];
}
void Print(const Bit &x)
{
bool fg=0;
for(int i=lim; ~i; --i)
fg|=x[i]==1, fg&&putchar((x[i]==1)+48);
if(!fg) putchar('0');
putchar('\n');
} struct Edge
{
int u,v; Bit w;
inline void Init() {u=read(),v=read(),ReadBit(w);}
}e[M];
struct Base
{
Bit x[N];
void Insert(Bit v)
{
for(int i=lim; ~i; --i)
if(v[i]==1)
if(x[i].none()) {x[i]=v; break;}
else v^=x[i];
}
void Query()
{
Bit ans; ans.reset();
for(int i=lim; ~i; --i)
if(ans[i]==0&&x[i].any()) ans^=x[i];
Print(ans);
}
}B;
struct Segment_Tree
{
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
#define S N<<2
std::vector<int> vec[S];
#undef S
void Modify(int l,int r,int rt,int L,int R,int v)
{
if(L<=l && r<=R) {vec[rt].push_back(v); return;}
int m=l+r>>1;
if(L<=m) Modify(lson,L,R,v);
if(m<R) Modify(rson,L,R,v);
}
void Solve(int l,int r,int rt,Base base)
{
const std::vector<int> &v=vec[rt];
for(int i=0,lim=v.size(),p; i<lim; ++i)
p=v[i], base.Insert(dis[e[p].u]^dis[e[p].v]^e[p].w);
if(l==r) {base.Query(); return;}
int m=l+r>>1;
Solve(lson,base), Solve(rson,base);
}
}T; void DFS(int x)
{
static int Index,dfn[N];
static bool vis[N];
dfn[x]=++Index, vis[x]=1;
for(int i=H[x],v; i; i=nxt[i])
if(!vis[v=to[i]]) dis[v]=dis[x]^len[i], DFS(v);
else if(dfn[v]<=dfn[x]) B.Insert(dis[x]^dis[v]^len[i]);
} int main()
{
static int id[N];
int n=read(),m=read(),q=read();
while(m--) AE(read(),read());
DFS(1), B.Query();
if(!q) return 0;
#define S 1,q,1
char c; int tot=0;
for(int i=1,k,t,cnt=0; i<=q; ++i)
if((c=GetOpt())=='d') e[++tot].Init(), ++cnt, las[id[cnt]=tot]=i;
else if(c=='a') k=id[read()], T.Modify(S,las[k],i-1,k), las[k]=0;
else t=read(), k=id[t], T.Modify(S,las[k],i-1,k), las[k]=0,
++tot, e[tot].u=e[k].u, e[tot].v=e[k].v, ReadBit(e[tot].w), las[id[t]=tot]=i;//las要改对=-=
for(int i=1; i<=tot; ++i) if(las[i]) T.Modify(S,las[i],q,i);
T.Solve(S,B); return 0;
}

洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)的更多相关文章

  1. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  2. 【洛谷P4319】 变化的道路 线段树分治+LCT

    最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...

  3. [HAOI2017]八纵八横 线性基

    题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点 ...

  4. BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)

    题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...

  5. 洛谷P4570 [BJWC2011]元素 线性基

    正解:线性基+贪心 解题报告: 传送门! 这题其实没什么好写题解的,,,显然贪心一下尽量选魔力大的,不用证明趴挺显然的来着 所以就直接按魔力排个序,插入线性基里面,能插就加个贡献,over 放下代码趴 ...

  6. 洛谷P3857 [TJOI2008]彩灯 [线性基]

    题目传送门 彩灯 题目描述 Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜.已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一 ...

  7. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  8. ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)

    题目链接 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性 ...

  9. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

随机推荐

  1. java 发送 mail 纯文本发送和html格式发送

    一:需要引入mail maven jar包 <!--邮件发送包--> <dependency> <groupId>javax.mail</groupId> ...

  2. CF1131D Gourmet choice

    题目链接 题意 有两组菜,第一组有\(n\)种,第二组有\(m\)种.给出一个\(n\times m\)的矩阵,第\(i\)行第\(j\)列表示第一组中的第\(i\)种菜与第二组中的第\(j\)种菜好 ...

  3. css实现文本两端对齐

    display:inline-block; text-align:center; text-align-last:justify;

  4. iframe 自适应高度、父子页面传值、回调

    总结一下最近用iframe遇到的问题与解决办法: 结构:主页面main.html,里面套用iframe.iframe不能出现滚动条,自适应子页面高度.内容多了滚动条是main.html页面的. 1.  ...

  5. 你可能不知道的 Mac 技巧 - 文本操作

    找不到 Mac 上的 Home,End,PageUp?想截图还得打开 QQ?不知道 Mac 如何剪切文件?找不到全屏窗口的按钮?找不到隐藏文件夹?不知道如何向后删除?想少用鼠标,多用键盘?…… 希望我 ...

  6. create table as 和create table like的区别

    create table as 和create table like的区别 对于MySQL的复制相同表结构方法,有create table as 和create table like 两种,区别是什么 ...

  7. Python实现聚类算法AP

    1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法.AP算法的基本思想是将全部数据点都 ...

  8. 主机管理+堡垒机系统开发:strace命令用法详解(六)

    一.简单介绍 strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进 ...

  9. mysql My SQL获取某个表的列名

    My SQL获取某个表的列名 DESC TableName SHOW COLUMNS FROM TableName SELECT COLUMN_NAME  FROM information_schem ...

  10. Dynamics CRM 日常使用JS整理(一)

    整理下平时CRM开发中用到的一些基本的js操作 取值: var oResult = Xrm.Page.getAttribute(sFieldName).getValue(); var oResult ...