Jzoj3717【NOI2014模拟7.2】火车

博客介绍了A国城市间独特的交通网络,其中火车必须按照特定规则行驶,即每次停在未访问过的m个城市中最靠前的一个。这个问题被识别为树剖问题,解决方案涉及使用树状数组进行区间标记。由于数据的特殊性,DFS可能导致栈溢出,因此建议从中间开始执行DFS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A国有n个城市,城市之间有一些双向道路相连,并且城市两两之间有唯一路径。现在有火车在城市a,需要经过m个城市。火车按照以下规则行驶:每次行驶到还没有经过的城市中在m个城市中最靠前的。现在小A想知道火车经过这m个城市后所经过的道路数量。

很显然的树剖题目嘛,加上个区间打标记即可,可以用树状数组

注意数据很坑,dfs爆栈,所以要从最中间开始dfs

(真的不知道为什么是NOI模拟)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 500010
using namespace std;
struct Edge{ int v,nt; } G[N<<1];
int h[N],f[N],d[N],top[N],son[N],sz[N];
int n,m,cnt=0,k,w[N],v[N],tot=0; long long ans=0;
inline void adj(int x,int y){
	G[++cnt]=(Edge){y,h[x]}; h[x]=cnt;
}
inline int _(int x){ return x&-x; }
inline void add(int x,int k){ for(;x<=n;x+=_(x)) v[x]+=k; }
inline int sum(int x,int k=0){ for(;x;x-=_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值