Code:

#include <map>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std; void setIO(string a){
freopen((a+".in").c_str(),"r",stdin);
freopen((a+".out").c_str(),"w",stdout);
} #define N 30005
#define Q 40005
#define M 100005 int n,m,cnt=1;
int head[N];
int to[M<<1];
int nex[M<<1]; int siz[N];
int f[N];
int son[N];
int dep[N];
int uu[M<<1];
int vv[M<<1];
bool tag[M<<1];
bool vis[N]; void addedge(int u,int v){
nex[++cnt]=head[u],head[u]=cnt,to[cnt]=v;
uu[cnt]=u,vv[cnt]=v;
} void dfs1(int u,int fa,int depth){
siz[u]=1,f[u]=fa,vis[u]=1,dep[u]=depth+1;
for(int v=head[u];v;v=nex[v]){
if(!vis[to[v]]&&to[v]!=fa) {
tag[v]=tag[v^1]=1;
dfs1(to[v],u,depth+1);
siz[u]+=siz[to[v]];
if(siz[to[v]]>siz[son[u]]) son[u]=to[v];
}
}
} int A[N];
int top[N];
int cnt2=0; void dfs2(int u,int tp){
top[u]=tp;
A[u]=++cnt2;
if(son[u])dfs2(son[u],tp);
for(int v=head[u];v;v=nex[v])
if(to[v]!=son[u]&&to[v]!=f[u]&&tag[v])dfs2(to[v],to[v]);
//if(!son[u]) son[u]=u;
} int sumv[N<<2];
int lazy[N<<2]; #define lson (o<<1)
#define rson (o<<1)|1 void pushup(int o){
sumv[o]=sumv[lson]+sumv[rson];
if(lazy[lson]&&lazy[rson]) lazy[o]=1,sumv[o]=0;
}
void build(int l,int r,int o){
if(l>r)return;
if(l==r) {
sumv[o]=1;
if(l==1)sumv[o]=0;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
pushup(o);
}
void modify(int l,int r,int o,int L,int R){
if(l>r||r<L||l>R)return;
if(lazy[o])return;
if(l>=L&&r<=R){
sumv[o]=0;
lazy[o]=1;
return;
}
int mid=(l+r)>>1;
modify(l,mid,lson,L,R);
modify(mid+1,r,rson,L,R);
pushup(o);
}
int query(int l,int r,int o,int L,int R){ if(lazy[o]||l>r||r<L||l>R)return 0;
if(l>=L&&r<=R)return sumv[o];
int mid=(l+r)>>1;
return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
}
void update(int a,int b){
while(top[a]!=top[b]){
if(dep[top[a]]>dep[top[b]]) swap(a,b);
modify(1,n,1,A[top[b]],A[b]),b=f[top[b]];
}
if(a==b)return ;
if(dep[a]>dep[b]) swap(a,b);
modify(1,n,1,A[son[a]],A[b]);
} int lookup(int a,int b){
int sums=0;
while(top[a]!=top[b]){
if(dep[top[a]]>dep[top[b]]) swap(a,b);
sums+=query(1,n,1,A[top[b]],A[b]);
b=f[top[b]];
}
if(a==b) return sums;
if(dep[a]>dep[b])swap(a,b);
sums+=query(1,n,1,A[son[a]],A[b]);
return sums;
} struct Edge{
int from,to,t;
Edge(int from=0,int to=0,int t=0):from(from),to(to),t(t){}
}edges[M];
struct Ask{
int a,b,c;
Ask(int a=0,int b=0,int c=0):a(a),b(b),c(c){}
}asks[Q];
typedef pair<int,int> P;
map<P,int>idx;
int curr;
int answer[Q];
int cnans;
int main(){
//setIO("input");
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int a,b;
scanf("%d%d",&a,&b);
if(a>b)swap(a,b);
edges[i]=Edge(a,b,0);
idx[P(a,b)]=i;
}
while(1){
int a,b,c;
scanf("%d%d%d",&c,&b,&a);
if(c==-1) break;
if(a>b)swap(a,b);
asks[++curr]=Ask(a,b,c);
if(c!=1&&idx[P(a,b)]) edges[idx[P(a,b)]].t=1;
}
for(int i=1;i<=m;++i)
if(edges[i].t!=1)
addedge(edges[i].from,edges[i].to),addedge(edges[i].to,edges[i].from);
dfs1(1,0,0);
dfs2(1,1);
build(1,n,1);
for(int i=2;i<=cnt;i+=2)
if(!tag[i]){
tag[i]=tag[i^1]=1;
update(uu[i],vv[i]);
} for(int i=curr;i>=1;--i)
{
if(asks[i].c==1) answer[++cnans]=lookup(asks[i].a,asks[i].b);
else update(asks[i].a,asks[i].b);
}
for(int i=cnans;i>=1;--i) printf("%d\n",answer[i]);
return 0;
}

  

洛谷 P2542 [AHOI2005]航线规划 树链剖分_线段树_时光倒流_离线的更多相关文章

  1. 洛谷 P2542 [AHOI2005]航线规划 解题报告

    P2542 [AHOI2005]航线规划 题目描述 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由千百万星球构成的Samuel星系 ...

  2. 洛谷P2542 [AHOI2005]航线规划(LCT,双连通分量,并查集)

    洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一 ...

  3. 洛谷 P2542 [AHOI2005]航线规划(Link-cut-tree)

    题面 洛谷 bzoj 题解 离线处理+LCT 有点像星球大战 我们可以倒着做,断边变成连边 我们可以把边变成一个点 连边时,如果两个点本身不联通,就\(val\)赋为\(1\),并连接这条边 如果,两 ...

  4. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

  5. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  6. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  7. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  8. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  9. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

随机推荐

  1. ios修改了coredata数据结构后,更新安装会闪退

    如果iOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表.字段等操作),那在覆盖安装程序时就要进行CoreData数据库的迁移,具体操作如下: 1.选中你的mydata.xc ...

  2. vue中router-link的click事件失效的解决办法

    title: vue中router-link的click事件失效的解决办法 toc: false date: 2018-12-04 16:28:49 categories: Web tags: vue ...

  3. Oracle数据库to_date函数注意事项

    使用PL/SQL连接到Oracle数据库服务器,执行一条update语句: update pjnl set transtime = to_date('2015-05-14 12:13:20','yyy ...

  4. load多个数据文件的yaml

    VERSION: 1.0.0.1DATABASE: testUSER: adminHOST: node31PORT: 5432GPLOAD: INPUT: - SOURCE: LOCAL_HOSTNA ...

  5. 《Unix环境高级编程》读书笔记 第3章-文件I/O

    1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...

  6. Python2x,3x源码的区别,编译型解释型,变量,注释,if,用户交互input,基本数据类型3种

    cpu 内存 硬盘 操作系统 ​ cpu: 计算机的运算和计算中心,相当于人类的大脑. ​ 内存:暂时存储数据,临时加载数据应用程序,4G,8G,16G,32G #速度快,造价高,断电即消失 ​ 硬盘 ...

  7. GDOI2018爆炸记

    Day0 12:45p.m. 从初中部出发前回班探望了一下同学,受到热烈欢迎(?) 13:15p.m. 出发去中山,路上本来想用mac看fz的,结果ass字幕导入失败,心态爆炸*1:后来成功获取xfz ...

  8. Centos6.6 系统优化

    1:最小化安装 2:修改网卡 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=52:54:00:0e:c2:c3TYPE ...

  9. 紫书 例题8-4 UVa 11134(问题分解 + 贪心)

     这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...

  10. GenIcam标准(三)

    2.6. 缓存 如果某个实现对每个写操作支持范围.实现和可用状态的检查,通常会触发一系列对相机的读操作.大多数用于有效性检查的数值很少或不会发生变化,所以可以放入缓存.相机描述文件包含所有必需的定义以 ...