点击查看代码
/*
GGrun
*/
#include<bits/stdc++.h>
using namespace std;
namespace Octane {
//non terrae plus ultra dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define OCTANE // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define BUFFER_SIZE 100000 // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define ll long long // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define db double // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define ldb long double // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
char ibuf[100000], obuf[100000], *p1=ibuf,*p2=ibuf,*p3=obuf;
#ifdef ONLINE_JUDGE//dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define getchar() ((p1==p2) and (p2=(p1=ibuf)+fread(ibuf,1,\
BUFFER_SIZE,stdin),p1==p2)?(EOF):(*p1++)) // dqrdqrdqrdqrdqr
#define putchar(x) ((p3==obuf+BUFFER_SIZE) && (fwrite(obuf,\
p3-obuf,1,stdout),p3=obuf),*p3++=x) // dqrdqrdqrdqrdqrdqrdqr
#endif// fread in OJ, getchar in local dqrdqrdqrdqrdqrdqrdqr
#define isdigit(ch) (ch>47&&ch<58)//dqrdqrdqrdqrdqrdqrdqrdqr
#define isspace(ch) (ch<=32&&ch!=EOF)//dqrdqrdqrdqrdqrdqrdqr
#define isseen(ch) (ch>32) // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
struct Octane_t{~Octane_t(){fwrite(obuf,p3-obuf, 1, stdout);
}bool flag=false;operator bool(){return flag;} }io; template
<typename T>inline T read(){T s=0; int w = 1; char ch; while
(ch=getchar(), !isdigit(ch)&&(ch!=EOF))if(ch == '-') w = -1;
if(ch == EOF) return 0; while(isdigit(ch)) s = s*10+ch-48,ch
=getchar(); return s *= w; } template<typename T>inline bool
read(T &s) { s = 0; int w = 1; char ch; while(ch = getchar()
,!isdigit(ch)&&(ch!=EOF))if(ch == '-') w = -1; if(ch == EOF)
return false;while(isdigit(ch))s = s*10+ch-48, ch=getchar();
return s*=w,true;}inline bool read(char &s){while(s= getchar
(), isspace(s)); return s != EOF; } inline bool read(char *s
){char ch=getchar();while(isspace(ch))ch= getchar();if(ch ==
EOF)return false;while(isseen(ch)) *s++ = ch, ch= getchar();
*s='\000';return true;}template<typename T> void printv(T a)
{if(a== 0){ putchar('0'); return void(); }static char st[65]
; int top = 0; if (a < 0) putchar ('-'), a = - a; while(a)st
[++top]='0'+a%10,a/=10;while(top)putchar(st[top--]);} inline
void printv(char c){putchar(c);}inline void printv(char *s){
for(int i=0;s[i];i++)putchar(s[i]);}inline void printv(const
char *s){ for(int i=0;s[i];i++) putchar(s[i]); } inline void
printv(bool a){ if(a != 0)putchar('1'); else putchar('0'); }
#ifdef _GLIBCXX_STRING // support for string dqrdqrdqrdqrdqr
inline bool read(std::string& s) { s = ""; char ch; while(ch
=getchar(), isspace(ch)); if(ch == EOF) return false; while(
!isspace(ch)) s+=ch,ch=getchar(); return true; } inline bool
getline(Octane_t &io,std::string s){s="";char ch= getchar();
if(ch==EOF)return false;while(ch!='\n' and ch !=EOF)s+=ch,ch
=getchar();return true;}inline void printv(const std::string
&a){for(auto i = a.begin(); i != a.end(); ++i) putchar(*i);}
#endif// dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
template<typename T>inline void print(const char *p,T first)
{ int n = strlen(p) - 1; for(int i = 0; i <= n; i++) { if(p[
i] == '`') { putchar(p[++ i]); continue; } else if ( p[i] ==
'{'){printv(first); i++; continue; } else putchar(p[i]); } }
#if __cplusplus >= 201103L // support for many values dqrdqr
template<typename T,typename... T1>inline int read(T& a, T1&
...other){return read(a)+read(other...); } inline void print
(const char *p) { printv(p); }template<typename T1, typename
... T2>void print(const char*p, T1 first, T2 ...other) { int
n=strlen(p)-1; for(int i = 0; i <= n; i++) { if(p[i] == '`')
{putchar(p[++i]);continue;}else if(p[i]=='{'){printv(first);
print(p+i+2,other...);return void();}else putchar(p[i]); } }
#endif // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdq
template <typename T> Octane_t& operator >> (Octane_t &io, T
&b){return io.flag=read(b),io;}Octane_t& operator>>(Octane_t
&io, char *b){return io.flag=read(b), io;} template<typename
T>Octane_t&operator<<(Octane_t&io,T b){return printv(b),io;}
#define cout io// dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define cin io // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#define endl '\n' // dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#undef ll// dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#undef db// dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
#undef ldb//dqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqrdqr
} using namespace Octane;
// typedef long long ll;
// typedef unsigned long long ull;
typedef pair<int,int> pii;
#define mk make_pair
#define ps push_back
#define fi first
#define se second
const int N=1e5+10,inf=0x3f3f3f3f;
// const b linf=0x3f3f3f3f3f3f3f3f,mod=1e9+7;
int siz[N],fa[N],dep[N],dfn[N],son[N],top[N],tot;
int n,m,hd[N],cnt;
struct jj{
int to,next;
}bi[N<<1];
inline void ad(int x,int y){bi[++cnt]={y,hd[x]},hd[x]=cnt,bi[++cnt]={x,hd[y]},hd[y]=cnt;}
inline void dfs1(int x,int f){
dep[x]=dep[f]+1;fa[x]=f;siz[x]=1;
for(int i=hd[x];i;i=bi[i].next){
int j=bi[i].to;
if(j!=f){
dfs1(j,x);siz[x]+=siz[j];
siz[j]>siz[son[x]]?son[x]=j:0;
}
}
}
inline void dfs2(int x,int zu){
top[x]=zu;dfn[x]=++tot;
if(son[x])dfs2(son[x],zu);
for(int i=hd[x];i;i=bi[i].next){
int j=bi[i].to;
if(!dfn[j])dfs2(j,j);
}
}
int sz[N<<2],tag[N<<2];
bool t0[N<<2];
inline void qing(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return (void)(sz[k]=0,t0[k]=1,tag[k]=0);
int mid=l+r>>1;
if(t0[k])sz[k<<1]=sz[k<<1|1]=0,t0[k<<1]=t0[k<<1|1]=1,tag[k<<1]=tag[k<<1|1]=0,t0[k]=0;
if(tag[k]){sz[k<<1]+=tag[k]*(mid-l+1),sz[k<<1|1]+=tag[k]*(r-mid),tag[k<<1]+=tag[k],tag[k<<1|1]+=tag[k],tag[k]=0;}
if(L<=mid)qing(k<<1,l,mid,L,R);
if(R>mid)qing(k<<1|1,mid+1,r,L,R);
sz[k]=sz[k<<1]+sz[k<<1|1];
}
inline void add(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return (void)(sz[k]+=(r-l+1),++tag[k]);
int mid=l+r>>1;
if(t0[k])sz[k<<1]=sz[k<<1|1]=0,t0[k<<1]=t0[k<<1|1]=1,tag[k<<1]=tag[k<<1|1]=0,t0[k]=0;
if(tag[k]){sz[k<<1]+=tag[k]*(mid-l+1),sz[k<<1|1]+=tag[k]*(r-mid),tag[k<<1]+=tag[k],tag[k<<1|1]+=tag[k],tag[k]=0;}
if(L<=mid)add(k<<1,l,mid,L,R);
if(R>mid)add(k<<1|1,mid+1,r,L,R);
sz[k]=sz[k<<1]+sz[k<<1|1];
}
inline int ask(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return sz[k];
int mid=l+r>>1,ans=0;
if(t0[k])sz[k<<1]=sz[k<<1|1]=0,t0[k<<1]=t0[k<<1|1]=1,tag[k<<1]=tag[k<<1|1]=0,t0[k]=0;
if(tag[k]){sz[k<<1]+=tag[k]*(mid-l+1),sz[k<<1|1]+=tag[k]*(r-mid),tag[k<<1]+=tag[k],tag[k<<1|1]+=tag[k],tag[k]=0;}
if(L<=mid)ans=ask(k<<1,l,mid,L,R);
if(R>mid)ans+=ask(k<<1|1,mid+1,r,L,R);
return ans;
}
set<pii> s;
int man=0;
inline void add(int x,int y){
vector<pii> v,vdo;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])swap(x,y);
if(son[y])qing(1,1,n,dfn[top[y]],dfn[son[y]]);
else qing(1,1,n,dfn[top[y]],dfn[y]);
auto i1=s.lower_bound({dfn[top[y]],0}),i2=s.upper_bound({dfn[y],n});
for(auto i=i1;i!=i2;++i){
qing(1,1,n,(*i).se,(*i).se);
}
if(i1!=i2)s.erase(i1,i2);
vdo.ps({dfn[top[y]],dfn[y]}); v.ps({dfn[fa[top[y]]],dfn[top[y]]});
y=fa[top[y]];
}
if(dep[x]>dep[y])swap(x,y);
if(son[y])qing(1,1,n,dfn[x],dfn[son[y]]);
else qing(1,1,n,dfn[x],dfn[y]);
auto i1=s.lower_bound({dfn[x],0}),i2=s.upper_bound({dfn[y],n});
for(auto i=i1;i!=i2;++i){
qing(1,1,n,(*i).se,(*i).se);
}
if(i1!=i2)s.erase(i1,i2);
if(x!=y)add(1,1,n,dfn[x]+1,dfn[y]);
for(auto i:vdo){
add(1,1,n,i.fi,i.se);
}
s.insert(v.begin(), v.end());
}
inline int ask(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])swap(x,y);
ans+=ask(1,1,n,dfn[top[y]],dfn[y]);
y=fa[top[y]];
}
if(dep[x]>dep[y])swap(x,y);
if(x!=y)ans+=ask(1,1,n,dfn[x]+1,dfn[y]);
return ans;
}
#define fl(x) (fill(x+1,x+1+n,0))
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
// cout<<t<<endl;
// double ti=clock();
while(t--){
cin>>n>>m;
if(t!=2){qing(1,1,n,1,n);fill(hd+1,hd+1+n,0);cnt=0;tot=0;fill(son+1,son+1+n,0);s.clear();fl(dfn);}
for(int i=1,x,y;i<n;++i){
cin>>x>>y;
ad(x,y);
}
dfs1(1,0);dfs2(1,1);
for(int i=1,op,x,y;i<=m;++i){
cin>>op>>x>>y;
if(op==1)add(x,y);
else {
cout<<ask(x,y)<<'\n';
// return 0;
}
}
}
// cout<<man<<endl;
// cout<<(clock()-ti)<<endl;
}

dan的更多相关文章

  1. Dan计划:重新定义人生的10000个小时

    一. 1985年,芝加哥大学的Benjamin Bloom教授,出版了一本重要著作<如何培养天才>(Developing Talent in Young People). 他研究的是,如何 ...

  2. Dan计划:重新定义人生的10000个小时 - 阮一峰的网络日志

    Dan计划:重新定义人生的10000个小时 - 阮一峰的网络日志 Dan计划:重新定义人生的10000个小时

  3. Dan版本的nnet2

    除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则 Dan's setup does not uses pre-training. Da ...

  4. React函数式组件和类组件[Dan]

    一篇对Dan的 How Are Function Components Different from Classes? 一文的个人阅读总结,内容来自于此.强烈推荐阅读 Dan Abramov.的博客. ...

  5. bzoj2002弹(dan)飞绵羊 分块水过

    据说是道lct求深度的题 但是在小猫大的指点下用分块就n^1.5水过了 = =数据忘记加强系列 代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面... #include <cs ...

  6. Dan Zhang - Visual Studio ALM MVP

    I am a Microsoft Certified Partner specialising in .NET solutions, also worked as an ALM consultant. ...

  7. Raid与DAN、SAN、NAS基础

    一. 磁盘基本知识 1. Raid分类 Raid磁盘阵列是由多个磁盘组合成的磁盘组,可将数据分割成许多区段,分别存放在各个磁盘上:同时利用不同排列技术,可提高磁盘性能和数据安全性.下列简单介绍几种Ra ...

  8. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  9. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  10. 【C#公共帮助类】 Utils 10年代码,最全的系统帮助类

    为大家分享一下个人的一个Utils系统帮助类,可能有些现在有新的技术替代,自行修改哈~ 这个帮助类主要包含:对象转换处理 .分割字符串.截取字符串.删除最后结尾的一个逗号. 删除最后结尾的指定字符后的 ...

随机推荐

  1. AI的发展需要有应用和落地场景 —— 李开复:传统公司看不懂技术,大模型落地B端阻碍多

    引自:https://baijiahao.baidu.com/s?id=1801826206644007472&wfr=spider&for=pc "我们投了七八家机器人企业 ...

  2. OneFlow框架0.9.1dev版本,成功安装并运行

    安装cuda和cudnn: (此步骤可以忽略,pip安装框架时会自动安装依赖的cuda和cudnn环境) conda install cudatoolkit==11.8.0 python3 -m pi ...

  3. ( Ubuntu环境下 )Vim插件推荐-Python自动补齐Vim插件jedi-vim的安装(使用插件管理器vundle进行安装)

    Ubuntu系统下,为 Vim 安装python自动补齐的插件   jedi-vim   . 1.   jedi-vim安装依赖 首先,jedi-vim插件需要当前Vim版本支持python,在终端输 ...

  4. 并行化强化学习 —— 最终版本 —— 并行reinforce算法的尝试

    本文代码地址: https://gitee.com/devilmaycry812839668/final_-version_-parallelism_-reinforce_-cart-pole 结合了 ...

  5. 读博期间的宿舍 && 行李打包 —— 大连开发区校区

    =============================================

  6. 通过内存映射的方式向lcd屏幕输出几个圆

    /************************************************* * * file name:color.c * author :momolyl@126.com * ...

  7. 朋友吐槽我为什么这么傻不在源生成器中用string.GetHashCode, 而要用一个不够优化的hash方法

    明明有更好的hash方法 有位朋友对我吐槽前几天我列举的在源生成器的生成db映射实体的优化点 提前生成部分 hashcode 进行比较 所示代码 public static void Generate ...

  8. Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)

    三年前,我们开源了 Quickwit,一个面向大规模数据集的分布式搜索引擎.我们的目标很宏大:创建一种全新的全文搜索引擎,其成本效率比 Elasticsearch 高十倍,配置和管理显著更简单,并且能 ...

  9. fs4412 I2C驱动基于Cortex-A9,mpu6050裸机程序,驱动,I2C架构,有这一篇够了

    本文基于三星Cortex-A9架构,Exynos4412讲解I2C原理.以及基于I2C的mpu6050陀螺仪的数据读取实例(包括在裸机模式下数据的读取以及基于Linux驱动的读取).还会分析Linux ...

  10. JavaScript设计模式样例九 —— 桥接模式

    桥接模式(Bridge Pattern) 定义:是用于把抽象化与实现化解耦,使得二者可以独立变化. 目的:将抽象部分与实现部分分离,使它们都可以独立的变化. 场景:实现系统可能有多个角度分类,每一种角 ...