首页 > 其他分享 >Codeforces Round 975 (Div. 2)

Codeforces Round 975 (Div. 2)

时间:2024-10-02 20:22:28浏览次数:6  
标签:975 const fa int scanf Codeforces -- while Div

一万四参赛,VP赛时60

A. Max Plus Size

一定选择最大值,若有多个最大值,优先选在奇数位置的最大值,后间隔涂上红色。

#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int T, n, a[N];

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		int mx = 0;
		for(int i = 1; i <= n; i ++)
			scanf("%d", &a[i]), mx = max(mx, a[i]);
		if(n & 1) {
			int flag = 0;
			for(int i = 1; i <= n; i ++)
				if(mx == a[i] && (i & 1)) flag = true;
			printf("%d\n", mx + n / 2 + flag);
		}
		else printf("%d\n", mx + n / 2);
	}
	return 0;
}

B. All Pairs Segments

对于相邻两个数之间的区间,所有数被覆盖次数相同,且与左右节点数相关,列式子计算即可。

用 map[x] 记录恰好被 x 条线段覆盖的数的数量。

针对询问输出即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int T, n, m, a[N];

int main() {
	scanf("%d", &T);
	while(T --) {
		map<long long, int> mp;
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= n; i ++)
			scanf("%d", &a[i]);
		for(int i = 2; i <= n; i ++) {
			long long s = 1ll * (i - 1) * (n - i + 1);
			mp[s] += a[i] - a[i - 1] - 1;
		}
		for(int i = 1; i <= n; i ++) {
			long long s = 1ll * (i - 1) * (n - i);
			s += n - 1;
			mp[s] += 1;
		}
		while(m --) {
			long long k;
			scanf("%lld", &k);
			printf("%d ", mp[k]);
		}
		printf("\n");
	}
	return 0;
}

C. Cards Partition

每个抽屉里面不能有相同的卡片,因此每个抽屉最多 n 张卡片。另一方面,最少得有 max(a[i]) 个抽屉。

当 k 较大时,直接输出 min{n, sum / max(a[i])} 。

当 k 较小时,从 sum / max(a[i]) 开始枚举每个抽屉中卡片的数量。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long T, n, k, a[N];

int main() {
	scanf("%lld", &T);
	while(T --) {
		scanf("%lld%lld", &n, &k);
		long long sum = 0, mx = 0;
		for(int i = 1; i <= n; i ++)
			scanf("%lld", &a[i]), sum += a[i], mx = max(a[i], mx);
		if(sum / mx != (sum + k) / mx)
			printf("%d\n", min((sum + k) / mx, n));
		else {
			for(int i = sum / mx; i >= 1; i --) {
				int t = sum % i;
				if(t == 0) t = i;
				if(i - t <= k) {
					printf("%d\n", i);
					break;
				}
			}
		}
	}
	return 0;
}

D. Speedbreaker

显然,征服区间时刻是连续。

对于每一时间点 i ,找到最左端小于等于 i 的 a[l] ,最右端小于等于 i 的 a[r] 。在 i 时刻 [l,r] 内城市都得被征服。

因此出发点只能是在区间 [r - i + 1,l + i - 1] 内。

求出每个区间求并即可。

注意:如第 i 个时间点导出的起始点区间长度小于 i ,则无解。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int T, n, s[N], l[N], r[N];

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		for(int i = 1; i <= n; i ++) s[i] = 0, l[i] = 0;
		for(int i = 1, x; i <= n; i ++) {
			scanf("%d", &x);
			if(!l[x]) l[x] = i;
			r[x] = i;
		}
		int L = 0, R = 0;
		for(int i = 1; i <= n; i ++)
			if(l[i]) {
				if(!L) L = l[i], R = r[i];
				else L = min(l[i], L), R = max(R, r[i]);
				l[i] = L, r[i] = R;
			}
		int cnt = 0;
		bool flag = true;
		for(int i = 1; i <= n; i ++)
			if(l[i]) {
				int L = max(1, r[i] - i + 1);
				int R = min(n, l[i] + i - 1);
				if(R - L + 1 < i) flag = false;
				else s[L] ++, s[R + 1] --;
				cnt ++;
			}
		int t = 0, ans = 0;
		for(int i = 1; i <= n; i ++) {
			t += s[i];
			if(t == cnt) ans ++;
		}
		if(!flag) ans = 0;
		printf("%d\n", ans);
	}
	return 0;
}

E. Tree Pruning

选定一个深度,深度大于的节点需要全部剪掉,深度小于的子节点及枝桠需要剪掉。

因此从 1 开始枚举深度,深度每增加 1 ,所有叶子节点伸长一个单位(或者分叉)。没有伸长的叶子节点回溯修剪掉多余的枝桠。

每次更新答案,取最小值即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int T, n, ans, cnt[N], fa[N];
vector<int> g[N];

void get_ans(int rt) {
	queue<int> q;
	q.push(rt); cnt[rt] = 1; fa[rt] = 0;
	int res = n - 1;
	while(q.size()) {
		int t = q.size();
		for(int i = 0; i < t; i ++) {
			int x = q.front(); q.pop();
			for(auto y: g[x]) {
				if(y == fa[x]) continue;
				q.push(y);
				cnt[x] ++;
				fa[y] = x;
				res --;
			}
			if(!cnt[x]) {
				res ++;
				while(-- cnt[fa[x]] == 0) res ++, x = fa[x];
			}
		}
		ans = min(ans, res);
	}
}

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		for(int i = 1; i <= n; i ++)
			g[i].clear(), cnt[i] = 0;
		for(int i = 2, u, v; i <= n; i ++) {
			scanf("%d%d", &u, &v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		ans = n;
		get_ans(1);
		printf("%d\n", ans);
	}
	return 0;
}

标签:975,const,fa,int,scanf,Codeforces,--,while,Div
From: https://www.cnblogs.com/lingo12321/p/18445027

相关文章

  • 【LGR-197-Div.2】洛谷 10 月月赛 I &「SFMOI」Round I(A,B,C)
    A.StrangeCakeGame对于小W,往下走最赚,对于小M往右走最赚,于是路线形成了个折线,直接对应竖坐标位置去看看横坐标符不符合要求即可#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<m......
  • Codeforces Global Round 19 E. Best Pair
    \(cnt\)的取值种类数不超过\(\sqrtn\)。因此我们可以枚举\(cnt\)然后贪心选最大的值。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;voidsolve()......
  • CF2020(Codeforces Round 976 (Div. 2))
    CF2020A.FindMinimumOperations难度:红转换进制,每一位上数字相加。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llt,n,k,ans;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>t;while(t--){cin&......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......
  • pbootcms编辑器过滤div代码解决办法
    在使用PbootCMS建站时,如果需要在专题内容中加入含有HTML代码的文字,但发现编辑器将 div 标签转换成了 p 标签,可以通过以下步骤进行修改。修改步骤修改 ueditor.all.js 文件找到 core->extend->ueditor->ueditor.all.js 文件。在大约第10830行,将 allowDivTransToP......
  • Codeforces Round 956 (Div. 2)
    无法评价,不知道是我傻逼还是题傻逼。A.ArrayDivisibility题意让你构造一个长度为\(n\)的序列,满足对于每一个\(i\)\((i\in[1,n])\),让\(a_j\)之和为\(i\)的倍数,\(j\)能被\(i\)整除。换句话说,让你构造一个长度为\(n\)的序列,满足\(\sum_{j|i}a_j\)能被\(i\)......
  • Codeforces2014E Rendez-vous de Marian et Robin(分层图最短路)
    题意给定一个无向图,含有\(n\)个点和\(m\)条边。题解点击查看代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;constexpri64inf=1e18;voidsolve(){intn,m,h;cin>>n>>m>>h;vector<vector<......
  • Codeforces Round 974 (Div. 3) - D题
    这道题题意就是你有k个工作,每个工作都有一个时间区间左边界l和右边界r,妈妈和哥哥要来看你,时长为d,题目要求求出1.哥哥看你的这段时间工作时间段重叠最多是多少?2.妈妈看你的这段时间工作时间段重叠最少是多少?这道题如果硬做的话可能就是线段树了(蒟蒻暂时没有想到其他的做法),但如果......
  • Codeforces Round 973 (Div. 2) - D题二分
    首先这道题的一个坑点就是求max(a[1],a[2],...,a[n])和求min(a[1],a[2],...,a[n])是完全独立的,不会相互影响(可能是我读题能力太差,一直卡在这点了。。。)这道题二分是一种很好想的方法,题中提到max和min,我们就可以想到只要让最大值最小,让最小值最大就可以达到我的目的了,二分的......
  • Codeforces Round 976 (Div. 2)
    VP的这一场,真的唐完了。。。A.FindMinimumOperations题意给你一个\(n\)和\(k\),每次操作可以让\(n\)减去一个\(k\)的\(x\)次方,即\(n-k^x\)。问你最少操作几次能够让\(n\)变成\(0\)。思路我们先考虑如果\(k\)是\(2\)的情况,那么题目就转化成了\(n\)的......