[bfs序 线段树] HDU5957. Query on a graph

(8)机器人动力学 机器人是一个具有多输入多输出的复杂动力学系统,存在严重的非线性,需要非常系统的方法对机器人进行动力学研究。常用的机器人动力学建模方法有:Lagrange(拉格朗日)动力学方法、Newton-Euler(牛顿-欧拉)动力学方法、Gauss(高斯)动力学方法、Kane(凯恩)动力学方法等。机器人动力学研究的是机器人的运动和作用力之间的关系。机器人的动力学问题包括动力学正问题和动力学逆问题。动力学正问题是对于给定的关节驱动力...... 阅读详情

求出bfs序

那么一个点的儿子和孙子都是在bfs序上连续的一段

记一下这个区间,然后线段树维护一下

因为有环,那么肯定有多出来的一条边,给这条边的两个端点以及这两个端点连出去的点打个标记就好了

细节贼多

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef long long ll;

const int N=100010;

int n,t,q,cnt,m,G[N];
struct edge{
  int t,nx;
}E[N<<1];

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}

inline void read(int &x){
  char c=nc(); x=0; int f=1;
  for(;c>'9'||c<'0';c=nc())if(c=='-')f=-f;for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc()); x*=f;
}

inline void addedge(int x,int y){
  E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt;
  E[++cnt].t=x; E[cnt].nx=G[y]; G[y]=cnt;
}

int fa[N],vis[N],sl[N],sr[N],gsl[N],gsr[N],Q[N],pos[N],d1[N],d2[N];
int l,r;

inline void bfs(){
  vis[1]=1; Q[l=r=1]=1; pos[1]=1;
  while(l<=r){
    int x=Q[l++];
    for(int i=G[x];i;i=E[i].nx)
      if(!vis[E[i].t]){
    Q[++r]=E[i].t; pos[E[i].t]=r; fa[E[i].t]=x; vis[E[i].t]=1;
      }
  }
  for(int k=r;k;k--){
    int x=Q[k]; sl[x]=gsl[x]=1<<30; sr[x]=gsr[x]=0;
    for(int i=G[x];i;i=E[i].nx)
      if(fa[E[i].t]==x){
    sl[x]=min(sl[x],pos[E[i].t]); sr[x]=pos[E[i].t];
    gsl[x]=min(gsl[x],sl[E[i].t]); gsr[x]=max(sr[E[i].t],gsr[x]);
      }
  }
  for(int i=1;i<=n;i++) d1[i]=d2[i]=0;
  for(int k=2;k<=cnt;k++){
    int x=E[k].t,y=E[k^1].t;
    if(fa[x]==y || fa[y]==x) continue;
    d1[x]=y; d1[y]=x;
    for(int i=G[x];i;i=E[i].nx)
      if(E[i].t!=y) d2[E[i].t]=y;
    for(int i=G[y];i;i=E[i].nx)
      if(E[i].t!=x) d2[E[i].t]=x;
  }
}

void PutAns(ll x){
  if(x>=10) PutAns(x/10); putchar(x%10+'0');
}

ll tag[N<<2],tot[N<<2],size[N<<2];

void Build(int g,int l,int r){
  tag[g]=tot[g]=0; size[g]=r-l+1;
  if(l==r) return ;
  int mid=l+r>>1;
  Build(g<<1,l,mid); Build(g<<1|1,mid+1,r);
}


inline void add(int g,ll x){
  tag[g]+=x; tot[g]+=size[g]*x;
}

inline void Push(int g){
  if(!tag[g]) return ;
  add(g<<1,tag[g]); add(g<<1|1,tag[g]); tag[g]=0;
}

inline void Up(int g){
  tot[g]=tot[g<<1]+tot[g<<1|1];
}

void Modify(int g,int l,int r,int L,int R,ll x){
  if(l>r) return;
  if(l==L && r==R) return add(g,x);
  int mid=L+R>>1; Push(g);
  if(r<=mid) Modify(g<<1,l,r,L,mid,x);
  else if(l>mid) Modify(g<<1|1,l,r,mid+1,R,x);
  else Modify(g<<1,l,mid,L,mid,x),Modify(g<<1|1,mid+1,r,mid+1,R,x);
  Up(g);
}

ll Query(int g,int l,int r,int L,int R){
  if(l>r) return 0;
  if(l==L && r==R) return tot[g];
  int mid=L+R>>1; Push(g);
  if(r<=mid) return Query(g<<1,l,r,L,mid);
  else if(l>mid) return Query(g<<1|1,l,r,mid+1,R);
  else return Query(g<<1,l,mid,L,mid)+Query(g<<1|1,mid+1,r,mid+1,R);
}

int main(){
  read(t);
  while(t--){
    read(n); cnt=1;
    for(int i=1;i<=n;i++)
      G[i]=vis[i]=fa[i]=0;
    for(int i=1,x,y;i<=n;i++)
      read(x),read(y),addedge(x,y);
    bfs(); Build(1,1,n);
    read(m);
    for(int i=1;i<=m;i++){
      char opt; while((opt=nc())!='M' && opt!='Q');
      if(opt=='M'){
    int x,k,d;
    read(x); read(k); read(d);
    if(k==0) Modify(1,pos[x],pos[x],1,n,d);
    else if(k==1){
      Modify(1,pos[x],pos[x],1,n,d);
      Modify(1,sl[x],sr[x],1,n,d);
      if(fa[x]) Modify(1,pos[fa[x]],pos[fa[x]],1,n,d);
      if(d1[x]) Modify(1,pos[d1[x]],pos[d1[x]],1,n,d);
    }
    else{
      if(fa[x]){
        Modify(1,pos[fa[x]],pos[fa[x]],1,n,d);
        Modify(1,sl[fa[x]],sr[fa[x]],1,n,d);
        if(fa[fa[x]]) Modify(1,pos[fa[fa[x]]],pos[fa[fa[x]]],1,n,d);
      }
      else Modify(1,pos[x],pos[x],1,n,d);
      Modify(1,sl[x],sr[x],1,n,d);
      Modify(1,gsl[x],gsr[x],1,n,d);
      if(d1[x]){
        int y=d1[x];
        if(fa[y] && fa[x]!=fa[y] && fa[y]!=fa[fa[x]] && fa[fa[y]]!=fa[x]) Modify(1,pos[fa[y]],pos[fa[y]],1,n,d);
        if(fa[y]!=fa[x]) Modify(1,pos[y],pos[y],1,n,d);
        Modify(1,sl[y],sr[y],1,n,d);
      }
      if(d2[x] && fa[d2[x]]!=fa[x] && fa[fa[d2[x]]]!=x && fa[d2[x]]!=x) Modify(1,pos[d2[x]],pos[d2[x]],1,n,d);
    }
      }
      else{
    ll ans=0; int x,k;
    read(x); read(k);
    if(k==0) ans=Query(1,pos[x],pos[x],1,n);
    else if(k==1){
      ans=Query(1,pos[x],pos[x],1,n)+Query(1,sl[x],sr[x],1,n);
      if(fa[x]) ans+=Query(1,pos[fa[x]],pos[fa[x]],1,n);
      if(d1[x]) ans+=Query(1,pos[d1[x]],pos[d1[x]],1,n);
    }
    else{
      if(fa[x]){
        ans=Query(1,pos[fa[x]],pos[fa[x]],1,n)+Query(1,sl[fa[x]],sr[fa[x]],1,n);
        if(fa[fa[x]]) ans+=Query(1,pos[fa[fa[x]]],pos[fa[fa[x]]],1,n);
      }
      else ans=Query(1,pos[x],pos[x],1,n);
      ans+=Query(1,sl[x],sr[x],1,n);
      ans+=Query(1,gsl[x],gsr[x],1,n);
      if(d1[x]){
        int y=d1[x];
        if(fa[y] && fa[y]!=fa[x] && fa[y]!=fa[fa[x]] && fa[fa[y]]!=fa[x]) ans+=Query(1,pos[fa[y]],pos[fa[y]],1,n);
        if(fa[y]!=fa[x]) ans+=Query(1,pos[y],pos[y],1,n);
        ans+=Query(1,sl[y],sr[y],1,n);
      }
      if(d2[x] && fa[d2[x]]!=fa[x] && fa[fa[d2[x]]]!=x && fa[d2[x]]!=x) ans+=Query(1,pos[d2[x]],pos[d2[x]],1,n);
    }
    if(ans<0) putchar('-'),ans=-ans;
    PutAns(ans); putchar('\n');
      }
      //for(int i=1;i<=n;i++) printf("%lld ",Query(1,pos[i],pos[i],1,n)); putchar('\n');
    }
  }
  return 0;
}
【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全) 摘要:DOTween动画插件使用指南 DOTween是Unity中强大的动画插件,比原生动画更便捷。安装后需进行初始化设置,通过工具菜单生成程序集。主要提供通用方法(DOTween.To)和便捷方法(如transform.DOMove)两种动画实现方式。插件支持丰富的动画设置(循环、缓动等)和事件回调(OnComplete、OnKill)。还提供动画管理功能,包括清除(DOTween.Clear)、完成(DOTween.CompleteAll)和终止(DOTween.KillAll)动画。常用功能涵盖移动、 阅读详情

相关推荐

养龙虾经验:OpenClaw用户必看的3个“省token”救命配置

本文分享了3个优化OpenClaw使用成本的配置方案:1)启用上下文压缩功能,可选择全局或单个代理设置,支持safeguard/adaptive两种压缩模式;2)修改SOUL.md提示词,要求模型回答简洁直接;3)限制对话历史长度。方案一效果最佳,可减少长对话的token消耗,但可能影响连贯性。三种方案可单独或组合使用,需根据实际场景调整参数。文章最后邀请读者分享使用痛点,将针对高频问题撰写解决方案。

wpplvhq的专栏 1417

HDU-5957 Query on a graph(线段树+树剖)

Query on a graph Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 73 Problem Description You are given a

十分残念的博客 1004

雪莉果的Axure原型工厂vol.006 中继器应用(二)——多选穿梭框

如果你用axure有一段时间了,那么你很快就能琢磨出一个大体设计流程,比如加一个中间过度的元件,来储存需要穿梭的内容;但是如果你再想一想,就会发现,这样做,似乎只能解决单选,那么多选需要怎么操作呢? 这时候,中继器就会告诉你,我还能做的更多。

weixin_43829792的博客 976

HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)&lt;=k的点的集合,操作1:将S(u,k)内节点权值增加或者减小,操作2:查询S(u,k)内节点的权值和 题解:因为题目说了查询和更新的距离小于等于k,k最大为2,所以很显然要分情况讨论k为0、1、2的...

buerdepepeqi的优快云博客 259

kettle实验十一:没有数据流入时停止操作

【实验目的】 1.利用Kettle的“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件,实现Kettle转换流程的控制。 2.熟练掌握“阻塞数据直到步骤都完成”,“检测空流”,“中止”等组件的使用,实现Kettle转换流程的控制。 【实验原理】 “检测空流”组件可以检测所在转换的输入数据,如果整个转换没有输入数据,通过“中止”组件终止整个转换的流程。在存在数据输入的情况,为了能让数据输出,需要和“阻塞数据直到步骤都完成”配合使用。当所有数据都已经从上个步骤“字段选择”读取完毕后,通过“阻塞数据直到步骤

weixin_44727274的博客 3848

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 523

HDU 5957 线段树 附数据生成器

题目大意: 给一个树,然后再随便再多连一条边,形成一个带一个环的树。 一开始,所有树的节点的权重为0 有2个操作。 操作1: 距离结点u距离小于k的所有节点,权重+D 操作2:询问距离节点u距离小于k的所有节点的权重之和。 思路: 先假设题目的图只是一棵树,找一个根节点,BFS一下,dfn[i]表示i节点的BFS时间序列。 可以看出,每个节点的所有儿子的

ACMer不要报考高校代码为13627的移通学院! 1044

实战指南:基于ELK与Grafana构建天融信防火墙日志可视化看板

本文详细介绍了如何基于ELK与Grafana构建天融信防火墙日志可视化看板,包括环境准备、日志收集与解析配置、Elasticsearch存储优化、Grafana看板设计等关键步骤。通过实战案例和优化技巧,帮助用户高效处理天融信防火墙日志,实现安全态势的可视化监控与分析。

weixin_34246529的博客 226

Query on a graph HDU - 5957

http://acm.hdu.edu.cn/showproblem.php?pid=5957 好想但是难写 先求个生成树 并把多余边记下来 跑个bfs序并用线段树维护 bfs序和dfs序略有不同 对一个节点 遍历一遍其所有子节点并取最小最大值会得到其一级子节点在bfs序中的区间 再跑一遍就会得到二级子节点在bfs序中的区间 依此类推 然后就是恶心的分类讨论 写了一屏都没写完。。索性把所有要...

sunyutian1998的博客 238

雷达回波仿真

文章目录前言一、基础理解1.慢时间维度和快时间维度2.脉冲压缩3.MTI4. 脉冲多普勒处理5.cacfar检测二、具体流程1.产生回波信息加入目标时延以及噪声2.解调回波得到基带信号3.脉冲压缩 MTI MTD cafar检测 前言 雷达算法仿真学习,主要流程包括生成目标回波,将基带信号加在载波上其次是加上目标信息和干扰信号后发射,解调回波信号得到基带信号然后MTI,MTD,最后再检测。 一、基础理解 1.慢时间维度和快时间维度 连续M个脉冲回波经过相干解调之后的基带数据形成的一个二维数据矩阵,.

qq_42961235的博客 1万+

android osmdroid 加载常用离线地图格式(开源的在线地图)

osmdroid是(几乎)完整/免费更换为Android MapView(v1 API)类。它还包括一个模块化的瓷砖供应商系统支持众多的在线和离线瓷砖来源和覆盖支持内置覆盖绘制图标,跟踪位置和形状。如果想在你项目中使用osmdroid,绝对是灵活度最高,不用申请百度,高德等的key。还有一堆规则要遵循。osmdroid可以支持多图层叠加,绘制自已的图层。离线加载常用地图格式zip,sqlite,.

mmsx990的博客 1万+

牛影传说【线段树+BFS序运用】

题目:牛影村有N个据点,这些据点有N-1条双向道路连接,任意两个据点之间有且仅有一条路径相通。最初每个据点都驻扎着一些牛。神牛H具有法力无边的能力,他随时都可能会降临牛影村的某个据点,每来到一个据点,他可能使用如下三种法力中的一种:  1、在据点i中选择一头强壮的牛,复制一个一模一样的。(无牛可以继续复制 即直接+1即可)  2、把据点i及其所有与i有道路连接的据点中的所有牛都复制一分(这些据点的...

朝圣长生路 516

《从底层结构开始学习FPGA》目录与传送门

《从底层结构开始学习FPGA》目录与传送门

孤独的单刀 16万+

[BFS序+线段树]HDU 5957Query on a graph 题解

题目大意 给出一个n个点n条边的图,有两种操作: 1.Uptate x k d 将所有距离x距离不超过k的所有节点加d 2.Query x k 统计所有距离x距离不超过k的所有节点 n≤105,0≤k≤2n\le 10^5,0\le k \le 2n≤105,0≤k≤2 解题分析 基环树常用套路:将整个环当做一个根节点,然后建树。 然后用BFS建树的时候可以得到一个进队列的顺序,称之为BFS序(相...

Wflower的Blog //What are you waiting for? 368

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【HDU】5957 Query on a graph【分类讨论+bfs序线段树】

题目链接:Query on a graph水题#include <bits/stdc++.h> using namespace std ;typedef long long LL ; typedef pair < int , int > pii ; typedef unsigned long long ULL ;#define clr( a , x ) memset ( a , x , sizeof

poursoul 1360

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU - 5957 Query on a graph (bfs序 + 线段树 + 分类大讨论)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题目大意:给出一个n个点n条边的图,保证图中没有自环和重边,图中的结点的初始权值为0。接下来进行q次操作,每次操作有以下两种: MODIFY u k d:将与点u的距离小于等于k的点的权值加上d; QUERY u k:查询所有与点u的距离小于等于k的点的权值和。 题目思路:由于给出的图是...

Lee_w_j__的博客 424

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Query on a graph HDU5957 沈阳ICPC重现赛

Query on a graph Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 369    Accepted Submission(s): 81 Problem Description You are give

SUNSET 725

hdu 5957 Query on a graph

题解: 毒瘤题......首先bfs跑一遍图,生成一棵树,则只有一条边没有用上而且这条边链接的两个点在该树上的深度差为<=1,即深度差为-1,0,1三种情况(因为深度差大于2的话,bfs就会选这跳边当做树边了)。 做完bfs序后就可以直接上线段树了,因为每一层的数刚好是连续了,分情况讨论,k=0,k=1的情况比较好写,但k=2的时候情况很多。。。。 特殊边的点跟查找的...

qq_18869763的博客 202

Query on a graph(基环树 距离2区间更新 线段树 bfs序)

原题: http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意: 给出一个联通的简单图,NNN点NNN边,也就是基环树。现在有两种操作: 更新离点ppp距离小于等于kkk的点,使其权值加vvv 查询离点ppp距离小于等于kkk的点的权值和 解析: 基环树可以看成是一个环将一片森林的的根连起来。我们先拓扑一下,找到环上的点,放入根集合。 然后对于每个根...

QAQ 414

HDU 5957 Query on a graph

HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图。 有\(M \le 10^5\)操作: \(MODIFY\ u\ k\ d,k \le 2\):距离点\(u\)不超过\(k\)的点的权值都加上\(d\)。 \(QUERY\ u\ k\):询问距离\(d\)不超过\(k\)...

weixin_30871701的博客 99

HDU5957 Query on a graph

线段树 BFS序 题目传送门 **题目大意:**一个基环树,有点权。有询问和修改操作。修改有三个参数u,k,du,k,du,k,d,表示把距离uuu不超过kkk(包括自己,下同)的点都加上ddd。查询有两个参数u,ku,ku,k,表示求距离uuu不超过kkk的点权和。n≤1e5,k≤2n\leq 1e5,k\leq 2n≤1e5,k≤2。 先别管那条非树边。当k=1k=1k=1的时候是维护它爸爸和...

forezxl的博客 340

[环套树 bfs序] ICPC 2016 Shenyang J & HDU5957 Query on a graph

按层建线段树,或者说是bfs序。 然后修改的一定是不超过5层里面的连续的段,可以在线段树上直接修改。 对于环+树,把环抠出来之后按树的方法做。代码丑#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll;inline char nc(){ static c

雯舞 780

HDU4008 Parent and son - dfs序/bfs序 - 线段树

传送门 题解:换根操作是老套路,这个有一问是求儿子中的信息,要用bfs序来维护; 要注意的是要求儿子的bfs序和本身并不是连续的。 代码: #include #include #include #include #include #define MAXN 100010 #define MAXM 200010 #define MAXL 20 #define INF (MAXN-2) #def

Mys_C_K的博客 814

bfs序上建线段树维护树层信息/dfs序上建线段树维护子树信息

dfs过程中遍历到栈中某个结点是先完成全部子树的过程才会出栈。这个过程的得到的dfs序每个个点出现两次中间就是其子树 bfs序不同,为先出队列再压进新的结点,如此得到的每个数出现两次间就是树层信息,也就是同高度。 ...

DevourPower的博客 294

hdu5957 ICPC-2016 沈阳 I bfs序+线段树+分类讨论

题面 思路: 用线段树维护bfs序,因为同一层的儿子的bfs序连续 很久没有写过分类讨论了 细节错误很多: 1. k == 2时要判在不在环上,环够不够长,fa[x]在不在环上 2. bfs序只保证所有儿子在连续区间,而层与层之间是不连续的。开始竟然天真的以为是连续的 调了 1h多 还写了 30多min 代码能力要加强! #include &lt;bits/stdc++.h&gt; #defin...

执子之手,与子偕老 307

『CSU 1322』ZY‘s new company(线段树维护bfs序)

转载声明:http://blog.csdn.net/alpc_neverfarewell/article/details/39160735题意: zzy开了一家公司,然后他为公司制定了人事制度:为每个员工都定一个直接的上属(除了zzy自己),这样就把公司表示成了一个树形的人事关系图,树的最顶端就是zzy自己。如果a的直接上属是b则称a是b的一级下属,接下去的依次称为2级、3级……k级下属。由于如z

Gavinjou大笨象的博客 1189
上一篇: [dfs] Codeforces717E. Paint it really, really dark gray
下一篇: [构造] BZOJ5100 [POI2018]. Plan metra
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值