首页 > 其他分享 >Educational Codeforces Round 156 A-D

Educational Codeforces Round 156 A-D

时间:2023-10-10 19:59:52浏览次数:53  
标签:Educational 156 int Codeforces cin -- solve ans dis

A. Sum of Three

思路1:
1.把数拆成1,2,n-3
2.如果(n-3)%3==0,那么拆成1,4,n-5,可证明n-3如果可被3整除,那么再左移两位一定除不尽

思路2:
1.如果n是奇数,那么可取一个数为2,其他两数为相邻数,如果两数其中一位被整除,那么两者往外走
2.如果n为偶,那么可取一个数为1,同理上

点击查看代码
#include<bits/stdc++.h>
using namespace std;

void solve() {
	int n;
	cin >> n;
	if (n <= 6 || n == 9) {
		cout << "NO\n";
	}
	else if (n % 2) {
		cout << "YES\n";
		int x = (n - 2) / 2, y = n - 2 - x;
		if (x % 3 == 0 || y % 3 == 0) x--, y++;
		cout << 2 << ' ' << x << ' ' << y << '\n';
	}
	else {
		cout << "YES\n";
		int x = (n - 1) / 2, y = n - 1 - x;
		if (x % 3 == 0 || y % 3 == 0) x--, y++;
		cout << 1 << ' ' << x <<' ' << y << '\n';
	}
}

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

B. Fear of the Dark

思路:
1.如果两点在同一个圆上
2.如果俩圆相交或者相切

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define db double
db dis(int x1, int y1, int x2, int y2) {
	return sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void solve() {
	int x[3] = {}, y[3] = {};
	for (int i = 0; i < 3; i++) cin >> x[i] >> y[i];
	db ans = 1e9;
	//在一个圆上,分别计算a,b两圆
	ans = min(ans, max(dis(x[0], y[0], x[1], y[1]), dis(0, 0, x[1], y[1])));
	ans = min(ans, max(dis(x[0], y[0], x[2], y[2]), dis(0, 0, x[2], y[2])));
	//两圆相交或相切
	ans = min(ans, max(dis(x[2], y[2], x[1], y[1]) / 2, max(dis(0, 0, x[1], y[1]), dis(x[0], y[0], x[2], y[2]))));
	ans = min(ans, max(dis(x[2], y[2], x[1], y[1]) / 2, max(dis(0, 0, x[2], y[2]), dis(x[0], y[0], x[1], y[1]))));
	printf("%0.10lf\n", ans);
}

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

C. Decreasing String
思路:
1.如果字符有序,如abcd,则从后往前删
2.如果无须,如adbc,则需要先删除d,变成abc,变成有序
3.则可以利用单调栈记录有序的字符:
3.1如果新来的字符更小,则删除头顶的字符,一直删到小于等于位置,然后把新来的位置插入头顶。
3.2如果新来的更大,直接插入
3.3并计算位置是第几次删除的

利用单调栈

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long 
#define db double
const int N = 1e6 + 10;
int id[N],t[N];//id表示第几次删除
void solve() {
	string s;
	cin >> s;
	int n = s.length();
	s = " " + s;
	int m = 0;
	int x = 0;
	for (int i = 1; i <= n; i++) {
		while (m > 0 && s[t[m]] > s[i]) id[t[m]]=++x,m--;
		t[++m] = i;
	}
	while (m) id[t[m]] = ++x, m--;//此时有序,直接从后面删除
	LL pos,now=n;//pos很大记得开LL
	cin >> pos;
	x = 0;
	while (pos - now > 0) pos -= now, now--, ++x;//x计算删除了几次
	string str = " ";
	for (int i = 1; i <= n; i++) {
		if (id[i] > x) str += s[i];
	}
	cout << str[pos];
}

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

D. Monocarp and the Set

正序有点难算,我们反过来从结果推,此时集合元素为n
1.倒序,如果此位置是>或<,则要删掉最大值或者最小值,只有唯一的方法
2.如果是?,位置为i,那么知道此时集合的元素为i个(i位置还没有放入元素时),那么可放入的元素应该是除去集合内的最值,选法为i-2,累乘ans

特判:如果第一个位置为?无解,因为只可能是确切的数字

对于修改操作:
1.如果修改前的位置元素为'?',那么就需要除以对应位置的选法(因为是取模意义下的除法,要用乘法逆元
2.如果修改成为了'?',则需乘上对应的选法

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define db double
const int N = 1e6 + 10,mod=998244353;

//char s[N];
void solve() {
	int n, m;
	cin >> n >> m;
	LL ans = 1;
	string s;
	cin >> s;
	s = "  " + s;//偏移
	for (int i = 3; i <=n; i++) {
		if (s[i] != '?') continue;
		ans =ans*(1LL*i - 2) % mod;//偏移->防止为0
	}
	cout << (s[2] == '?' ? 0 : ans)<<'\n';

	auto qpow = [](LL a, int b) {//快速幂
		LL res = 1;
		while (b) {
			if (b & 1) res = res * a % mod;
			a = a * a % mod;
			b >>= 1;
		}
		return res;
		};

	while (m--) {
		int x;
		cin >> x;
		x++;//偏移
		char c;
		cin >> c;
		if (s[x]== '?'&&x>2) ans = ans * qpow(1LL*x - 2, mod - 2) % mod;//x大于第一,且s[x]=='?',说明这个位置ans算过要除以这个位置上的权值(乘法逆元)
		s[x] = c;
		if (s[x] == '?'&& x>2) ans = ans * (1LL * x - 2) % mod;//乘上该位置的权值
		cout << (s[2] == '?' ? 0 : ans) << '\n';
	}
}

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

标签:Educational,156,int,Codeforces,cin,--,solve,ans,dis
From: https://www.cnblogs.com/bu-fan/p/17754991.html

相关文章

  • Educational Codeforces Round 156 (Rated for Div. 2)
    Preface沉迷Galgame不打CF懒狗闪总出列!这场在大物课上口胡了前四个题,回去写了也都很顺,然后E题本来做不来的,看了眼昨天校队群里的消息就会做了F题什么东西直接弃A.SumofThree当\(n\bmod3\ne0\)时,用\((1,2,z)\)来凑;否则当\(n\bmod3=0\)时,用\((1,4,z)\)来凑#include<cst......
  • Codeforces Round 706 (Div. 2) A. Split it!
    给一个长度为\(n\)的字符串\(s\)。给定一个正整数\(k\)。询问\(s\)能否等于\(a_1+a_2+\cdots+a_k+a_{k+1}+R(a_k)+R(a_{k-1})+\cdots+R(a_{1})\)。其中\(a_i\)代表一个非空字符串,\(R(a_i)\)代表\(a_i\)的\(reverse\)。由于\(a_{k+1}\)......
  • Codeforces Round 707 (Div. 2, based on Moscow Open Olympiad in Informatics) B. N
    按以下\(n\)次操作制作蛋糕。叠上第\(i\)块面包,然后浇上\(a_i\)单位的奶油。可以使当前往下\(a_i\)块面包沾上奶油。输出空格隔开的\(n\)个数,第\(i\)个的\(0/1\)代表第\(i\)块面包是否沾有奶油。比较显然的思路可以进行差分修改。view1#include<bits/std......
  • Codeforces Round 834 (Div. 3)
    A.Yes-Yes?#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingpii=pair<int,int>;usingvi=vector<int>;conststringT="Yes";voidsolve(){strings;cin>>s;inti=-1;......
  • Codeforces Round 902 Div 1 (CF 1876)
    A.HelmetsinNightLight按花费sort一下,\(b<p\)就让他用\(b\)的花费告诉别人,剩下的人一开始用\(p\)的花费告诉即可。B.EffectsofAntiPimples发现一个数会被所有它的因数贡献,\(O(n\sqrt{n})\)随便算一算,式子略。C.AutosynthesisSolution1想到了建图但没有完......
  • Educational Codeforces Round 156 (Rated for Div. 2)
    EducationalCodeforcesRound156(RatedforDiv.2)A.SumofThree解题思路:如果\(n\leq6或n=9\),无解。若\(n\%3==0,t=\lfloor\frac{3}{n}\rfloor\):若\(t=0\)构造\(1,4,n-5\)否则,构造\(t-3,t,t+3\)若\(n\%3==1:构造1,2,n-3\)若\(n......
  • Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1877。呜呜铃果唱歌太好听了、、、我宣布是第二喜欢的声线,第三喜欢是东北切蒲英,第一喜欢绝赞招募中。这下不得不成为数码推了、、、A答案为\(-\suma_i\)。懒得写代数式子推了,赛时看完题直接......
  • Educational Codeforces Round 152 (Div. 2) D. Array Painting(双指针)
    EducationalCodeforcesRound152(Div.2)D.ArrayPainting//思路:双指针找连续正数段//若段中出现2,则更新两头的0的情况,若为涂色则改为true//若无2,则优先更新左侧0,若左0已经为true,则更新右侧0//数组开头结尾特判#defineintlonglong#defineldlongdoubleusingnam......
  • 练习记录-cf-Educational Codeforces Round 156 (Rated for Div. 2)(A-C)
    好久没打了还是就出了三道不过还好没掉分A.SumofThree就是问能不能把一个数拆成三个不同的且都不能被三整除的数我的思路就是拆成1+2+一个大于等于4的数如果拆了后另一个数是%3==0那么我拆成1+4它肯定就不被整除然后判下相同#include<bits/stdc++.h>#defineclose......
  • Codeforces Round 902 (Div. 2) C. Joyboard 规律
    CodeforcesRound902(Div.2)C.Joyboard//思路:在k=1,k=2,k=3时有解//当k=1时为全0//当k=2时,若m>=n,则先是0然后为1~n,最后一位可以为n的倍数也符合,即n+m/n-1//若m<n则为1~m即m//当k=3时,只能在n+1位是第3个不同情况(大于n),且不能为n的倍数,即(m-n)-(m/n-1)//只......