当前位置: 首页 > news >正文

D. Beard Graph

https://codeforces.com/problemset/problem/165/D

主要是边转点

后面都是简单的线段树维护

我们维护ok标记,val值,黑(1),白(0) 

id.ok=l.ok&r.ok

id.val=l.val+r.val

注意特判如果两个点一样是0,如果dfn[u]+1>dfn[v]就不用询问了直接返回

code

// Problem: Beard Graph
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF165D
// Memory Limit: 250 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<vector>
using namespace std;
const int N=1e5+9;
int n;
int a[N];
struct edge{int u,v,w;
}ee[N];
vector<edge> e[N];
void add(int u,int v){e[u].push_back({v,u,1});e[v].push_back({u,v,1});
}
int sz[N],fa[N],wc[N],dep[N],dis[N];
void dfs1(int u,int f){fa[u]=f;sz[u]=1;dep[u]=dep[f]+1;for(auto &[x,y,z] : e[u]){if(x==f){dis[u]=z;continue;}if(x!=f){dfs1(x,u);sz[u]+=sz[x];if(sz[x]>sz[wc[u]]){wc[u]=x;}}}
}
int top[N],dfn[N],vistime;
void dfs2(int u,int Top){dfn[u]=++vistime;a[vistime]=dis[u];top[u]=Top;if(wc[u]){dfs2(wc[u],Top);for(auto &[x,y,z] : e[u]){if(x!=wc[u] && x!=fa[u]){dfs2(x,x);}}}
}
//线段树
struct SEG{#define INF (1<<31)#define ll long long#define tl(id) (id<<1)#define tr(id) (id<<1|1)#define li inlinestruct node{int l,r;int ok;ll val;}seg[N<<2];void pushup(node &id,node &l,node &r){id.ok=l.ok&r.ok;id.val=l.val+r.val;}void pushup(int id){pushup(seg[id],seg[tl(id)],seg[tr(id)]);}li int inrange(int L,int R,int l,int r){return l<=L && R<=r;}li int outofrange(int L,int R,int l,int r){return L>r || R<l;}li void build(const int id,int l,int r){seg[id]={l,r};if(l==r){seg[id].val=a[l];seg[id].ok=a[l];return;}int mid=(l+r)>>1;build(tl(id),l,mid);build(tr(id),mid+1,r);pushup(id);}li void update(int id,int l,int r,int pos,int v){if(l==r){seg[id].val=v;seg[id].ok=v;return;}int mid=(l+r)>>1;if(mid>=pos){update(tl(id),l,mid,pos,v);}else{update(tr(id),mid+1,r,pos,v);}pushup(id);}li node query(int id,int l,int r){if(seg[id].l>=l && seg[id].r<=r){return seg[id];}else{int mid=(seg[id].l+seg[id].r)>>1;if(mid>=r){return query(tl(id),l,r);}else if(mid<l){return query(tr(id),l,r);}else{node res;node left=query(tl(id),l,r);node right=query(tr(id),l,r);pushup(res,left,right);return res;}}}
}t;
#define node SEG::node
ll ask(int u,int v){ll res=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]]){swap(u,v);}node tt=t.query(1,dfn[top[u]],dfn[u]);if(!tt.ok){return -1;}else{res+=tt.val;}u=fa[top[u]];}if(dfn[u]>dfn[v]){swap(u,v);}if(dfn[u]+1>dfn[v]){return res;}node tt=t.query(1,dfn[u]+1,dfn[v]);if(!tt.ok){return -1;}else{res+=tt.val;}return res;
}
int main(){cin>>n;for(int i=1;i<=n-1;i++){int u,v;cin>>u>>v;ee[i]={u,v,1};add(u,v);}dfs1(1,0);dfs2(1,1);t.build(1,1,n);int m;cin>>m;for(int i=1;i<=m;i++){int op;cin>>op;if(op==1){int u;cin>>u;if(dep[ee[u].u]>dep[ee[u].v]){u=ee[u].u;}else{u=ee[u].v;}t.update(1,1,n,dfn[u],1);}else if(op==2){int u;cin>>u;if(dep[ee[u].u]>dep[ee[u].v]){u=ee[u].u;}else{u=ee[u].v;}t.update(1,1,n,dfn[u],0);}else{int u,v;cin>>u>>v;if(u==v){cout<<0<<'\n';}else{cout<<ask(u,v)<<'\n';}}}return 0;
}

http://www.lryc.cn/news/430258.html

相关文章:

  • 使用预训练的 ONNX 格式的 YOLOv8n 模型进行目标检测,并在图像上绘制检测结果
  • mac安装xmind
  • MySQL分区表入门
  • StarRocks 存算分离数据回收原理
  • 【运维】Linux中的xargs指令如何使用?
  • 日志审计-graylog ssh登录超过6次告警
  • 4. kafka消息监控客户端工具
  • 鸿蒙环境和模拟器安装
  • 【图文并茂】ant design pro 如何对接后端个人信息接口
  • MySQL运维学习(1):4种日志
  • 代码随想录算法训练营第二十天(二叉树 七)
  • Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
  • Cookie和Session是什么?它们的区别是什么?
  • Python正则表达式提取车牌号
  • 视觉引导机械臂学习记录
  • 插屏广告在游戏APP中广告变现的独特优势
  • Python数据分析:数据可视化(Matplotlib、Seaborn)
  • Java CompletableFuture:你真的了解它吗?
  • 5个免费在线 AI 绘画网站推荐,附100+提示词!
  • C++基础语法:while的使用
  • 鹏哥C语言自定义笔记重点(29-)
  • 代码随想录算法训练营第六十天 | dijkstra(堆优化版)、Bellman_ford 算法精讲
  • boost::asio 库版本,C/C++代码编译兼容性
  • 前端开发的项目导入方法与应用
  • C++:模拟实现string
  • 浅谈Kafka(一)
  • Redis7基础篇(八)
  • Tauri简介
  • JavaWeb——MVC架构模式
  • Excel求和方法之