首页 > 其他分享 >蔚来杯2022牛客暑期多校训练营加赛 题解

蔚来杯2022牛客暑期多校训练营加赛 题解

时间:2022-08-22 15:12:06浏览次数:64  
标签:int 蔚来 rest sze MAXN long 题解 加赛 define

E. Everyone is bot

对于后 \(p\) 个人,这 \(p\) 个人相互制约,一旦有一个人进行复读,剩下的 \(p-1\) 个人一定会进行复读,那么这个人就会被禁言,对于他来说不是最优策略。此时转移到 \(n=n-p\) 的情况继续讨论,一直讨论直至 \(n-p<p\) 时结束。此时前 \(n-p\) 个人只能按顺序复读,否则会被后面的人占位导致拿不到冰红茶。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;

const int MAXN = 1000 + 5;

int n, p, a[MAXN][MAXN];

signed main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> p;
	for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) cin >> a[i][j];
	for(int i = 1; i <= n % p; i++) cout << a[i][i] << " ";
	for(int i = 1; i <= p * (n / p); i++) cout << "0 ";
	cout << "\n";
	return 0;
}

H. Here is an Easy Problem of Zero-chan

由于 \(10=2*5\),所以可将问题转化成对于每个 \(x\),求 \(f[x]\) 中 \(2\) 的因子个数和 \(5\) 的因子个数。

先对每个数进行质因子分解,设 \(x\) 中 \(2\) 的因子个数和 \(5\) 的因子个数为 \(num2_x\) 和 \(num5_x\)。

考虑树形dp,设子树大小为 \(sze_u\),\(ans\) 为 \(f[u]\) 中 \(2\) 的因子个数和 \(5\) 的因子个数,枚举到当前 \(u\) 时将 \(ans\) 分为两部分。

① \(u\) 及其子树,这些节点和 \(u\) 求 lca 一定为 \(u\),有 \(ans += (num2_u,num5_u) * sze_u\)。

② \(u\) 的祖先 \(rt\),这些节点和 \(u\) 求 lca 一定为 \(rt\),有 \(ans += \sum(num2_{rt}, num5_{rt})*(sze_{rt}-sze_v)\),其中 \(v\) 为 \(rt\) 的儿子且是 \(u\) 或者 \(u\) 的祖先,这部分在DFS的时候直接下传即可。

最后求得的 \(ans\) 两者取最小值即为答案。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;

const int MAXN = 2e5 + 5;

int ans[MAXN], sze[MAXN], num2[MAXN], num5[MAXN], n, q;
vector<int> G[MAXN];

void DFS1(int u, int f) {
	sze[u] = 1;
	for(auto v : G[u]) {
		if(v == f) continue;
		DFS1(v, u);
		sze[u] += sze[v];
	}
}

void DFS2(int u, int f, int f2, int f5) {
	int u2 = num2[u] * sze[u] + f2, u5 = num5[u] * sze[u] + f5;
	ans[u] = min(u2, u5);
	for(auto v : G[u]) {
		if(v == f) continue;
		DFS2(v, u, f2 + (sze[u] - sze[v]) * num2[u], f5 + (sze[u] - sze[v]) * num5[u] );
	}
}

signed main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> q;
	for(int i = 1; i < n; i++) {
		int u, v; cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	for(int i = 1; i <= n; i++) {
		int cur = i;
		while(cur % 2 == 0) num2[i]++, cur /= 2;
		while(cur % 5 == 0) num5[i]++, cur /= 5;
	}
	DFS1(1, 0);
	DFS2(1, 0, 0, 0);
	while(q--) {
		int x; cin >> x;
		cout << ans[x] << "\n";
	}
	return 0;
}

J. Jellyfish and its dream

首先将两个位置相邻的相等数合并起来,例如将 \(0,0,0,...,0\) 合并成 \(0\)。

再将所有类似于 \(...,0,1,2,0,1,...\) 的递增区间提取出来,并求出区间左右端点和区间内三个数的数量。

此时不被合并的区间类似于 \([...,0,1,2][1,2,0,...]\),前一个区间的右端点值和后一个区间的左端点值相差为2。

对于此操作我们将后一个区间的左端点值+1,此时可以将两个区间进行合并。

断环成链,再进行区间合并操作,如果能得到一个长度大于等于 \(n\) 的区间则代表了有合法方案。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define fi first
#define se second
#define pii pair<int, int>
//#define int long long
using namespace std;

const int MAXN = 2000000 + 5;

int n, N, cnt, sze, L[MAXN], a[MAXN], b[MAXN], sum[MAXN], rest[MAXN][5], pos[MAXN];
vector<pii> block;

bool Connect(int i, int j) {
	int need = a[ block[j].se ];
	return rest[i][need] > 0 && rest[i][(need - 1 + 3) % 3] > 0;
}

void Solve() {
	cin >> n; N = n;
	for(int i = 1; i <= n; i++) cin >> a[i], a[i + n] = a[i];
	n *= 2;	cnt = 0;
	for(int i = 1; i <= n; i++) if(i == n || a[i] != a[i + 1]) b[++cnt] = a[i], pos[cnt] = i;
	n = cnt;
	for(int i = 1; i <= cnt; i++) a[i] = b[i];
	block.clear(); block.push_back({1, 0});
	int sze = 0, flag = 0;
	for(int i = 2, l = 1, r = 1; i <= n + 1; i++) {
		if(i > n || a[i] != (a[i - 1] + 1) % 3) {
			block.push_back({r - l + 1, r}); ++sze;
			l = r = i;
		} else r = i;
	}
	
	for(int i = 1; i <= sze; i++) {
		L[i] = i; rest[i][0] = rest[i][1] = rest[i][2] = 0;
		for(int j = block[i].se - block[i].fi + 1; j <= block[i].se; j++) rest[i][ a[j] ]++;
		while( L[i] > 1 && Connect(i, L[i] - 1) ) {
			int need = a[ block[ L[i] - 1 ].se ];
			rest[i][need]--;
			rest[i][(need - 1 + 3) % 3]--;
			rest[i][0] += rest[ L[i] - 1 ][0];
			rest[i][1] += rest[ L[i] - 1 ][1];
			rest[i][2] += rest[ L[i] - 1 ][2];
			L[i] = L[ L[i] - 1 ];
		}
		if( pos[ block[i].se ] - pos[ block[ L[i] - 1 ].se ] >= N) { cout << "Yes\n"; return ; }
	}
	cout << "No\n"; return ;
}

signed main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T; cin >> T;
	while(T--) Solve();
	return 0;
}

M. Maimai DX 2077

直接根据表格计算 \(A0,A,B0,B\) 即可。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;

const int MAXN = 2e5 + 5;

double c[10][10], A0, A, B0, B, ach;

signed main()
{
	//ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	for(int i = 1; i <= 4; i++) {
		for(int j = 0; j < 5; j++) scanf("%lf", &c[i][j]);
		//for(int j = 0; j < 5; j++) cout << c[i][j] << " "; cout << "\n";
	}
	
	A0 = 1.0 * (c[1][0] + c[1][1]) + 0.8 * c[1][2] + 0.5 * c[1][3]
	+ 2.0 * (c[2][0] + c[2][1]) + 1.6 * c[2][2] + 1.0 * c[2][3]
	+ 3.0 * (c[3][0] + c[3][1]) + 2.4 * c[3][2] + 1.5 * c[3][3]
	+ 5.0 * (c[4][0] + c[4][1]) + 2.5 * c[4][2] + 2.0 * c[4][3];
	A = 1.0 * (c[1][0] + c[1][1] + c[1][2] + c[1][3] + c[1][4])
	+ 2.0 * (c[2][0] + c[2][1] + c[2][2] + c[2][3] + c[2][4])
	+ 3.0 * (c[3][0] + c[3][1] + c[3][2] + c[3][3] + c[3][4])
	+ 5.0 * (c[4][0] + c[4][1] + c[4][2] + c[4][3] + c[4][4]);
	B0 = 1.0 * c[4][0] + 0.5 * c[4][1] + 0.4 * c[4][2] + 0.3 * c[4][3];
	B = 1.0 * c[4][0] + 1.0 * c[4][1] + 1.0 * c[4][2] + 1.0 * c[4][3] + 1.0 * c[4][4];
	//cout << A0 << " " << A << " " << B0 << " " << B << "\n";
	ach = 100.0 * A0 / A + B0 / B;
	printf("%.9lf", ach);
	return 0;
}

标签:int,蔚来,rest,sze,MAXN,long,题解,加赛,define
From: https://www.cnblogs.com/Orzjh/p/16612864.html

相关文章

  • 题解 - CF1715
    C.Monoblock先考虑算出修改前的答案。这明显可以增量法\(O(n)\)。修改的时候先考虑把这里断开,然后再考虑和左右两边连上(大概三种情况,随便讨论)D.2+doors完了,口胡假了......
  • CF 1329 题解
    A.DreamoonLikesColoring题目描述有\(n\)个格子排成一行,每个格子初始没有颜色,进行\(m\)次操作,第\(i\)次操作有一个参数\(l_i\),表示可以把\([p_i,p_i+l_i-......
  • P3605 [USACO17JAN]Promotion Counting P 题解
    solution考虑权值线段树合并:首先离散化,然后对于一个节点,我们将它的所有子树合并上来,并统计所有能力指数的个数(权值线段树基本操作),查询时只需查询\(p_i+1\simn\)的和即......
  • 问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    转自:问题解决——SSH时出现WARNING:REMOTEHOSTIDENTIFICATIONHASCHANGED!1、问题描述终端出现:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WA......
  • STL中map容器的应用(HDU1263水果题解)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263题目描述:TimeLimit:2000MS;MemoryLimit:65536K;夏天来了~Joe经营着一个不大的水果店.他认为生存之道就......
  • Maven中xml配置文件导出到target失败问题解决方案
    Maven中xml配置文件导出到target失败问题解决方案在pom.xml中加入下面代码<!--在build中配置resources,来防止我们资源导出失败的问题--><build><resources>......
  • springboot多线程环境下注入bean空指针问题解决
    多线程环境下注入bean会出现空指针了..我是怎么知道这个bean有有没有在启动的时候注入进来的呢?用于指示bean包含在SpringApplication中时应该运行的接口。多个CommandL......
  • [题解] Atcoder Regular Contest ARC 146 A B C D 题解
    点我看题A-ThreeCards先把所有数按位数从多到少排序,答案的位数一定等于位数最多的三个数的位数之和\(tot\)。对于每个i,把有i位的数排序,并记录每个i的排序结果。最后......
  • CF #526 部分题解
    传送门CF1083CMaxMex求一条\(\text{mex}\)值最大的路径,相当于求一个最大的前缀\(0,1,2,\cdots,k\)使得点权为\(0,1,\cdots,k\)的点都可以被包含在同一条链中。......
  • 洛谷 CF442C 紫 题解
    前言说实话这道题确实不太适合作为紫题,但是它的思路很妙,在此我详细解释一下每一步操作背后的原因。大致流程从前往后读入数组\(a\),对于一个下标\(pos\),若其满足\(a[......