正题

题目链接:https://ac.nowcoder.com/acm/contest/7609/C


题目大意

给出nnn个点的一棵树,mmm个时刻各有一个操作

  1. 标记一个点,每个点被标记后的每一个时刻会标记掉周围的点。
  2. 删去所有点的标记
  3. 询问一个点是否有标记

解题思路

考虑没有二操作怎么搞,可以理解为标记代表起点,然后跑一遍最短路求出每个点被标记的最短时间。

如果有二操作的话是不是就很麻烦了,因为它像一个分割符一样切开两段操作。

那么就直接分开操作就好了!对于每段操作的所有点建立虚树,然后跑最短路就好了。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn),因为是树就用我们的老朋友SPFA\text{SPFA}SPFA就好了

正解是定期重构+SPFA\text{SPFA}SPFA的,懒得写


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10,T=18;
struct node{int to,next,w;
}a[N<<1];
int n,m,cnt,qnt,pnt,tot,top,ls[N];
int dep[N],dfn[N],f[N][T+1],s[N];
int ve[N],dis[N],t[N],p[N];
pair<int,int> q[N];bool v[N];
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void adde(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=dep[y]-dep[x];a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=dep[y]-dep[x];ve[++pnt]=x;ve[++pnt]=y;return;
}
void dfs(int x,int fa){dep[x]=dep[fa]+1;dfn[x]=++cnt;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;f[y][0]=x;dfs(y,x);}return;
}
int LCA(int x,int y){if(dep[x]>dep[y])swap(x,y);for(int i=T;i>=0;i--)if(dep[f[y][i]]>=dep[x])y=f[y][i];if(x==y)return x;for(int i=T;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];return f[x][0];
}
bool cmp(int x,int y)
{return dfn[x]<dfn[y];}
void Ins(int x){if(!top){s[++top]=x;return;}int lca=LCA(x,s[top]);while(top>1&&dep[s[top-1]]>dep[lca])adde(s[top-1],s[top]),top--;if(dep[s[top]]>dep[lca])adde(lca,s[top]),top--;if(s[top]!=lca||!top)s[++top]=lca;s[++top]=x;return;
}
void solve(){queue<int> q;sort(ve+1,ve+1+pnt);pnt=unique(ve+1,ve+1+pnt)-ve-1;for(int i=1;i<=pnt;i++){int x=ve[i];if(t[x])q.push(x),v[x]=1,dis[x]=t[x];}while(!q.empty()){int x=q.front();v[x]=0;q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dis[x]+a[i].w<dis[y]){dis[y]=dis[x]+a[i].w;if(!v[y])q.push(y),v[y]=1;}}}return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);for(int j=1;j<=T;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];cnt=tot=0;m++;memset(ls,0,sizeof(ls));memset(dis,0x3f,sizeof(dis));for(int z=1;z<=m;z++){int op,x;if(z==m)op=2;else scanf("%d%d",&op,&x);if(op==1){if(!t[x])p[++cnt]=x,t[x]=z;}else if(op==3)q[++qnt]=mp(x,z),p[++cnt]=x;else{sort(p+1,p+1+cnt,cmp);cnt=unique(p+1,p+1+cnt)-p-1;if(p[1]!=1)s[++top]=1;for(int i=1;i<=cnt;i++)Ins(p[i]);while(top>1)adde(s[top-1],s[top]),top--;solve();for(int i=1;i<=qnt;i++){if(dis[q[i].first]<=q[i].second)puts("wrxcsd");else puts("orzFsYo");}for(int i=1;i<=cnt;i++){int x=p[i];ls[x]=t[x]=0;dis[x]=1e9;}for(int i=1;i<=pnt;i++){int x=ve[i];ls[x]=t[x]=0;dis[x]=1e9;}cnt=qnt=top=tot=pnt=0;}}return 0;
}

2020牛客NOIP赛前集训营-提高组(第三场)C-牛半仙的妹子Tree【虚树,最短路】相关推荐

  1. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树

    链接:https://ac.nowcoder.com/acm/contest/7608/C 来源:牛客网 牛半仙有 n​ 个妹子,她们所在的位置组成一棵树,相邻两个妹子的距离为 1​. 有 m​ 个妹 ...

  2. 【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

    未完待续... T1:牛牛的方程式 title solution code T2:牛牛的猜数游戏 title solution code T3:牛牛的凑数游戏 title solution code ...

  3. 2020牛客NOIP赛前集训营-提高组(第一场) T2 牛牛的猜球游戏

    题目链接: 牛客原站 通过记录: 题目链接2:T277380 牛牛的猜球游戏(被我们搬到洛谷力): 洛谷搬运 题目描述   有十个数 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ...

  4. 【2020牛客NOIP赛前集训营-提高组(第二场)】题解(GCD,包含,前缀,移动)

    文章目录 T1:GCD title solution code T2:包含 title solution code(正解code补充在上面了) T3:前缀 title solution code T4 ...

  5. 2020牛客NOIP赛前集训营-提高组(第六场)A-袜子分配【组合数学,结论】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7615/A?&headNav=acm&headNav=acm 题目大意 nnn对颜色一样的袜子 ...

  6. 2020牛客NOIP赛前集训营提高组(第四场)B-色球【链表】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7611/B 题目大意 nnn个杯子,mmm个操作 在第zzz个杯子中依次加入xxx个颜色为yyy的球 在第yy ...

  7. 2021牛客OI赛前集训营-提高组(第五场)D-牛牛的border【SAM】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20110/D 题目大意 求一个长度为nnn的字符串的所有子串的borderborderborder长度和. 1 ...

  8. 2021牛客OI赛前集训营-提高组(第五场)C-第K排列【dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/20110/C 题目大意 一个长度为nnn的字符串SSS,SSS中存在一些???,有N/O/I/PN/O/I/P ...

  9. 2021牛客OI赛前集训营-提高组(第四场) T2空间跳跃

    2021牛客OI赛前集训营-提高组(第四场) 题目大意 给你三个整数 n , d , l n,d,l n,d,l, n n n为正整数.负整数或0, d , l d,l d,l为正整数,你现在有一个数 ...

最新文章

  1. Flask-RESTful的简单使用
  2. 基于BCH的SLP代币超过1000种,探秘SLP的内部生态
  3. 浅谈ThreadPool 线程池
  4. pycharm中同时注释多行代码
  5. redhat linux iso下载
  6. 20行代码实现(UartLogger)串口监控记录器
  7. 浅谈Nacos中的CAP
  8. 迷惘_飘云羽逸_新浪博客
  9. Python四舍五入问题详解
  10. Word文档编辑受限解决办法
  11. 技术博客变成情感博客了吧
  12. pp模块常用表 sap_SAP 常用表 MM PP SD FICO PM PS QM WM 等
  13. [ANSYS]重力场考虑与否讨论
  14. python实现PDF文件合并操作,附可直接使用的exe文件
  15. 【经验分享】GPU 显存不足怎么办?
  16. Nifi博客之一:概述贴
  17. GTK入门学习:glade的使用
  18. C/C++: 实现加减乘除。
  19. python mymsql sqlalchemy
  20. 数据仓库系列8-ETL系统设计与开发过程和任务

热门文章

  1. java io流学设置编码_Java学习日志(21-2-IO流-基本数据类型与字节数组对象与、编码解码)...
  2. 服务器运行慢都有哪些问题,服务器数据库的运行速度很慢问题
  3. linux仿真速度快吗,Linux上安装使用最快的GPU加速的终端仿真器Alacritty
  4. winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...
  5. 连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
  6. php curl 使用方法,php curl使用方法与步骤
  7. java 毕向东 内部类_java基础内部类(毕向东老师)
  8. 如何将nodejs项目程序部署到阿里云服务器上
  9. [蓝桥杯][算法提高VIP]夺宝奇兵-dp
  10. 网站 asp和php的用途,asp和php都有什么功能?