题目:https://loj.ac/problem/2312

   https://www.luogu.org/problemnew/show/P3733

原本以为要线段树分治+LCT,查了查发现环上的值直接是 dis[ u ] ^ dis[ v ] ^ w[ i ] 就行了(其中 u , v 是边的两端, i 是边的标号)。

再看一下题,发现一开始一定是连通的。所以剩下的就和 bzoj 4184 shallot 一样用线性基就行了。

因为有 1000 位,所以用 bitset 。

线性基求最大值原来不用判断 if( ( ans^b[ i ] ) > ans ) ans ^= b[ i ] ,直接看 ans 的这一位上是不是 0 就行了。

线段树的一个点不要用 vector 存 bitset ,存一下边的编号,然后每条边开 bitset 存一下自己就行了,能省出很多空间。

在线段树上 dfs 求答案的时候不要把一个线性基带在参数上,给每个点用 vector 记录一下它改了线性基的哪些位就行了,这样好像对栈空间更友好。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bitset>
#define ls Ls[cr]
#define rs Rs[cr]
#define pb push_back
#define BT bitset<M>
using namespace std;
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=505,M=1005;
int n,m,hd[N],xnt,to[M],nxt[M],fa[N],dy[/*N*/M],mx;
int tot,Ls[M<<1],Rs[M<<1];
char ch[M]; bool vis[/*N*/M];
BT dis[N],w[M],b[M],ew[M],tmp;
vector<int> vt[M<<1],cg[M<<1];
struct Ed{int x,y; BT w;}ed[/*N*/M];void cz(BT k,int cr)
{for(int i=mx-1;i>=0;i--){if(!k[i])continue;if(!b[i].any()){ b[i]=k;cg[cr].pb(i);break;}else k^=b[i];}
}
void print()
{tmp.reset();for(int i=mx-1;i>=0;i--)if(!tmp[i])tmp^=b[i];int st=mx-1; for(;st>0&&!tmp[st];st--);for(;st>=0;st--) putchar(tmp[st]+'0');puts("");
}
void rd1()
{scanf("%s",ch); int len=strlen(ch);mx=Mx(mx,len);  tmp.reset();//
  for(int i=0,j=len-1;i<len;i++,j--)tmp[i]=(ch[j]-'0');
}
int fnd(int a){return fa[a]==a?a:fa[a]=fnd(fa[a]);}
void add(int x,int y)
{int u=fnd(x),v=fnd(y);if(u==v){ed[++tot].x=x; ed[tot].y=y; ed[tot].w=tmp;}else{fa[u]=v;to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=tmp;to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;w[xnt]=tmp;}
}
void dfs(int cr,int fa)
{for(int i=hd[cr],v;i;i=nxt[i])if((v=to[i])!=fa){dis[v]=dis[cr]^w[i]; dfs(v,cr);}
}
void build(int l,int r,int cr)
{if(l==r)return; int mid=l+r>>1;ls=++tot; build(l,mid,ls);rs=++tot; build(mid+1,r,rs);
}
void ins(int l,int r,int cr,int L,int R,int k)
{if(l>=L&&r<=R){vt[cr].pb(k);return;}int mid=l+r>>1;if(L<=mid)ins(l,mid,ls,L,R,k);if(mid<R)ins(mid+1,r,rs,L,R,k);
}
void dfs(int l,int r,int cr)
{int sz=vt[cr].size();for(int i=0;i<sz;i++)cz(ew[vt[cr][i]],cr);if(!ls)print();else dfs(l,l+r>>1,ls), dfs((l+r>>1)+1,r,rs);sz=cg[cr].size();for(int i=0;i<sz;i++)b[cg[cr][i]].reset();
}
int main()
{n=rdn();m=rdn();int Q=rdn();for(int i=1;i<=n;i++)fa[i]=i;for(int i=1,u,v;i<=m;i++){u=rdn();v=rdn();rd1();add(u,v);}dfs(1,0); int t2=tot;if(Q){ tot=1;build(1,Q,1);}for(int i=1,u;i<=t2;i++){tmp=dis[ed[i].x]^dis[ed[i].y]^ed[i].w;cz(tmp,0);}int cnt=0; tot=0;for(int i=1,x;i<=Q;i++){scanf("%s",ch);if(ch[0]=='A'){cnt++; dy[cnt]=i;ed[cnt].x=rdn();ed[cnt].y=rdn();rd1(); ed[cnt].w=tmp;}else if(ch[1]=='a'){x=rdn();ew[++tot]=dis[ed[x].x]^dis[ed[x].y]^ed[x].w;ins(1,Q,1,dy[x],i-1,tot); vis[x]=1;}else{x=rdn(); rd1();ew[++tot]=dis[ed[x].x]^dis[ed[x].y]^ed[x].w;ins(1,Q,1,dy[x],i-1,tot);dy[x]=i; ed[x].w=tmp;}}for(int i=1;i<=cnt;i++)if(!vis[i]){ew[++tot]=dis[ed[i].x]^dis[ed[i].y]^ed[i].w;ins(1,Q,1,dy[i],Q,tot);}print();if(Q)dfs(1,Q,1); return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10437803.html

LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset相关推荐

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

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  2. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

  3. LOJ6435 洛谷5465 「PKUSC2018」星际穿越 倍增

    题目链接: loj6435 洛谷5465 蒟蒻zyd:这不是大水题吗?看我写个O(nlog2n)O(nlog^2n)O(nlog2n)的诡异ST表卡卡常数跑过去 题目:输出区间距离和 蒟蒻zyd:(笑 ...

  4. 洛谷P4710 「物理」平抛运动 普及-

    P4710 「物理」平抛运动 标签:数学 思路:开始卡了,g=9.8不能,改为10就过了 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图 ...

  5. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  6. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

  7. 洛谷 P5858 「SWTR-03」Golden Sword

    Description 制造一把金宝剑需要 n n n 种原料,编号为 1 1 1 到 n n n,编号为 i i i 的原料的坚固值为 a i a_i ai​. 炼金是很讲究放入原料的顺序的,因此小 ...

  8. 洛谷P6599 「EZEC-2」异或【题解】

    题目大意 有TTT组数据,每组数据给定两个l,n∈N∗l,n\in\mathbb{N*}l,n∈N∗,构造一个长为lll,每个元素不超过nnn的数组 令他为aaa,要使 ∑i=1l∑j=1i−1ai⊕ ...

  9. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

最新文章

  1. 深度学习常用损失函数总览:基本形式、原理、特点
  2. svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
  3. Emgucv粗略抠取车牌
  4. win10+anaconda安装tensorflow和keras遇到的坑小结
  5. 使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)
  6. 从一个hibernate配置文件中了解到的东西
  7. Js中Array对象
  8. 数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值
  9. 【报告分享】2022年中国商业十大热点展望.pdf(附下载链接)
  10. 一个 union all 的all
  11. struts2_20140720
  12. 什么是加密狗?加密狗由来
  13. 计算机创造奇迹的英语作文,创造奇迹英语作文Creating Miracle
  14. 【TCP专题】TCP连接建立
  15. 政策更新 | 开发者如何处理软件包可见性
  16. 如何成为一名优秀的程序员(五)
  17. GF(Go Frame)开发框架
  18. 用iconv 文件格式转换
  19. 计算机主机突然断电有什么影响吗,电脑突然断电对硬盘有影响?实测后真相了...
  20. java里void的意思_void的用法和意义

热门文章

  1. 双屏不同缩放比例_科技产品大赏,曲面、折叠手机之后,双屏电脑会是下一个趋势吗?...
  2. test title
  3. SQLServer 2000 126错误的解决方法
  4. 云服务如何对外开发指定端口
  5. 微软:四种方法暂时屏蔽IE最新漏洞
  6. 天津市规划局存储和灾备系统集成项目
  7. freebsd 6.2 安装配置笔记[转]
  8. 2021-05-06 git 设置XX门8580端口代理访问github
  9. xlc mysql_mysql – 用于存储产品信息的noSQL?
  10. MFC 教程【11_MFC下的文件类 】