【牛客】2024暑期牛客多校6 补题记录

news2024/9/24 9:23:52

文章目录

  • A - Cake(树上dp)
  • B - Cake 2(暴力)
  • D - Puzzle: Wagiri(tarjan)
  • F - Challenge NPC 2(构造)
  • H - Genshin Impact's Fault(签到)
  • I - Intersecting Intervals(dp)

A - Cake(树上dp)

  • 首先两个人依次从一棵树的根走向叶子结点,对于每个结点,它的前缀结点都是确定的,所以先计算出走到每个结点时的 0 0 0 在所有前缀字符串中的占比 p p p(取最大,因为最后切蛋糕的人想让 0 0 0 最多)
  • 第一个人想尽可能让 1 1 1 更多,也就是让 p p p 更小,第二个人想让 p p p 更大,那第一个人操作的时候尽可能让 p p p 小,第二个人尽可能让 p p p 更大就可以了
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e5 + 10;
const int maxn = 1e6;
const int MAXN = 1e5 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
    int n; cin >> n;
	vector<vector<PII>> g(n + 1);
	for (int i = 1; i < n; i ++ )
	{
		int u, v, c;
		cin >> u >> v >> c;
		g[u].push_back({v, c});
		g[v].push_back({u, c});
	}
	vector<int> dep(n + 1);
	vector<double> f(n + 1);
	vector<vector<int>> cnt(n + 1, vector<int>(2));
	function<void(int, int)> dfs = [&](int u, int fa)
	{
		if (u != 1) f[u] = max(f[u], (double)(1.0 * cnt[u][0] / (cnt[u][0] + cnt[u][1])));
		for (int i = 0; i < g[u].size(); i ++ )
		{
			int j = g[u][i].first, c = g[u][i].second;
			if (j == fa) continue;
			dep[j] = dep[u] + 1;
			cnt[j][0] = cnt[u][0], cnt[j][1] = cnt[u][1];
			cnt[j][c] ++ ;
			f[j] = f[u];
			dfs(j, u);
		}
	};
	dep[1] = 1;
	dfs(1, -1);
	vector<double> ans(n + 1);
	function<void(int, int)> dp = [&](int u, int fa)
	{
		int sz = 0;
		if (dep[u] & 1) ans[u] = 1;
		for (int i = 0; i < g[u].size(); i ++ )
		{
			int j = g[u][i].first, c = g[u][i].second;
			if (j == fa) continue;
			dp(j, u);
			sz ++ ;
			if (dep[u] & 1) ans[u] = min(ans[u], ans[j]);
			else ans[u] = max(ans[u], ans[j]);
		}
		if (sz == 0) ans[u] = f[u];
	};
	dp(1, -1);
	printf("%.12Lf\n", 1 - ans[1]);
}

signed main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0), cout.tie(0);

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B - Cake 2(暴力)

  • 枚举每个点作为开头,把结尾点存进队列,一旦开头超过队头就把队头弹出
#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	int n, k;
	cin >> n >> k;
	if (n == k * 2)
	{
		cout << n << '\n';
		return;
	}
	k = min(k, n - k);
	queue<int> q;
	q.push(k % n);
	int cnt = 1;
	int ans = 2;
	for (int i = 1; i < n; i ++ )
	{
		int tmp = (i + k) % n;
		q.push(tmp);

		int top = -1;
		if (q.size()) top = q.front();
		if (top == i)
		{
			q.pop();
			cnt -- ;
		}

		if (tmp < i) ans += (cnt + tmp) + 1;
		else ans += cnt + 1;
		cnt ++ ;
	}
	cout << ans << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
}

D - Puzzle: Wagiri(tarjan)

  • 首先只看轮边,跑边的双连通分量找桥,所有的桥都不在环上,所以轮边不包括桥,然后将所有不是桥的轮边加到答案里并更新并查集
  • 遍历所有切边,在同一个并查集的两个点之间必不连切边
#include <bits/stdc++.h>

using namespace std;

#define int long long
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e6 + 10;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> g(n + 1);
	vector<PII> qb, lb, ans;
	for (int i = 0; i < m; i ++ )
	{
		int u, v; cin >> u >> v;
		string s; cin >> s;
		if (s[0] == 'L')
		{
			g[u].push_back(v);
			g[v].push_back(u);
			lb.push_back({u, v});
		}
		else qb.push_back({u, v});
	}
	
	int timestamp = 0;
	vector<int> fa(n + 1), dfn(n + 1), low(n + 1);
	set<PII> bridge;
	function<void(int, int)> tarjan = [&](int u, int father)
	{
		fa[u] = father;
		dfn[u] = low[u] = ++ timestamp;

		for (int i = 0; i < g[u].size(); i ++ )
		{
			int j = g[u][i];
			if (!dfn[j])
			{
				tarjan(j, u);
				low[u] = min(low[u], low[j]);
				if (dfn[u] < low[j])
				{
					bridge.insert({j, fa[j]});
					bridge.insert({fa[j], j});
				}
			}
			else if (dfn[j] < dfn[u] && j != father)
				low[u] = min(low[u], dfn[j]);
		}
	};
	for (int i = 1; i <= n; i ++ )
		if (!dfn[i]) tarjan(i, -1);

	vector<int> p(n + 1);
	for (int i = 1; i <= n; i ++ ) p[i] = i;
	function<int(int)> find = [&](int u)
	{
		if (u != p[u]) p[u] = find(p[u]);
		return p[u];
	};
	for (auto t : lb)
	{
		int u = t.first, v = t.second;
		if (bridge.count(t)) continue;
		int pu = find(u), pv = find(v);
		if (pu != pv) p[pu] = pv;
		ans.push_back(t);
	}
	for (int i = 1; i <= n; i ++ ) find(i);
	for (auto t : qb)
	{
		int u = t.first, v = t.second;
		int pu = find(u), pv = find(v);
		if (pu != pv)
		{
			ans.push_back({u, v});
			p[pu] = pv;
		}
	}

	int p1 = find(1);
	for (int i = 2; i <= n; i ++ )
	{
		if (find(i) != p1)
		{
			cout << "NO\n";
			return;
		}
	}
	cout << "YES\n";
	cout << (int)(ans.size()) << '\n';
	for (auto t : ans) cout << t.first << ' ' << t.second << '\n';
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
}

F - Challenge NPC 2(构造)

队友的代码

#include<cstdio>
#include<vector>
struct node{
	int n;
	node *nxt;
}*mp[1000005],use[2000005],*nw;
void add(int u,int v)
{
	node *p=nw++;
	p->n=v;
	p->nxt=mp[u];
	mp[u]=p;
}
int du[1000005];
int base;
std::vector<int> dp[1000005];
int dfs(int now,int fa=-1,int dep=1)
{
	du[now]=1000000000;
	dp[dep+base].push_back(now);
	int ret=dep;
	node *p=mp[now];
	while(p)
	{
		if(p->n!=fa)
		{
			int r=dfs(p->n,now,dep+1);
			if(r>ret) ret=r;
		}
		p=p->nxt;
	}
	return ret;
}
int ans[1000005],ansl;
bool fl[1000005];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
			mp[i]=0,du[i]=0,fl[i]=0;
		fl[1]=fl[2]=fl[3]=0;
		nw=use;ansl=0;base=0;
		for(int i=1;i<=m;i++)
		{
			int u,v;
			scanf("%d%d",&u,&v);
			add(u,v);
			add(v,u);
			du[u]++;
			du[v]++;
		}
		for(int i=1;i<=n;i++)
			if(du[i]<=1)
			{
				if(du[i]==0)
				{
					base++;
					dp[base].push_back(i);
					fl[base]=1;
				}
				else base+=dfs(i);
			}
		if(base<=3)
		{
			if(fl[1]||fl[2]||fl[3])
			{
				if(fl[1])
				{
					for(int i=0;i<dp[2].size();i++)
						ans[ansl++]=dp[2][i];
					for(int i=0;i<dp[1].size();i++)
						ans[ansl++]=dp[1][i];
					for(int i=0;i<dp[3].size();i++)
						ans[ansl++]=dp[3][i];					
				}
				else
				{
					for(int i=0;i<dp[2].size();i++)
						ans[ansl++]=dp[2][i];
					for(int i=0;i<dp[1].size();i++)
						ans[ansl++]=dp[3][i];
					for(int i=0;i<dp[3].size();i++)
						ans[ansl++]=dp[1][i];	
				}
				for(int i=0;i<ansl;i++)
					printf("%d ",ans[i]);
				goto label;				
			}
			printf("-1");
			goto label;
		}
		for(int i=2;i<=base;i+=2)
			for(int j=0;j<dp[i].size();j++)
				ans[ansl++]=dp[i][j];
		for(int i=1;i<=base;i+=2)
			for(int j=0;j<dp[i].size();j++)
				ans[ansl++]=dp[i][j];
		for(int i=0;i<ansl;i++)
			printf("%d ",ans[i]);
		label:putchar('\n');
		for(int i=1;i<=base;i++)
			dp[i].clear();
	}
	return 0;
}

H - Genshin Impact’s Fault(签到)

#include<cstdio>
#include<cstring>
char s[1000005];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",s);
		int len=strlen(s);
		int lst=1;
		for(int i=0;i<=len-10;i++)
		{
			int cnt=0;
			for(int j=i;j<i+10;j++)
				if(s[j]=='3') cnt++;
			if(cnt==10)
			{
				printf("invalid\n");
				goto label;
			}
		}
		for(int i=0;i<=len-90;i++)
		{
			int cnt=0;
			for(int j=i;j<i+90;j++)
				if(s[j]=='3'||s[j]=='4') cnt++;
			if(cnt==90)
			{
				printf("invalid\n");
				goto label;
			}
		}
		for(int i=0;i<len;i++)
		{
			if(s[i]=='U') lst=1;
			if(s[i]=='5')
			{
				if(lst==0)
				{
					printf("invalid\n");
					goto label;
				}
				lst=0;
			}
		}
		printf("valid\n");
		label:;
	}
	return 0;
}

I - Intersecting Intervals(dp)

  • f [ i ] [ j ] f[i][j] f[i][j] 表示第 i i i 行,第 j j j 个必选的最优答案
  • 上下两行相交只会是这两种情况:
    在这里插入图片描述
  • k < j k<j k<j 时,首先肯定加上 f [ i − 1 ] [ k ] f[i-1][k] f[i1][k],然后因为 [ k ,   j ] [k,\ j] [k, j] 必选,所以还要加上 s u m k ,   j sum_{k,\ j} sumk, j k k k 的左边随便选多少,记作 p r e [ k ] pre[k] pre[k] j j j 的右边随便选多少,记作 s u f [ j ] suf[j] suf[j]
  • k > j k>j k>j 时,首先肯定加上 f [ i − 1 ] [ k ] f[i-1][k] f[i1][k],然后因为 [ j ,   k ] [j,\ k] [j, k] 必选,所以还要加上 s u m j ,   k sum_{j,\ k} sumj, k j j j 的左边随便选多少,记作 p r e [ j ] pre[j] pre[j] k k k 的右边随便选多少,记作 s u f [ k ] suf[k] suf[k]
  • 直接枚举 k k k 的话会超时,我们可以利用前缀和后缀记录最优的 k k k
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double
using i64 = long long;

typedef pair<int, int> PII;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<int, pair<int, bool>> PIIB;

const int N = 1e5 + 10;
const int maxn = 1e6;
const int MAXN = 1e5 + 10;
const int mod = 1e9 + 7;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;

void solve()
{
    int n, m;
	cin >> n >> m;
	vector<vector<int>> a(n + 1, vector<int>(m + 1));
	vector<int> f(m + 2), l0(m + 2), l1(m + 2), r0(m + 2), r1(m + 2);
	for (int i = 1; i <= n; i ++ )
	{
		for (int j = 1; j <= m; j ++ )
		{
			cin >> a[i][j];
			l0[j] = max(0ll, l0[j - 1]) + a[i][j];
			if (j == 1) l1[j] = f[j] + l0[j];
			else l1[j] = max(l0[j] + f[j], l1[j - 1] + a[i][j]);
		}
		for (int j = m; j >= 1; j -- )
		{
			r0[j] = max(0ll, r0[j + 1]) + a[i][j];
			if (j == m) r1[j] = f[j] + r0[j];
			else r1[j] = max(r0[j] + f[j], r1[j + 1] + a[i][j]);
		}
		for (int j = m; j >= 1; j -- )
		{
			f[j] = max(l0[j] - a[i][j] + r1[j], r0[j] - a[i][j] + l1[j]);
		}
	}
	int ans = -INF;
	for (int i = 1; i <= m; i ++ ) ans = max(ans, f[i]);
	cout << ans << '\n';
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用扩散模型DDPM生成高分辨率图像|(一)DDPM模型构建

利用扩散模型DDPM生成高分辨率图像&#xff08;生成高保真图像项目实践&#xff09; Mindspore框架利用扩散模型DDPM生成高分辨率图像|&#xff08;一&#xff09;关于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;模型 Mindspore框架利用扩散模型DD…

数字音频工作站(DAW)FL Studio 24.1.1.4239中文破解版

FL Studio 24.1.1.4239中文破解版是一款功能强大的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;它广泛应用于音乐创作和音乐制作领域。FL Studio是由比利时软件公司Image-Line开发的音乐制作软件&#xff0c;它拥有丰富的音效、合成器、采样器、鼓机等工具。FL Stud…

stm32cubemx+ADC的多通道轮询数据采集和DMA数据采集实现,亲测可用

ADC是单片机的重要组成&#xff0c;也是存在一定的难点。 一、多通道轮询数据采集。 1、配置时钟&#xff0c;用的无源晶振。 2、SW烧写方式 添加USART 3、ADC选择了四个通道 其中两个是采集电压&#xff0c;另外两个是采集芯片内部温度和参考电压。 4、配置采集模式 这里是…

萌啦数据官网丨萌啦ozon数据分析工具官网

在当今这个数据驱动的时代&#xff0c;电子商务的蓬勃发展离不开精准的数据分析与洞察。对于在OZON平台上耕耘的商家而言&#xff0c;掌握市场趋势、优化产品布局、提升运营效率成为了赢得竞争的关键。正是在这样的背景下&#xff0c;萌啦数据官网应运而生&#xff0c;作为一款…

信用卡使用雷区大揭秘:为何你贷款被拒?

​好多朋友明明条件挺好&#xff0c;但申请银行贷款时却吃了闭门羹&#xff0c;一查征信&#xff0c;原来是信用卡使用上栽了跟头。信用卡可是个关键角色&#xff0c;用得好助力贷款&#xff0c;用得不好&#xff0c;直接拖后腿。今天咱们就聊聊信用卡对贷款申请的影响情况和解…

鸿蒙OS ArkTS 省市县级联选择框,封装组件

背景&#xff1a; 公司现在要开发纯血鸿蒙版本APP&#xff0c;我被抽调过来做点功能。现在要做一个省市县级联选择框&#xff0c;并且要封装为组件&#xff0c;供其他页面模块使用。 效果图&#xff1a; 难点&#xff1a; 1. 现在官方文档上只是查到了TextPicker组件是可以做…

建筑设计遇上这几个工具,就是锦上添花!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2161.html 当AI遇上建筑&#xff0c;设计界的火花就这样擦出来了&#xff01;&#x1f440; 身为一名内外饰设计工程师&#xff0c;你是否也在担心作品不经意间借鉴过了头…

Tomcat启动控制台乱码解决方案

前言 事情的起因是这样的&#xff0c;当时我用了阿里云osssdk里的代码下载文件&#xff0c;如下 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); &#xff0c;开始一切顺利&#xff0c;直到部署正式环境后&#xff0c;用了一段时间…

【Material-UI】Button 组件中的尺寸设置(Sizes)详解

文章目录 一、基础尺寸选项1. 小尺寸&#xff08;Small&#xff09;2. 中等尺寸&#xff08;Medium&#xff09;3. 大尺寸&#xff08;Large&#xff09; 二、尺寸的应用场景三、高级用法和最佳实践1. 使用主题调整默认尺寸2. 确保一致性3. 考虑无障碍设计 四、总结 在用户界面…

代码随想录算法训练营第五十二天|101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

101. 孤岛的总面积 DFS搜索&#xff1a; dfs 函数是一个递归函数&#xff0c;用于深度优先搜索&#xff08;DFS&#xff09;遍历网格中的陆地区域。它将访问过的陆地标记为0&#xff0c;并统计陆地的数量。 我们首先定义了四个方向的移动偏移量 dir。 global count 语句用于声…

C++入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…

数据结构和算法|递归算法那些事(递归算法的时间复杂度、尾递归优化、斐波那契数列)

对于文章的第一部分&#xff0c;递归算法的时间复杂度&#xff0c;来自于代码随想录文章:通过一道面试题目&#xff0c;讲一讲递归算法的时间复杂度&#xff01; 对于第二节尾递归优化来自于B站&#xff1a;尾递归优化&#xff1a;你的递归调用是如何被优化的&#xff1f; 文章…

Spring Boot - 通过ApplicationListener实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中&#xff0c;监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

微服务架构-SpringCloud

1.单体应用架构 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程。 优点&#xff1a; 部署简单&#xff1a;由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。技术单一&#xff1a;项目不需要复杂的技术栈&#xff0c;往往一套熟悉的技术栈就…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【leetcode】杨辉三角(Java语言描述)

杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] …

XIAOJUSURVEY 重磅升级,推出图形化逻辑编排能力

&#x1f389;&#x1f389;&#x1f389;XIAOJUSURVEY 是滴滴开源的企业级问卷系统&#xff0c;现已重磅升级&#xff01;&#xff01;&#xff01; 本次升级基于自研规则引擎&#xff0c;全面支持复杂的问卷逻辑编排&#xff0c;实现了显示逻辑与跳转逻辑的无缝整合。突破了…

MySQL Galera Cluster 部署与介绍

目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…

线性回归Pytorch方法

借助 PyTorch 实现深度神经网络 - 线性回归 PyTorch 方法 - 第 3 周 | Coursera 随机梯度下降和数据加载器 在每个epoch中&#xff0c;使用一个样本进行更新的方法称为随机梯度下降&#xff0c;而使用所有样本进行更新的方法称为批量梯度下降。 随机梯度下降&#xff1a; 随…