CF516D Drazil and Morning Exercise【2019集训队作业 】

本文介绍了一道名为CF516DrazilandMorningExercise的算法题目解决方案。通过全局预处理f值,并利用这些值的特性构建一棵树,使得树中每个节点的孩子节点的f值都不大于该节点。采用从大到小枚举节点的方式,逐步更新答案,最终实现O(nlogn+qnα(n))的时间复杂度。
CF516D Drazil and Morning Exercise【2019集训队作业 】

注意 f x f_x fx 是对全局的而不是对一个连通块。

不然就不可做了2333(是我太菜了不会做

所以可以先把所有 f x f_x fx 求出来。

然后观察它的性质可以发现,

f x f_x fx 最小的点为根的树,满足任意一个节点 u u u 的所有孩子节点的 f x f_x fx 都小于 f u f_u fu

然后就很好做了。

按照 f x f_x fx 大到小枚举每个节点,考虑把这个节点的 f x f_x fx 当作 m i n { f x } min\{f_x\} min{fx} ,把不合法的点删掉。

你会发现显然这样做是对的,因为枚举的时候 f x f_x fx 单调,删了的点不会变合法。

然后就做完咯。 O ( n log ⁡ n + q n α ( n ) ) O(n\log n+qn\alpha(n)) O(nlogn+qnα(n))

#include<bits/stdc++.h>
#define re register
#define LL long long
#define lb(x) ((x)&(-x))
#define max(a,b) ((a)>(b)?(a):(b))
inline int read() {
	char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e5+5;
struct E{int v,nxt,w;}e[maxn<<1];
int n,m,num,Rt,rt,sz,S;
int head[maxn],sum[maxn],son[maxn],pos[maxn],dep[maxn],d[maxn],Ans[55];
LL pre[maxn],mx[maxn],q[55],c[maxn];
inline void add(int x,int y,int w) {
	e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].w=w;
}
inline int find(LL x) {
	int l=1,r=sz,now=0;
	while(l<=r) {
		int mid=l+r>>1;
		if(c[mid]<=x) now=mid,l=mid+1;else r=mid-1;
	}
	return now;
}
void dfs(int x,int fa) {
	for(re int i=head[x];i;i=e[i].nxt) {
		if(e[i].v==fa) continue;
		pre[e[i].v]=pre[x]+e[i].w;
		dfs(e[i].v,x);
	}
}
void dfs1(int x) {
	sum[x]=1;
	for(re int i=head[x];i;i=e[i].nxt) {
		if(dep[e[i].v]) continue;
		dep[e[i].v]=dep[x]+1;dfs1(e[i].v);sum[x]+=sum[e[i].v];
		if(sum[e[i].v]>sum[son[x]]) son[x]=e[i].v;
	}
}
inline void add(int x,int v) {
	for(re int i=x;i<=sz;i+=lb(i)) d[i]+=v;
}
inline int ask(int x) {
	int now=0;
	for(re int i=x;i;i-=lb(i)) now+=d[i];
	return now;
}
void calc(int x,int o) {
	add(pos[x],o);
	for(re int i=head[x];i;i=e[i].nxt)
	if(dep[e[i].v]>dep[x]&&S!=e[i].v) calc(e[i].v,o);
}
void dsu(int x,int k) {
	for(re int i=head[x];i;i=e[i].nxt) 
	if(dep[e[i].v]>dep[x]&&son[x]!=e[i].v) dsu(e[i].v,0);
	if(son[x]) dsu(son[x],1);
	S=son[x],calc(x,1),S=0;
	for(re int i=1;i<=m;i++) {
		int g=ask(find(mx[x]+q[i]));
		Ans[i]=max(Ans[i],g);
	}
	if(!k) calc(x,-1);
}
int main() {
	n=read();
	for(re int x,y,w,i=1;i<n;++i)
		x=read(),y=read(),w=read(),add(x,y,w),add(y,x,w);
	m=read();for(re int i=1;i<=m;i++) scanf("%lld",&q[i]);
	dfs(1,0);rt=1;
	for(re int i=2;i<=n;i++) if(pre[i]>pre[rt]) rt=i;
	pre[rt]=0;dfs(rt,0);Rt=1;
	for(re int i=1;i<=n;i++) mx[i]=pre[i];
	for(re int i=2;i<=n;i++) if(pre[i]>pre[Rt]) Rt=i;
	pre[Rt]=0;dfs(Rt,0);
	for(re int i=1;i<=n;i++) mx[i]=max(mx[i],pre[i]);
	rt=1;for(re int i=2;i<=n;i++) if(mx[i]<mx[rt]) rt=i;
	dep[rt]=1;dfs1(rt);
	for(re int i=1;i<=n;i++) c[i]=mx[i];
	std::sort(c+1,c+n+1);sz=std::unique(c+1,c+n+1)-c-1;
	for(re int i=1;i<=n;i++) pos[i]=find(mx[i]);
	dsu(rt,1);for(re int i=1;i<=m;i++) printf("%d\n",Ans[i]);
	return 0;
}
源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值