蝉(90分的暴力)
来源:互联网 发布:scratch编程教程 pdf 编辑:程序博客网 时间:2024/04/30 03:20
n个点的树,m次操作
给出一棵树,维护下列操作:
1.在x位置放上一只蝉。(如果已经有蝉,忽略此操作)
2.查询x位置的坏掉指数(坏掉指数是指距x位置最近的蝉的距离)
一开始时在1的位置有一只蝉。
10% N,M ≤ 10
40% N,M ≤ 100
100% N ≤ 2 × 10^5 ,M ≤ 10^5
那我们用暴力来做好了,每次放入蝉时,更新一下每个蝉的坏掉指数,用bfs或者dfs来实现。此处有一个剪枝,如果更新到的点的坏掉指数<=更新来的前一个点的坏掉指数+1,那就不用再往下更新了。
这样可以拿到90分。最好是在1操作时跑一下暴力,因为一般都是查询的点比较多。
dfs
#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<algorithm>#include<queue>using namespace std;int n,m;int head[200009],nxt[400009],num[400009],cnt;int mind[200009];void add(int x,int y){ cnt++; num[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt;}int ans;void dfs(int x,int step,int father){ mind[x]=min(mind[x],step); for(int i=head[x];i;i=nxt[i]) { if(num[i]!=father&&step<mind[num[i]]) dfs(num[i],step+1,x); }}int main(){ //freopen("cicada.in","r",stdin); //freopen("cicada.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y);add(y,x); } memset(mind,127,sizeof(mind)); dfs(1,0,0); for(int i=1;i<=m;i++) { int opt,x; scanf("%d%d",&opt,&x); if(opt==1&&mind[x]) dfs(x,0,0); else {printf("%d\n",mind[x]);} } return 0;}
bfs
#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<algorithm>#include<queue>using namespace std;int n,m;int head[200009],nxt[400009],num[400009],cnt;int mind[200009];void add(int x,int y){ cnt++; num[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt;}void bfs(int x){ queue <int> q; q.push(x); while(!q.empty()) { int k=q.front();q.pop(); for(int i=head[k];i;i=nxt[i]) { if(mind[num[i]]>mind[k]+1) q.push(num[i]),mind[num[i]]=mind[k]+1; } }}int main(){ freopen("cicada.in","r",stdin); freopen("cicada.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y);add(y,x); } memset(mind,127,sizeof(mind)); mind[1]=0; bfs(1); while(m--) { int opt,x; scanf("%d%d",&opt,&x); if(opt==1&&mind[x]) mind[x]=0,bfs(x); else printf("%d\n",mind[x]); } return 0;}
阅读全文
1 0
- 蝉(90分的暴力)
- number 90分的暴力
- P1979 [NOIP]华容道(70分的暴力)
- 关于暴力&瞎搞骗分的一些实例
- 分糖果系列一(DP+暴力)
- 分书问题 暴力求解
- 分块(有理有据的暴力)
- 改进的SMS4算法的差分故障与暴力联合攻击
- HDU 2098 分拆素数和(筛法求素数+暴力枚举)
- BNUOJ 52296 Nearest Neighbor Search(十一弱校联盟 暴力分情况)
- (暴力55分+卡常95分补全版)NOIP 2015 D2 T3运输计划
- HDU4389分区间打巨表,暴力搜索
- bzoj2241 打地鼠 暴力&&二维差分
- poj 2769 暴力(memset的限制)
- HDU - 4821 (暴力的复杂度计算)
- zzuli 1784: Camellia的难题 (暴力)
- FZU 2191完美的数字 (暴力)
- 蓝桥杯--2013--马虎的算式(暴力)
- 05:输出亲朋字符串
- Caffe中的依赖包
- LINQ to XML LINQ学习第一篇
- Tableau 圆环图的制作
- 设计模式(15) 命令模式(简单入门 行为模式)
- 蝉(90分的暴力)
- 双目视觉相关学习
- 线段树模板
- Maven学习笔记(二)-pom.xml 配置详解
- 使用[chromaprint]获取声音指纹
- 3. Managing the lifecycle of a Basic Thread
- C小加 之 随机数
- HDU 3410 Passing the Message
- JEESZ分布式架构集成阿里云OSS存储