2024HDU Contest 6 Problem 11

unity中基于NGUI实现一张图片上在某个地方挖个洞 按照策划的要求,引导时只有被引导的图片是高亮的,其余地方都是黑色半透明,如下图所示: 对应的实现shader如下: Shader "Unlit/TutorialBg" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _ClipRange0 ("Clip Vector 阅读详情

题目链接

前大半部分关于解决点在树上的做法并不是我研究的。Orz SYR and JYG.

这里仅讨论如果我们得到环上每个点往下最多能走的深度 f [ u ] f[u] f[u],怎么计算在环上的每个点所能获得的最长路径。

在环上走有两种情况,我们可以分别考虑。第一种是路径没有跨过[0,n-1]这条边:对于编号为 i i i的节点,该路径只可能是从 [ 0 , i ] [0,i] [0,i]的一个节点出发走到 [ i + 1 , n − 1 ] [i+1,n-1] [i+1,n1]的一个节点,或者从 [ 0 , i − 1 ] [0,i-1] [0,i1]中的一个节点出发走到 [ i , n − 1 ] [i,n-1] [i,n1]中的一个节点(区别在于i号节点本身是入点还是出点)。
所以我们只需要分别求出作为入点的前缀最大值和作为出点的后缀最大值即可。

对于跨过了 [ 0 , n − 1 ] [0,n-1] [0,n1]这条边的路径,我们有两种跨越方式:从0走到n-1,或者从n-1走到0。对于从0走到n-1的方式,我们从小往大遍历,记录前缀最大出点价值以及最长总路径值。对于n-1走到0的方式,我们从大往小遍历。

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

int n;
int vis[maxn], ban[maxn], deg[maxn];
int f[maxn], g[maxn], h[maxn], ans[maxn];
vector<int> cycle;
vector<int> tree[maxn];

inline void clear(){
	for (int i = 0; i < n; ++i) {
		tree[i].clear();
		vis[i] = 0;
		deg[i] = 0;
		ban[i] = 0;
		f[i] = g[i] = h[i] = ans[i] = 0;
	}
	cycle.clear();
}

inline void findCycle(){
	queue<int> que;
	for (int i = 0; i < n; ++i) if (deg[i] == 1) que.push(i);
	while(!que.empty()) {
		int u = que.front(); que.pop();
		vis[u] = 1;
		for (auto v: tree[u]) if ((--deg[v]) == 1) que.push(v);
	}
	for (int u = 0; u < n; ++u) if (!vis[u]) {
		for (; !vis[u]; ) {
			ban[u] = 1;
			vis[u] = 1;
			cycle.push_back(u);
			for (auto v: tree[u]) if (!vis[v]) {
				u = v;
				break;
			}
		}
	}
}

inline void calcF(int u, int p) {
	for (auto v: tree[u]) if (v != p && !ban[v]) {
		calcF(v, u);
		f[u] = max(f[v] + 1, f[u]);
	}
}

inline void calcCycle(){
	int L = cycle.size();
	for (int i = 0; i < L; ++i) {
		cycle.push_back(cycle[i]);
	}
	deque<int> que;
	for (int i = 0; i < L * 2; ++i) {
		while (i - que.front() >= L) que.pop_front();
		if (que.size()) {
			g[cycle[i]] = max(g[cycle[i]], i + f[cycle[que.front()]] - que.front());
		}
		while (que.size() && f[cycle[i]] - i >= f[cycle[que.back()]] - que.back()) que.pop_back();
		que.push_back(i);
	}
	reverse(cycle.begin(), cycle.end());
	que.clear();
	for (int i = 0; i < L * 2; ++i) {
		while (i - que.front() >= L) que.pop_front();
		if (que.size()) {
			g[cycle[i]] = max(g[cycle[i]], i + f[cycle[que.front()]] - que.front());
		}
		while (que.size() && f[cycle[i]] - i >= f[cycle[que.back()]] - que.back()) que.pop_back();
		que.push_back(i);
	}
	for (int i = 0; i < L; ++i) cycle.pop_back();
}

inline void calcG(int u, int p){
	int mx = g[u] + 1;
	for (int i = 0; i < tree[u].size(); ++i) if (tree[u][i] != p && !ban[tree[u][i]]) {
		int v = tree[u][i];
		g[v] = max(g[v], mx);
		mx = max(mx, f[v] + 2);
	}
	mx = g[u] + 1;
	for (int i = (int) tree[u].size() - 1; i >= 0; --i) if (tree[u][i] != p && !ban[tree[u][i]]) {
		int v = tree[u][i];
		g[v] = max(g[v], mx);
		mx = max(mx, f[v] + 2);
		calcG(v, u);
	}
}

inline void calcAns(int u, int p) {
	int mx1 = 0, mx2 = 0;
	for (auto v: tree[u]) if (v != p && !ban[v]) {
		calcAns(v, u);
		if (f[v] > mx1) mx2 = mx1, mx1 = f[v];
		else if (f[v] > mx2) mx2 = f[v];
	}
	//if(u==0){printf("%d %d\n",mx1,mx2);}
	ans[u] = max(ans[u], mx1 + mx2+2);
	ans[u] = max(ans[u], f[u] + g[u]);
}

struct node{
	int val,id;
	node(int _val=0,int _id=0){val=_val;id=_id;}
}v1[maxn<<1],v2[maxn<<1];

int id[maxn<<1],suf[maxn<<1],pre[maxn<<1];
inline void solve() {
	scanf("%d", &n);
	clear();
	for (int i = 0; i < n; ++i) {
		int u, v; scanf("%d%d", &u, &v);
		--u, --v;
		tree[u].push_back(v);
		tree[v].push_back(u);
		++deg[u], ++deg[v];
	}
	findCycle();
//	puts("cycle");
//	for (auto u: cycle) printf("%d ", u); 
//	puts("");
	
	for (auto u: cycle) calcF(u, -1);
	calcCycle();
	for (auto u: cycle) calcG(u, -1);
	
	
	/*
	Nodes on the cycle are in `std::vector<int> cycle` with ban[u] = 1
	f[u] is the weight on each node (when chosen as endpoints)
	
	Store the result in h[u]
	
	*/
	int len=cycle.size();
	for(int i=0;i<len;i++)id[i]=cycle[i];
	pre[0]=suf[len+1]=-(1<<29);
    for(int i=1;i<=len;i++)
        pre[i]=max(pre[i-1],f[id[i-1]]-i);
    for(int i=len;i>=1;i--)
        suf[i]=max(suf[i+1],f[id[i-1]]+i);
    for(int i=1;i<=len;i++)
        h[id[i-1]]=max({h[id[i-1]],pre[i]+suf[i+1],pre[i-1]+suf[i]});
    //max(a_i+i+a_j-j+n), cross the 0 - (n-1) edge.
    int mxi=-(1<<29),mxj=-(1<<29);
    //from 0 to n-1
    for(int i=0;i<len;i++){
        mxj=max(mxj,mxi+f[id[i]]-i+len);
        mxi=max(mxi,f[id[i]]+i);
        h[id[i]]=max(h[id[i]],mxj);
    }
    mxi=mxj=-(1<<29);
    // from n-1 to 0
    for(int i=len-1;i>=0;i--){
        mxj=max(mxj,mxi+f[id[i]]+i+len);
        mxi=max(mxi,f[id[i]]-i);
        h[id[i]]=max(h[id[i]],mxj);
    }
	
	for (auto u: cycle) {
		ans[u] = h[u];
		calcAns(u, -1);
	}
//	for (int u = 0; u < n; ++u) printf("%d ", f[u]); puts("");
//	for (int u = 0; u < n; ++u) printf("%d ", g[u]); puts("");
//	for (int u = 0; u < n; ++u) printf("%d ", h[u]); puts("");
	for (int u = 0; u < n; ++u) printf("%d ", ans[u]);
	puts("");
}

int main(){
	int T;
	for (scanf("%d", &T); T--; solve());
	return 0;
}
mapbox 从入门到精通 - 目录 欢迎大家来到gis分享者的《mapbox 从入门到精通》专栏。博主列出学习大纲,如果有什么问题,欢迎留言。 阅读详情

相关推荐

Chrome更新出现错误代码3: 0X80070422 -- system level的解决方案

本文主要介绍了Chrome更新出现错误代码3: 0X80070422 – system level的解决方案,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

杭电多校-单峰数列-(线段树维护最值和标记)

对于一个整数数列,如果其先严格递增,然后在某一点后严格递减,我们称这个数列为单峰数列(严格递增和严格递减的部分均要是非空)。[l,r]都加上x,[l,r]是否全部相同,[l,r]是否为严格升序,[l,r]是否为严格降序,[l,r]是否为单峰数列。

m0_52398496的博客 507

Bev算法在J5平台的部署

支持多种形式的Bev算法:ipmlss时序,以及基于transformer的gkt。

@bangbang的博客 804

并 (杭电多校1 1012)

官方题解的做法是用任选的方案数减去没有被覆盖的方案数,思路比较清晰简单。笔者认为还算是一次较为有益的尝试,所以这篇博客主要探究容斥的做法,至于离散化以及二维差分或二维前缀将不再赘述。表示从仅被一个矩形覆盖的区域上选择覆盖了这一块区域的其中一块矩形的方案数,表示从仅被两个矩形覆盖的区域上选择覆盖了这一块区域的其中一块矩形的方案数,个不同的矩形,其所有覆盖部分的并集的面积的期望值,由于答案可能很大,请对。这一块可以看作是计算任选一块矩形,其所覆盖的区域对答案的贡献,个矩形,然后参考这样一个经典的图,

jushdi的博客 1801

2024杭电多校6——1007树上MEX问题

1代表不选这棵子树,dp[v]是选择这棵子树的方案数,子树独立,所以乘起来即可。题目让我们求所有连通导出子图MEX之和,可能存在的答案有1,2…,也就是要求的答案,(如果不理解的话带个n进去,自己展开写一下就明白了)的情况,题解里给了方法,但是我不会实现,有会的佬教教我。至于题解里的联想我是不明白,我只能从结果说明二者等价。缩成一个点,那么这样看不就是求这个点的dp值吗。只用本身也是一个连通块,所以dp初值是1。有直接连边但不在集合里的点v,它们的。类似于求连通块的dp,相当于把集合。

theskyinblue的博客 1336

(HDUOJ7452)2024HDU暑假多校2-1008-成长,生命,幸福 题解

考虑如何快速算出成⻓后的点数, 可以发现, 在进行一次成⻓后的树度数最大为3, 对于一个 2 度点, 成⻓一次变为 2 个 2 度点, 对于一个 3 度点, 成⻓一次边为 2 个 2 度点和 1 个 3 度点,对于一个 d 度点, 成⻓一次为 2 个 2 度点和。接下来就考虑用这个式子作为每个点的权值, 来计算树中的最长路( 权值和最大的路径 ).个 3 度点. 最后推出一个度数为 x 的点成长 m 次后会变成。个点.(补题时总是不想计算这些推理的, 所有我没推这玩意 )

taulee01 的博客 1351

2024杭电多校第二场

2024杭电多校第二场

xinchu0309的博客 1071

2024暑期集训补题(线段树分治 + 可撤销并查集 + 懒标记前缀和维护)

对于这种操作存在于一定时间区间内的问题,显然是线段树分治的板子,利用线段树分治将所有时刻的操作存入线段树,每询问到一个叶子节点即一个时刻,在向下递归的同时处理该区间内存在的操作即可,而对于是否能到达也显然用配套的可撤销并查集来处理,可撤销并查集能在回溯时撤销当前节点的操作,因此对于每个时刻,我们都可以求出能到达的点。所在的连通块根节点的标记值为时刻的前缀和,因此如果我们要让当前加入的点仅计算后面时刻的贡献,显然让当前的点标记值减去当前时刻。但是我们要求的是每个点能到达的时刻,如果暴力处理,最坏可能会达到。

a2216760004的博客 1027

2024杭电多校(4) 1006. 延时操控【计数DP】

通过数据约束压缩状态数

m0_73500785的博客 816

题解|2024暑期杭电多校04

题解|2024暑期杭电多校03

CCLMSY‘s Blog 1065

2024“钉耙编程”中国大学生算法设计超级联赛(7)

模拟

qq_42643660的博客 383

天天爱跑步 2024杭电多校6 1011(换根dp + 简单算法大杂烩)

对于这种有环以及有绝对值的式子,直接断环成链会好写很多,断环成链后官方题解用的双指针,笔者这里用的是单调队列,难度上感觉差不多。不会的算法可以去学,用到的也只是些简单算法。先考虑非环点,那么这个点一定会是一个以环上点为根的子树上的节点,这就相当于一棵简单树,但是呢,在这里我们需要先预处理出每个环上点不往以它为根的子树走所能走的最长距离。以上两式均可通过维护前后缀最值得出,不过,按照笔者的写法,第二个式子,除了维护后缀最值还需要开一个。首先,如果给出的是一棵简单树,则直接做两遍。个节点的基环树,求经过第。

jushdi的博客 853

2024杭电多校4——1007 序列更新

取个倒数才是我们需要的形式,指数是i+1,所以相当于从1开始,所以。让它用第一种方式去更新,因为小的数更容易被更新,对于。(第二种方式),因为大的数更容易更新别的数。大概是因为两种维护方法都与b的第。一种比较玄学的优化方式,长知识了。

theskyinblue的博客 653

2024杭电多校(7) 1002.生产机器【计数dp】

杭电多校

m0_73500785的博客 1107

2024杭电多校(4)1012. 寻找宝藏 【扫描线、树状数组二维偏序】

扫描线、树状数组

m0_73500785的博客 898

2024杭电钉耙1-1003 HDOJ7435 树

2024“钉耙编程”中国大学生算法设计超级联赛(1) 2024杭电1003 HDOJ7435 树 给一棵根为 1 的有根树,点 $i$ 具有一个权值 $A_i$ 。 定义一个点对的值 $f(u, v)=\max \left(A_u, A_v\right) \times\left|A_u-A_v\right|$ 。 你需要对于每个节点 $i$ ,

qq_44714797的博客 929

2024HDU Contest 5 Problem 5

倍数的点,则这条边的答案至少为d。考虑到对于每条边我们只需要知道最大值,所以如果一条边已经在之前的。中被更新过答案,我们就可以将它合并起来。合并的过程可以通过并查集来实现。每条边只会被合并一次,然后枚举倍数的时间开销也是调和级数,所以总复杂度为。的倍数的点之后,将这些点之间的路径都遍历一遍并合并起来。所以总结下来做法就是枚举出编号为。从大到小枚举gcd的值。

xiayuyang 871

暴力求圆的面积并

前言: 这个问题是集训时看到这道题后,再想要着手学习的。本篇中给出的做法复杂度并不能完全通过本题。 时限:7S,空间限制:512M 解法: 首先画图: 可以发现圆的面积并等于中间一些多边形(不一定是凸的)的面积+每个圆未被其它圆所覆盖的弓形的面积。所以就对于每个圆,求出其被覆盖的圆弧部分,这些部分形成了一些区间,然后先把区间合并起来,然后就可以叉积求出每个圆的被覆盖的多边形面积和未被覆盖的弓形...

xiayuyang 715

一道bitset练习题

题意 其中a[i]<=2ka[i]<=2^ka[i]<=2k ,n∗k<=2e6n*k<=2e6n∗k<=2e6,x==3x==3x==3 数据分治 对于k较大的情况,可以n2∗kn^2*kn2∗k暴力,这里可以用手写bitset优化 这里因为不知道n,k所以使用不定长数组(其实和vector一样) tips:tips:tips:不定长数组其实是一个指针数组,...

xiayuyang 627

一道构造题

题意: 对于一个长度为nnn的01串,下标从0到n−1n-1n−1。定义两种类型的操作: A类型:选择一个xxx将序列循环右移xxx位,也就是新序列的第(i+x)mod   n(i+x) \mod\:n(i+x)modn位对应原序列的第iii位。 例如:对于x=2x=2x=2,01100将会变成10001。 B类型:选择一个xxx,满足序列的第xxx个位置为1,且第(x+1)mod   n(x+1...

xiayuyang 612

一道fft练习题

题意 解法 考场上想到的O(n2)O(n^2)O(n2)暴力: 记f[i][j]f[i][j]f[i][j]表示前i个位置,长度为j的连击出现的期望次数 记g[i][j]g[i][j]g[i][j]表示第到i个位置为止,目前连击次数为j的概率 转移时有一些细节 #include<bits/stdc++.h> using namespace std; const int maxn=...

xiayuyang 529

持械检测模型yolo8模型

可以检测持刀、持枪、持棍等的检测适用于yolo8的检测框架及部署模型格式包含:.pt和.onnx格式

AccessDatabaseEngine(32位)

包含了32位的Excel引擎工具。 电脑中或者服务器中无需安装Office,只需要安装AccessDatabaseEngine,即可实现.net 读取Excel表的功能,简单方便。 请根据你的系统选择相应的版本安装,不需要2个都安装。 最后再说一句,如果你的系统是64位的,你只安装了32位的AccessDatabaseEngine,那么你就需要将你的IIS设置为(启用32位应用程序)相关下载链接客户端出错:无法在数据表视图中显示该列表: 没有安装与 Windows SharePoint Services 兼容的数据表组件。 QQ截图20151014124149客户端想在数据表中编辑时提示下列错误:数据视图由于下列一个或多个原因,无法在数据表视图中显示该列表: 没有安装与 Windows SharePoint Services 兼容的数据表组件,浏览器不支持 ActiveX 控件,或者禁用了对 ActiveX 控件的支持。

上一篇: 2-SAT备忘(codeforces 1791H)
新笑雨
博客等级 码龄7年 260粉丝 · 123原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值