XJOI网上同步测试DAY14 T3



思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就把u到v的路径全部染色成0
最后只要询问缩点完的S到缩点完的T的路径上有多少是1就是答案了,最后复杂度:O(nlogn)
至于为什么这么做:因为我们要找必经过的边,这不就是桥吗,那我们先预处理出原来图的桥,然后把图转变成树,之后对于官道来说,它只要是连接了两个在同一个联通块里的点,就表明这段路绝对不可能是必经之路,而对于连接两个连通分量的边,那么它就是新的桥啊!因此它要被新建成为lct中的一条边。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
struct edge{
int u,v;
}e[];
int n,m;
int tot,go[],next[],first[],Id[];
int ch[][],sz,num,sum[],w[],col[],tag[];
int dfn[],low[],pd[],vis[];
int st[],c[],belong[],fa[];
int rev[],size[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y,int id){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
Id[tot]=id;
}
void add(int x,int y,int id){
insert(x,y,id);
insert(y,x,id);
}
void tarjan(int x,int Fa){
dfn[x]=low[x]=++sz;
for (int i=first[x];i;i=next[i])
if (Id[i]!=Fa){
int pur=go[i];
if (!dfn[pur]){
tarjan(pur,Id[i]);
low[x]=std::min(low[x],low[pur]);
if (low[pur]>dfn[x]) pd[Id[i]]=;
}else{
low[x]=std::min(low[x],dfn[pur]);
}
}
}
void bfs(int x){
int h=,t=;c[]=x;vis[x]=;belong[x]=++num;
while (h<=t){
int now=c[h++];
for (int i=first[now];i;i=next[i]){
int pur=go[i];
if (pd[Id[i]]||vis[pur]) continue;
c[++t]=pur;
vis[pur]=;
belong[pur]=num;
}
}
}
bool isroot(int x){
return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
}
void pushdown(int x){
int l=ch[x][],r=ch[x][];
if (tag[x]!=){
int id=(tag[x]==)?:;
if (l)tag[l]=tag[x];
if (r)tag[r]=tag[x];
if (l&&w[l]) col[l]=id;
if (r&&w[r]) col[r]=id;
if (l) sum[l]=size[l]*id;
if (r) sum[r]=size[r]*id;
tag[x]=;
}
if (rev[x]){
rev[l]^=;
rev[r]^=;
rev[x]=;
std::swap(ch[x][],ch[x][]);
}
}
void updata(int x){
int l=ch[x][],r=ch[x][];
if (w[x]==){
col[x]=;sum[x]=;size[x]=;
if (l) sum[x]+=sum[l],size[x]+=size[l];
if (r) sum[x]+=sum[r],size[x]+=size[r];
return;
}
sum[x]=col[x];size[x]=;
if (l) sum[x]+=sum[l],size[x]+=size[l];
if (r) sum[x]+=sum[r],size[x]+=size[r];
}
void rotate(int x){
int y=fa[x],z=fa[y],l,r;
if (ch[y][]==x) l=;else l=;r=l^;
if (!isroot(y)){
if (ch[z][]==y) ch[z][]=x;else ch[z][]=x;
}
fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
updata(y);updata(x);
}
void splay(int x){
int top=;st[]=x;
for (int i=x;!isroot(i);i=fa[i])
st[++top]=fa[i];
for (int i=top;i;i--)
pushdown(st[i]);
while (!isroot(x)){
int y=fa[x],z=fa[y];
if (!isroot(y)){
if (ch[y][]==x^ch[z][]==y) rotate(x);
else rotate(y);
}
rotate(x);
}
//updata(x);
}
void access(int x){
for (int t=;x;t=x,x=fa[x]){
splay(x);
ch[x][]=t;
updata(x);
}
}
void makeroot(int x){
access(x);splay(x);rev[x]^=;
}
int find(int x){
access(x);splay(x);
while (ch[x][]) x=ch[x][];
return x;
}
void cut(int x,int y){
makeroot(x);access(y);splay(y);
ch[y][]=fa[ch[y][]]=;
updata(y);
}
void link(int x,int y){
makeroot(x);fa[x]=y;
}
int main(){
n=read();m=read();
for (int i=;i<=m;i++){
e[i].u=read();e[i].v=read();
add(e[i].u,e[i].v,i);
}
for (int i=;i<=n;i++)
if (!dfn[i]) tarjan(i,);
sz=;num=;
for (int i=;i<=n;i++)
if (!vis[i]) bfs(i);
sz=num;
for (int i=;i<=m;i++)
if (belong[e[i].u]!=belong[e[i].v]){
sz++;col[sz]=;tag[sz]=;sum[sz]=;w[sz]=;
size[sz]=;
link(sz,belong[e[i].u]);
link(sz,belong[e[i].v]);
}
int q=read();
while (q--){
int S=read(),T=read(),Num=read(),cnt=;
S=belong[S],T=belong[T];
for (int i=;i<=Num;i++){
e[i].u=read();e[i].v=read();
e[i].u=belong[e[i].u];
e[i].v=belong[e[i].v];
}
for (int i=;i<=Num;i++){
if (e[i].u==e[i].v) continue;
if (find(e[i].u)!=find(e[i].v)){
w[sz+i]=;sum[sz+i]=;
tag[sz+i]=;col[sz+i]=;
size[sz+i]=;
link(e[i].u,sz+i);
link(e[i].v,sz+i);
pd[i]=;
}else{
pd[i]=;
makeroot(e[i].u);access(e[i].v);splay(e[i].v);
tag[e[i].v]=;
}
}
if (find(S)!=find(T)){
puts("-1");
}else{
makeroot(S);access(T);splay(T);
printf("%d\n",sum[T]);
}
for (int i=Num;i>=;i--){
if (e[i].u==e[i].v) continue;
if (pd[i]==){
cut(e[i].u,sz+i);
cut(e[i].v,sz+i);
}else{
makeroot(e[i].u);access(e[i].v);splay(e[i].v);
tag[e[i].v]=-;
}
}
}
}
XJOI网上同步测试DAY14 T3的更多相关文章
- XJOI网上同步测试DAY14 T2
思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...
- XJOI网上同步测试DAY14 T1
思路:线段树维护最短路 #include<cstdio> #include<cmath> #include<iostream> #include<algori ...
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
- XJOI网上同步训练DAY1 T3
思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q ...
- XJOI网上同步训练DAY6 T2
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...
- XJOI网上同步训练DAY6 T1
思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- XJOI网上同步训练DAY3 T2
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...
- XJOI网上同步训练DAY3 T1
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...
随机推荐
- linux下ssh使用和配置
常用格式:ssh [-l login_name] [-p port] [user@]hostname 更详细的可以用ssh -h查看. 举例 不指定用户: ssh 192.168.0.11 指定用户: ...
- jquery表单实时验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- appcan里面模板的使用
1:首先要定义一个字符串如果太长需要换行,可以用"\"来分割每行 2:模板里面使用的是ejs语法,所以可以使用if else语句等 3:字符串定义好之后要用appcan.view. ...
- Zimbra8.x邮件服务器安装及配置
官网地址:http://www.zimbra.com/downloads 下载说明: 1. 版本: zimbra有两个大版本:Open Source Edition和 Network Ed ...
- SpringMVC 之文件上传 MultipartResolver
基于前面文章的基础上. 一.准备 需要的jar 二.配置 1. spmvc-servlet.xml <?xml version="1.0" encoding=" ...
- Unity3D AssentStore 下载的package存放目录(WinXP,Win8,Mac OS X)
网上找到如下: Windows 8,C:\Users\<你的用户名>\AppData\Roaming\Unity\Asset Store Mac OS X,~/Library/Unity/ ...
- struts2,hibernate,spring整合笔记(1)
今天终于配置好了ssh框架的整合,记录下过程供参考 环境:window8.1,jdk1.7 ,带有javaee的eclipse,也就是说要能发布web项目,TOMCAT服务器,tomcat配置涉及到环 ...
- web03--session
1.创建session1.jsp <body> <form action="session2.jsp" method="post"> & ...
- 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯
第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...
- C/C++安全编码-字符串
1 字符串 1.1 字符串基础 字符串提供命令行参数.环境变量.控制台输入.文本文件及网络连 接,提供外部输入方法来影响程序的行为和输出,这也是程序容易出错的地方.字符串是一个概念,并不是C/ ...