洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
最基本的思路同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)的更多相关文章
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- 【洛谷P4319】 变化的道路 线段树分治+LCT
最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...
- [HAOI2017]八纵八横 线性基
题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点 ...
- BZOJ 2460 & 洛谷 P4570 [BJWC2011]元素 (线性基 贪心)
题目链接: 洛谷 BZOJ 题意 给定 \(n\) 个矿石,每个矿石有编号和魔力值两种属性,选择一些矿石,使得魔力值最大且编号的异或和不为 0. 思路 线性基 贪心 根据矿石的魔力值从大到小排序. 线 ...
- 洛谷P4570 [BJWC2011]元素 线性基
正解:线性基+贪心 解题报告: 传送门! 这题其实没什么好写题解的,,,显然贪心一下尽量选魔力大的,不用证明趴挺显然的来着 所以就直接按魔力排个序,插入线性基里面,能插就加个贡献,over 放下代码趴 ...
- 洛谷P3857 [TJOI2008]彩灯 [线性基]
题目传送门 彩灯 题目描述 Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜.已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一 ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)
题目链接 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性 ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
随机推荐
- 金融量化分析【day112】:初识量化交易
一.摘要 为什么需要量化交易? 量化交易是做什么? 量化交易的价值何在? 做量化交易需要什么? 聚宽是什么? 零基础如何快速入门量化交易? 自测与自学 二.量化交易比传统交易强多少? 它能让你的交易效 ...
- Maven 学习总结 (二) 之 生命周期与插件
五.生命周期与插件 1.Maven有三套独立的生命周期:clean.default和site. clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立 ...
- Hadoop记录-queue mysql
#!/bin/sh ip=10.116.100.11 port=8088 export HADOOP_HOME=/app/hadoop/bin rmstate1=$($HADOOP_HOME/yarn ...
- JAVA关于字符串&&字符数组处理的小题目
JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...
- [再寄小读者之数学篇](2014-06-22 函数恒为零的一个充分条件 [中国科学技术大学2011年高等数学B考研试题])
设 $f(x)$ 在 $\bbR$ 上连续, 又 $$\bex \phi(x)=f(x)\int_0^x f(t)\rd t \eex$$ 单调递减. 证明: $f\equiv 0$. 证明: 设 $ ...
- [物理学与PDEs]第4章第2节 反应流体力学方程组 2.3 混合气体状态方程
1. 记号与假设 (1) 已燃气体的化学能为 $0$. (2) 单位质量的未燃气体的化学能为 $g_0>0$. 2. 对多方气体 (理想气体当 $T$ 不高时可近似认为), $$\bex ...
- express + restful
express http://www.expressjs.com.cn/ Express 是一个基于 Node.js 平台的极简.灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 ...
- day 18 - 1 正则与 re 模块
正则表达式 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑. 我 ...
- windows :config windows update … 一直处于假死状态
参考文章:http://www.cnblogs.com/teacat/p/9204225.html 环境:win7 64bit 旗舰版 问题:重启后,系统更新到35%后,一直处于假死状态,未能正确进入 ...
- Android屏幕旋转
一个手机最基本的旋转方向有上面4种,而在Android开发中,涉及到屏幕旋转的地方很多,而且各个函数给出的角度值都不一样,比如 Activity的getRotate,Camera的setDisplay ...