C141 线段树分治+线性基 P3733 [HAOI2017] 八纵八横

news/2024/9/8 12:25:22/文章来源:https://www.cnblogs.com/dx123/p/18248613

视频链接:C141 线段树分治+线性基 P3733 [HAOI2017] 八纵八横_哔哩哔哩_bilibili

 

 

 

P3733 [HAOI2017] 八纵八横 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 线段树分治+线性基 O(q*logq*logL*logL)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;#define ls (u<<1)
#define rs (u<<1|1)
#define mid (l+r>>1)
const int N=1005;
typedef bitset<N> bit;
vector<bit> tr[N<<2]; //节点
bit sum[N],val[N];
int n,m,q,x,y,k;
char s[N],z[N];
int vis[N],tim[N],cnt;
int head[N],idx;
struct edge{int to,ne; bit w;
}e[N<<1]; //原边
struct edge2{int x,y;
}a[N<<1]; //新边
bit p[N]; //初始的线性基void add(int x,int y,bit w){e[++idx].to=y;e[idx].ne=head[x];e[idx].w=w;head[x]=idx;
}
void print(bit a[]){int i,j; bit c;for(i=1000;i>=0&&!a[i].any();i--)if(i<0){puts("0");return;}for(j=i;j>=0;j--)if(a[j].any()&&!c[j]) c^=a[j];for(j=i;j>=0;j--) putchar('0'+c[j]);puts("");
}
void insert(bit a[],bit x){ //插入线性基if(!x.any()) return;for(int i=1000;i>=0;i--){if(x[i]){if(!a[i].any()){a[i]=x;break;}x^=a[i];}}
}
void dfs(int x){vis[x]=1;for(int i=head[x];i;i=e[i].ne){int y=e[i].to;if(!vis[y]) sum[y]=sum[x]^e[i].w,dfs(y);else insert(p,sum[x]^e[i].w^sum[y]);}
}
void ins(int u,int l,int r,int L,int R,bit x){if(l>R||r<L) return;if(L<=l&&r<=R){tr[u].push_back(x);return;}ins(ls,l,mid,L,R,x);ins(rs,mid+1,r,L,R,x);
}
void solve(int u,int l,int r,bit a[]){bit b[N];for(int i=1000;i>=0;i--) b[i]=a[i];for(auto i:tr[u]) insert(b,i); //插入基if(l==r){print(b); return;}solve(ls,l,mid,b);solve(rs,mid+1,r,b);
}
int main(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=m;i++){scanf("%d%d%s",&x,&y,z);bit w(z);add(x,y,w); add(y,x,w);}dfs(1);print(p);for(int i=1;i<=q;i++){scanf("%s",s);if(s[1]=='d'){ //Addscanf("%d%d%s",&x,&y,z);tim[++cnt]=i; //第k号边的出现时刻
      bit w(z);a[cnt]={x,y};val[cnt]=sum[x]^sum[y]^w; //环值
    }else if(s[1]=='h'){ //Changescanf("%d%s",&k,z);ins(1,1,q,tim[k],i-1,val[k]); //插入树tim[k]=i; //第k号边的出现时刻
      bit w(z);val[k]=sum[a[k].x]^sum[a[k].y]^w; //环值
    }else{ //Cancelscanf("%d",&k);ins(1,1,q,tim[k],i-1,val[k]); //插入树tim[k]=q+1; //第k号边消失
    }}for(int i=1;i<=cnt;i++)ins(1,1,q,tim[i],q,val[i]); //插入树if(q) solve(1,1,q,p); //分治
}

 

// 线段树分治+线性基 O(q*logq*logL*logL)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;#define ls (u<<1)
#define rs (u<<1|1)
#define mid (l+r>>1)
const int N=1005;
typedef bitset<N> bit;
vector<bit> tr[N<<2]; //节点
bit sum[N],val[N];
int n,m,q,x,y,k;
char s[N],z[N];
int vis[N],tim[N],cnt;
int head[N],idx;
struct edge{int to,ne; bit w;
}e[N<<1]; //原边
struct edge2{int x,y;
}a[N<<1]; //新边
struct bs{bit b[N];
}p; //初始的线性基void add(int x,int y,bit w){e[++idx].to=y;e[idx].w=w;e[idx].ne=head[x];head[x]=idx;
}
void print(bs &a){int i,j; bit c;for(i=1000;i>=0&&!a.b[i].any();i--)if(i<0){puts("0");return;}for(j=i;j>=0;j--)if(a.b[j].any()&&!c[j]) c^=a.b[j];for(j=i;j>=0;j--) putchar('0'+c[j]);puts("");
}
void insert(bs &a,bit x){ //注意bs传地址if(!x.any()) return;for(int i=1000;i>=0;i--){if(x[i]){if(!a.b[i].any()){a.b[i]=x;break;}x^=a.b[i];}}
}
void dfs(int x){vis[x]=1;for(int i=head[x];i;i=e[i].ne){int y=e[i].to;if(!vis[y]) sum[y]=sum[x]^e[i].w,dfs(y);else insert(p,sum[x]^e[i].w^sum[y]);}
}
void ins(int u,int l,int r,int L,int R,bit x){if(l>R||r<L) return;if(L<=l&&r<=R){tr[u].push_back(x);return;}ins(ls,l,mid,L,R,x);ins(rs,mid+1,r,L,R,x);
}
void solve(int u,int l,int r,bs a){ //注意bs传值for(auto i:tr[u]) insert(a,i); //插入基if(l==r){print(a); //输出return;}solve(ls,l,mid,a);solve(rs,mid+1,r,a);
}
int main(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=m;i++){scanf("%d%d%s",&x,&y,z);bit w(z);add(x,y,w); add(y,x,w);}dfs(1);print(p);for(int i=1;i<=q;i++){scanf("%s",s);if(s[1]=='d'){ //Addscanf("%d%d%s",&x,&y,z);tim[++cnt]=i; //第k号边的出现时刻
      bit w(z);a[cnt]={x,y};val[cnt]=sum[x]^sum[y]^w; //环值
    }else if(s[1]=='h'){ //Changescanf("%d%s",&k,z);ins(1,1,q,tim[k],i-1,val[k]); //插入树tim[k]=i; //第k号边的出现时刻
      bit w(z);val[k]=sum[a[k].x]^sum[a[k].y]^w; //环值
    }else{ //Cancelscanf("%d",&k);ins(1,1,q,tim[k],i-1,val[k]); //插入树tim[k]=q+1; //第k号边消失
    }}for(int i=1;i<=cnt;i++)ins(1,1,q,tim[i],q,val[i]); //插入树if(q) solve(1,1,q,p); //分治
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772731.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Mathtype添加到WPS中

(1)在顶部菜单栏,工具--加载项--在“模板和加载项”窗口中再点击“添加”(2)找到mathtype安装路径下面的“OfficeSupprot”,这时会看到有“32”和“64”两个文件夹,分别对应WPS软件的系统(任务管理器可以直接查看wps版本)。默认路径为下边这个:(3)如果许多功能不…

BUUCTF 3.warmup_csaw_2016

拿到题目,我们先运行一下我们发现这道题的样子和BUUCTF的rip很像,一样是让我们输入,一样是在输入超长字符串后程序会崩溃,所以我们可以猜测是一道栈溢出的问题,我们来看一下保护机制我们发现依旧是几乎没开保护机制,所以大概率是一道栈溢出的题。 我们看一下IDA我们发现最…

sql注入漏洞复现

and 1=1 正常and 1=2 报错从这就已经说明是sql数字型注入了 上sqlmap验证一下存在布尔盲注,时间盲注...... 我是在漏洞盒子上提交的,能不能通过看运气吧 下面这个漏洞已经是很久之前的了,现在已经是修复了,当时还是太年轻了......当时复现过程没有做好,截图也已经删掉了..…

【PHP系列】phpinfo里面有什么?

一、INFO_GENERAL:一般信息 1.1 版本 1.2 操作系统版本和SAPI 原创 猎豹安全中心 小豹讲安全 2021-05-25 14:30 在PHP中,我们往往通过phpinfo()函数(及可选选项)来检查配置设置和预定义变量,返回结果输出关于PHP的配置信息,其中包含了 PHP 编译选项、启用的扩展、PHP 版本、…

【学习笔记】线段树

本文冲刺 \(3000\) 行中,目前行数:\(2668\) 行。 【0】线段树简介 【0.1】线段树是干什么的 线段树是一种基于分治的树形数据结构,可以处理很多区间问题,值域问题。 【0.2】线段树的形态 线段树作为一棵二叉树,其左子节点维护的是左半区间的信息,右子节点维护的是右半区间…

从零开始的JAVAday22~day28

上周我们学习了如何定义变量,这周我们学习如何给变量起名。 硬性要求: 1.由数字、字母、下划线()和美元符($)组成 2.不能以数字开头 3.不能是关键字 4.区分大小写 软性要求: 小驼峰命名法:存在一个单词时所有字母都小写,存在多个字母时第一个单词小写第二个单词首字母大写…

Git的存储原理

Git提交的只有你的代码吗?底层存储大剖析!目录Git 设计原理Git vs SVNGit 存储模型.git 目录结构Git 基本数据对象Git 包文件Git 引用 Git 设计原理 概括的讲,Git 就是一个基于快照的内容寻址文件系统。 往下慢慢看。 Git vs SVN Git 出现前,主流版本控制系统(SVN...)一般…

运行一个jar包的过程

在Linux运作jar包在Linux系统中,一个Java Archive(JAR)文件是包含Java类文件、相关的元数据和资源(如文本、图片等)的压缩包,通常用于存储Java应用程序或库。要在Linux上运行一个JAR包,你可以按照以下步骤操作: 1、确保Java环境已安装: 在Linux系统中运行JAR文件之前,…

BUUCTF 2.rip

拿到题目首先运行一下我们可以看到在我第一次运行时我们发现他就是将我们输入的重新输出了一遍,我们可以猜测应该是gets函数输入,然后输出,那我们便可以测试第二次,我们输入一个超长字符串,发现程序崩溃了,我们可以猜测应该是程序没有对长度进行检测而导致的栈溢出,那么…

计组笔记第七章——输入输出系统

7.1.1 I/O系统和IO控制方式常见I/O设备: 鼠标、键盘;显示器、打印机;硬盘、光盘。 主机如何与I/0设备进行交互? I/O接口:又称I/O控制器、设备控制器,负责协调主机与外部设备之间的数据传输。 I/O接口与CPU之间靠总线连接,与外设之间靠USB连接线连接。 I/O接口多种多样,…

Raft协议深度解析:RocketMQ中基于DLedger的日志主从复制

本文所涉及的注释源码:bigcoder84/dledgerRaft 协议主要包含两个部分:Leader选举和日志复制。 前面我们在 Raft协议深度解析:RocketMQ中的自动Leader选举与故障转移 一文中已经详细介绍了DLedger如何实现Leader选举的,而本文主要聚焦于Leader选举完成后的日志复制的过程。 …

Android低功耗子系统的投票机制以及触发进入系统休眠的过程

从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了 wakeup source以及autosleep机制关于wakeup source的介绍,请参考: Wakeup Source框架设计与实现 关于autosleep机制,请参考:autosleep框架设计与实现在内核中,使用wakeup source提供投票机制,让各个系…