点击查看代码
/*
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. 【AJAX】Asynchronous JavaScript And XML (非同步的JS & XML)

    什么是AJAX? 按照使用的感觉来看 说到底就是一个可以不刷新网页就能发送POST & GET请求的技术 AJAX 即"Asynchronous Javascript And XML ...

  2. python画图报错:OSError: 'seaborn-whitegrid' is not a valid package style

    解决方法: https://stackoverflow.com/questions/78019854/matplotlib-seaborn-whitegrid-is-not-a-valid-packa ...

  3. pygame游戏:python版本的贪吃蛇游戏 —— Python 贪吃蛇魔改大赛

    在网上找python版本的贪吃蛇游戏,看到一个Gitee Community / Python 贪吃蛇魔改大赛,感觉还不错,这里收藏下. 一等奖 1名 Snake Quest 蛇蛇闯关: jeffya ...

  4. 从baselines库的common/vec_env/vec_normalize.py模块看方差的近似计算方法

    在baselines库的common/vec_env/vec_normalize.py中计算方差的调用方法为: RunningMeanStd 同时该计算函数的解释也一并给出了: https://en. ...

  5. 社区6月月报 | Apache SeaTunnel重要更新与优化记录

    各位热爱Apache SeaTunnel的小伙伴们,社区6月份月报来啦!这里将记录Apache SeaTunnel社区每月的重要更新,欢迎关注. 月度Merge Stars 感谢以下小伙伴上个月为Ap ...

  6. JS Map对象与map方法

    前言  最近遇到一个遍历的问题,查资料的过程中,发现有个 Map 对象,提供了很多方法可以轻松地获取我们想要的数据,之前只知道有 map ,没想到还有 Map ,是不是有点绕?不急,这两个东西都是虽然 ...

  7. .NET 轻量化定时任务调度 FreeScheduler

    前言 在平时项目开发中,定时任务调度是一项重要的功能,广泛应用于后台作业.计划任务和自动化脚本等模块. FreeScheduler 是一款轻量级且功能强大的定时任务调度库,它支持临时的延时任务和重复循 ...

  8. js正则匹配以$开头和结尾的内容,并改变颜色

    let res = "$你好你好$" res = res.replace(/\$(?<=\$).*?(?=\$)\$/g, `<span onclick="( ...

  9. 关于Protobuf在使用中的一些注意点

    Protobuf是谷歌旗下的一款二进制序列化协议 协议的编写 在项目中新建一个xxx.proto文件 文件的格式 第一行写protobuf的版本 syntax = "proto3" ...

  10. SparkStreaming本地化策略性能调优与使用场景分析

    1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...