首页 > 其他分享 >Codeforces Round 971 (Div. 4)

Codeforces Round 971 (Div. 4)

时间:2024-09-04 14:04:23浏览次数:11  
标签:971 int void Codeforces long cin solve Div 步数

A - Minimize!

inline void solve(){
	int a, b;
	cin >> a >> b;

	cout << b - a << '\n';
}

B - osu!mania

inline void solve(){
	int n;
	cin >> n;

	vector<string> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	for (int i = n - 1; i >= 0; --i) {
		int p = a[i].find('#');
		cout << p + 1 << " \n"[i == 0];
	}
}

C. The Legend of Freya the Frog

题意:给定x和y,k,每次可以移动0~k步数,每次移动后面向另一个方向,初始时面向x(只能移动面向的方向),问最少移动次数(0, 0->x, y)

思路:因为可以移动0步,所以就看最后一步是在x是在y。

总结:假如最少移动步数为1,如何考虑?先算出x或者y方向哪个需要移动的步数多,然后看这个步数在另一个方向上是否能够满足移动不超过终点,至于构造问题,就是先求出每次移动的基础步数,然后再取余,在前面或者后面的步数上分散这些余数即可

inline void solve(){
	int x, y, k;
	cin >> x >> y >> k;

	if ((x + k - 1) / k > (y + k - 1) / k) {
		cout << (x + k - 1) / k * 2 - 1<< '\n';
	}
	else {
		cout << (max(x, y) + k - 1) / k * 2 << '\n';
	}
}

D. Satyam and Counting

题意:给定n对点,y不超过1,问有多少种方式可以组成直角三角形。

总结:y不超过1,就直接暴力写就行。 一开始想的是对点排序,但是不如这样直接把点记录到坐标上方便。

inline void solve(){
	int n;
	cin >> n;

	vector<array<int, 2>> a(n + 233, {0, 0});
	for (int i = 0; i < n; ++i) {
		int x, y;
		cin >> x >> y;
		a[x][y] ++;
	}

	long long ans = 0;
	for (int i = 0; i <= n; ++i) {
		if (a[i][0] && a[i][1]) {
			ans += n - 2;
		}
		if ((i && a[i][0] && a[i - 1][1] && a[i + 1][1])) {
			ans ++;
		}
		if ((i && a[i][1] && a[i - 1][0] && a[i + 1][0])) {
			ans++;
		}

	}

	cout << ans << '\n';
}

E. Klee's SUPER DUPER LARGE Array!!!

题意:给定长度为n,数值连续(从k开始)的数组,求满足条件的最大值。

思路:一眼就是前缀和然后暴力找点就行,但是n太大不允许暴力,于是问题转化为寻找差值最小的前后缀问题。因为前缀和递增,所以直接在n上二分,找到左区间<=右区间的第一个端点,然后再跟>右区间的第一个端点来比较,取最优的即可。

总结:下次看清数据范围,调试了才发现n数量级不对,第i个数的值写错了,应该是k + i - 1

inline void solve(){
	long long n, k;
	cin >> n >> k;


	long long sum = ((k + n - 1 + k) * n / 2);

	long long ans = sum;
	int l = 1, r = n - 1;
// 2 3 4 5 6 7 8
	auto valid = [&](int i) {
		long long left = (k + i - 1 + k) * i / 2;
		long long right = sum - left;
		return left <= right;
	};

	while (l < r) {
		int mid = (l + r + 1) >> 1;
		if (valid(mid)) {
			l = mid;
		}
		else {
			r = mid - 1;
		}
	}

	auto cal = [&](int i)->long long {
		if (i == 0) {
			return INF_LL;
		}
		long long left = (k + i - 1 + k) * i / 2;
		long long right = left - sum;
		return abs(left + right);
	};

	ans = min({ans, cal(l), cal(l + 1)});

	cout << ans << "\n";
}

F. Firefly's Queries

题意:长度为n的数组循环n次,每次循环从第i个下标开始。q个查询给定区间端点[l, r],求[l, r]的和。

思路:前缀和差分一步到位,对于当前端点x,先求出前面数组完整循环了多少次,然后求出本次循环开始的下标以及循环的长度,如果这个长度在pref[n]之前结束,可以直接算,否则要先把后面这部分加上来,再去加前面一部分。

总结:很久没接触这个类型了,一时没想到根据下标如何快速的计算出一个sum值出来。题型跟e有点像,e是循环要被填充,这个是直接循环,不过都要指定一个新的起点出来,计算贡献。

inline void solve(){
	int n, q;
	cin >> n >> q;

	vector<long long> pref(n + 1);
	for (int i = 0; i < n; ++i) {
		int t;
		cin >> t;
		pref[i + 1] = pref[i] + t;
	}

	auto cal = [&](long long x) {
		int q = x / n;
		long long res = pref[n] * q;
		long long rem = x % n;
		if (rem + q <= n) {
			res += pref[rem + q] - pref[q];
		}
		else {
			res += pref[n] - pref[q] + pref[rem + q - n];
		}
		return res;
	};

	while (q --) {
		long long l, r;
		cin >> l >> r;

		cout << (cal(r) - cal(l - 1)) << '\n';
	}
}

unrated 是真无语啊

标签:971,int,void,Codeforces,long,cin,solve,Div,步数
From: https://www.cnblogs.com/yxcblogs/p/18396304

相关文章

  • Codeforces Round 971 (Div. 4) A-G1
    Ab-a#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;mt19937rnd(time(0));#defineintlonglongtypedeftuple<int,int,int>tp;#definexfirst#defineysecondtypedefpair<int,int>pii;typedefpair<double,double......
  • Educational Codeforces Round 169(A-D)
    A.ClosestPoint        给你一组点。你必须在这个集合中加入一个整数的点,使它与集合中现有的每一个点不同,并且它成为与集合中每一个点**最近的点。这可能吗?(输入yesorno)    一道思路题,简单思考可以发现,如果数字超过两个,那么这题答案就是NO。当两个数字的......
  • Codeforces Round 966 (Div. 3)
    ab略...C:map嵌套水过去的,复杂度\(nlog^2n\),感觉不如正解#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definepiipair<int,int>#definemkpmake_pair#definefirfirst#definesecsecond#definepbpush_backconstintmaxn=2e5+100;......
  • Codeforces Round 970 (Div. 3)(VP)
    A.Sakurako'sExam总结:一看n<=20,直接暴力+剪枝即可inlinevoidsolve(){ inta,b; cin>>a>>b; vector<int>d; d.reserve(a+b); while(a--){ d.push_back(1); } while(b--){ d.push_back(2); } autodfs=[&](auto&......
  • Codeforces Round 968 (Div. 2)
    vp的,老规矩跳过abC:根据题意我们知道三个不一样的字母连续放一定可以,然后观察样例发现好像把两个不同的字母轮流放也可以。进一步猜测(瞎猜的)发现这个好像只要把不同的挨个放进去就行了(本来以为可能要按数量排序但是似乎根本不用),最后剩下的全放一起也没事。然后就过了。#includ......
  • Codeforces Round 970 div3
    CodeforcesRound970div3错过的一场比赛,第二天早晨VP,题目的通过率还挺奇怪A.Sakurako'sExamhttps://codeforces.com/contest/2008/problem/A题意:有a个1和b个2的数组,在1和2前面增添加减号,判断是否能让结果为0思路:1个2需要2个1进行填补,不如先让2自己进行消去,如......
  • Codeforces Round 969 Div.2+Div.1
    A.Dora'sSet注意到任意两个偶数的\(\gcd\)都大于\(1\),因此选择的三个数中至多一个偶数,而注意到相邻的奇数一定互质,因此每次选两个奇数一个偶数,答案=奇数的个数÷2点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsigned......
  • codeforces做题记录(1924B)& 回顾线段树
    1924B.SpaceHarbour题意:n个点排成一行,其中某些点上面建有港湾,港湾有一个权值,对每个点我们定义点的权值为“左边(包括自己)第一个港湾上的权值\(\times\)到右边(包括自己)第一个港湾的距离”(保证在一开始1号和n号点上都有港湾)。有q次操作:操作1给定x和v,表示在x点上建立权值为v的......
  • Codeforces Round 969 (Div. 2)
    ab题没啥好说的,b题一开始看题错成线段树了,后面发现维护最大值就过了(我就说b怎么会有线段树)。。。C:DoraandC++卡的我死死的,好久没卡c了,数论果然是最短板。。。我有两个推论,但是一个都不会用:1.翡蜀定理。(但是这题只有正数)(处理两个数的情况)2.断环为链。(但是我只会n方,即以每个......
  • codeforces写题随录 ##1
    菜鸡刷题比赛日记之数学知识相关[https://codeforces.com/contest/2007/problem/C](C.DoraandC++)这题包含加A和加B,此处应该先考虑特殊情况a=b,若不进行如何操作的话,初始答案应该是res=a[n]-a[1](排序之后),然后进行操作,想想该如何最小化极差。为了便于计算,先将数组中每个数字......