首页 > 其他分享 >Codeforces Round 885 (Div. 2) A - C

Codeforces Round 885 (Div. 2) A - C

时间:2023-07-23 11:55:18浏览次数:51  
标签:tmp 颜色 885 int void Codeforces maxxx Div

A. Vika and Her Friends

Problem - A - Codeforces

题意:

​ 在\(n*m\)的范围内,\(a\)和她的朋友在追逐游戏,每秒\(a\)和朋友必须从当前位置移到相邻的格子里(上下左右),在这一秒结束时\(a\)不能和朋友在同一格内。现在知道\(a\)和每一个朋友的初始位置,问\(a\)是否会被朋友追上。

思路:

​ 比赛的时候手推模拟了几轮,发现当\(a\)和朋友的曼哈顿距离为奇数时,不会被追上,当曼哈顿距离为偶数时,则一定会在有限轮被追上。

​ 赛后仔细想了想,可以把每个格子进行染色,得到类似国际棋盘的棋盘格,若二者在相同颜色的格子内,则一定能被追上,否则不会。

void QAQ(){
    cin >> n >> m >> k;
    int x, y;
	cin >> x >> y;
	bool flag = true;
	for(int i = 1; i <= k; i ++){
		int xx, yy;
		cin >> xx >> yy;
		if((abs(x - xx) + abs(y - yy)) % 2 == 0){
			flag = false;
		}
	}
	if(flag) cout << "YES" << endl;
	else cout << "NO" << endl;
}

B. Vika and the Bridge

Problem - B - Codeforces

题意:

​ 一段长度为\(n\)的序列,每个位置被涂上了\(1-k\)中的一种颜色,现在需要从\(0\)走到\(n + 1\),每次只能限定一个颜色行走。我们可以最多进行一个操作,将任意\(1-n\)的一个位置的颜色改变为我们想要的颜色,问我们每次行走跳过格子的最大值最小为多少。

思路:

​ 一开始一眼二分,敲完后意识到时间复杂度不对。于是重新思考解法。

​ 发现每次改变颜色时,将当前改变的颜色的最大跨越距离减半为最佳。那么就将减半后的距离和原来第二大的距离做比较取大者,就是当前颜色一次改变后最大的跨越距离,对每个颜色记录,取其中最小的距离即可。

void QAQ(){
    cin >> n >> m;
    vector<vector<int>> col(m + 1);
    for(int i = 1; i <= n; i ++){
    	int x;
    	cin >> x;
    	col[x].emplace_back(i);
	}
	int ans = INF;
	for(int i = 1; i <= m; i ++){
		int maxx = 0, maxxx = 0;
        //最大        次大
		col[i].emplace_back(n + 1);
		int k = 0;
		for(auto x : col[i]){
			int tmp = x - k - 1;
			k = x;
			if(tmp > maxx){
				maxxx = maxx;
				maxx = tmp;
			}
			else if(tmp > maxxx){
				maxxx = tmp;
			}
		}
		ans = min(ans, max(maxx / 2, maxxx));
	}
	cout << ans << endl;
}

C. Vika and Price Tags

C - Vika and Price Tags

题意:

​ 初始两串数列\(a, b\),对于第\(i\)个数,令\(c_i=|a_i-b_i|\),然后将数列\(a=b,b = c\)。重复这样的操作,问是否可能让\(a\)串全部变成0。

思路:

​ 很显然可以看出当出现第一个0之后,每三轮会有一次循环,那么我们需要计算需要多少轮会出现第一个0。

​ 进行手推模拟,若假设\(a > b\),那么\(a, b\ \ ->\ \ b,a -b\ \ ->\ \ a-b,a-2b\ \ ->\ \ a-2b,b\),可以发现,每隔三轮,如果\(a>2b\),那么\(a\)就会相应的减少\(2b\),反之亦然,那么我们可以靠这个来对计算进行加速。

void QAQ(){
	cin >> n;
	vector<int> a(n + 1), b(n + 1);
	for(int i = 1; i <= n; i ++){
		cin >> a[i];
	}
	for(int i = 1; i <= n; i ++){
		cin >> b[i];
	}
	int tmp = -1;
    //记录当前循环次数对3取余结果,每对数的结果相同,就可以认为能在有限轮循环内得到全为0的数列
	for(int i = 1; i <= n; i ++){
		int cnt = 0;
		if(!a[i] && !b[i]) continue;//ab全为0时无论多少轮循环都不影响
		auto cal = [&] (int &x, int &y) -> void{
			if(y && x > 2 * y) x %= 2 * y;
			else if(x && y > 2 * x) y %= 2 * x;
            //根据上面手推的结果对计算加速
			cnt = (cnt + 1) % 3;
			x = abs(y - x);
			swap(x, y);
		};
		while(a[i]){//要求a_i为0
			cal(a[i], b[i]);
		}
		if(tmp != -1 && tmp != cnt){
			cout << "NO" << endl;
			return ;
		}
		tmp = cnt;
	}
	cout << "YES" << endl;
}

tips: 当面对若干个数的运算找规律时,可以考虑限定其的大小关系(如大于或小于),使用诸如a,b之类的字母进行替换运算,更容易发现规律

标签:tmp,颜色,885,int,void,Codeforces,maxxx,Div
From: https://www.cnblogs.com/woods4325/p/17574835.html

相关文章

  • Codeforces Round 886 (Div. 4)补题
    CodeforcesRound886(Div.4)A~D://A:boolsolve(){ cin>>a[1]>>a[2]>>a[3]; sort(a+1,a+4); returna[2]+a[3]>=10?1:0;}//B:voidsolve(){ intn; cin>>n; intmaxa=0; intnum=0; intx,y; for(inti=1;i<=n;i++){cin>......
  • Codeforces Round 886 (Div. 4)
    F.WeWereBothChildren题解:约数我们先利用\(map\)记录\(a_i\)的出现次数然后对\(map\)中的每一个元素的在其所有不超过\(n\)的倍数的位置上都加上对应的贡献时间复杂度:调和级数\(O(nlogn)\)constintN=2e5+10,M=4e5+10;intn;inta[N];map<int,int>......
  • Codeforces Round 886 (Div. 4)
    CodeforcesRound886(Div.4)A-ToMyCritics思路:最大的两个数的和大于等于10则YES#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;cons......
  • 「解题报告」Codeforces Round 886 (Div. 4)
    比赛地址:Dashboard-CodeforcesRound886(Div.4)-Codeforces由于时间太晚了,因此并没有参加比赛,题目都是后来补做的。A.ToMyCriticsProblem-A-Codeforces\(T\)组数据,有\(a,b,c\)三个数,判断是否存在两个数的和\(sum\ge10\)。/*Thecodewaswrittenby......
  • Codeforces 1456E - XOR-ranges
    考虑一个\(L\lex\leR\)的数\(x\),必然是一段前缀贴着\(L\)或者\(R\),然后下一位脱离了\(L\)和\(R\)的限制,后面随便乱填。注意到一个性质,对于某一位\(d\),考虑这一位上没有限制的那些位置,最优方案肯定是令其等于其左边(或者右边)第一个有限制的数的第\(d\)位上的值。这......
  • Codeforces Round 886 (Div. 4)
    A.ToMyCritics#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){vector<int>a(3);for(auto&i:a)cin>>i;sort(a.begin(),a.end());if(a[2]+a[1]>=10)cout......
  • Codeforces 1830E - Bully Sort
    这种题肯定首先要寻找不变量。显然后面排好序的后缀不会被改变。因此从整体上来看我们的流程肯定是,如果当前\(p_n=n\),就令\(n\)减一,否则你一步换的\(i\)肯定满足\(p_i=n\)。而显然\(\min\limits_{j=i}^np_j\lei\),因此我们考察\(\sum|i-p_i|\)和\(\sum\limits_{i<j}[p_......
  • Codeforces 794G - Replace All
    一个比较垃圾的做法,卡着时限过了这道题。首先大胆猜个结论:要么\(|s|=|t|\),此时\(A,B\)任取,要么存在字符串\(c\)和整数\(x,y\)使得\(A=c^x,B=c^y\),其中\(c^x\)表示\(x\)个\(c\)拼接得到的结果。证明的话感觉还挺复杂的,可能要border引理之类的东西,不过我是先写了个......
  • Vue3 响应式全局对象json 动态绑定界面三 (Div块样式 字符串叠加)
    效果 man.js  定义响应式全局对象 globalData//全局对象constglobalData=reactive({missedCallData:"",currentUserTel:"",})app.provide('globalData',globalData);在main.js的函数中改变missedCallData 的值从而改变界面列表//改变全局变量gl......
  • Vue3 响应式全局对象json 动态绑定界面四 (Div块样式 Json数据绑定)
    效果man.js  定义响应式全局对象 globalData//全局对象constglobalData=reactive({extTelTalkData:[{userExten:"1000",userName:"刘亦菲",callStatus:"通话"},{......