首页 > 其他分享 >Codeforces Round #829 (Div. 2)-C1

Codeforces Round #829 (Div. 2)-C1

时间:2022-10-27 22:14:15浏览次数:84  
标签:ch long 2i 829 a2i Div include C1

C1

题目链接:https://codeforces.com/contest/1754/problem/C1

emmm,不知道怎么说,做的时候考虑的问题是我通过什么方法来划分整个数组使得题意成立,后面又困在怎么判断是否存在的问题。

经过一番他人的点拨之后,才明白其实还是自己的想法不太成熟。“Note that it is not required to minimize the number of segments in the partition.”原文中的这句话一开始看其实没感觉有什么,但是现在看感觉和B好像,就是它仍旧是一个存在性问题!!!所以你只有能够找到一个适当的便捷的方法就行。

下面说说思路吧(来自官方题解的思路)

  对于整个数组的和,如果它是个奇数,那么原序列必定不存在相应的操作使其满足题意,因为0是一个偶数,而题目所给的操作只是修改组成和的元素的正负,没法改变正负

  当和为偶数时,那么应该是存在相应的操作(怎么划分的方法应该有很多,但是这里只介绍自己理解的一种):因为和为偶数,那么n应该也是偶数(1+1=2,1-1=0,-1-1=-2),故仅考虑a2i-1与a2i的关系。

    ①a2i-1=a2i时,将(2i-1,2i)划为一组即可,这时alternating sum(2i-1,2i)=0;

    ②a2i-1!=a2i时,将(2i-1,2i-1)、(2i,2i)分别划为一组即可。因为a[i]=±1,故当a2i-1!=a2i时,a2i-1+a2i=0一定成立,此时alternating sum(2i-1,2i-1)+alternating sum(2i,2i)=0;

  故题目就可以解了。

最终代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f;
int n;
vector<int> a,b;

void solve(){
	cin>>n;
	a.assign(n+5,0);
	b.assign(n+5,0);
	for(int i=1;i<=n;++i){
		cin>>a[i];
		b[i]=b[i-1]+a[i];
	}
	if(b[n]%2){
		cout<<-1<<endl;
		return ;
	}
	deque<int> ans;
	int cnt=0;
	for(int i=1;i<=n;i+=2){
		if(a[i]==a[i+1]){
			ans.push_back(i);
			ans.push_back(i+1);
			++cnt;
		}
		else{
			ans.push_back(i);
			ans.push_back(i);
			cnt+=2;
			ans.push_back(i+1);
			ans.push_back(i+1);
		}
	}
	cout<<cnt<<endl;
	for(int i=0;i<cnt;++i){
		cout<<ans.front()<<' ';
		ans.pop_front();
		cout<<ans.front()<<endl;
		ans.pop_front();
	}
	return ;
}

signed main(){
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

标签:ch,long,2i,829,a2i,Div,include,C1
From: https://www.cnblogs.com/Qiansui/p/16834176.html

相关文章

  • CF1690(Div3) E. Price Maximization 好题
    题目传送门首先,可以发现,我们不关心原数字的大小,只关心他们除以\(k\)之后的余数。如此考虑:两个数相加,\((a+b)/k=a/k+b/k+(a\)\(mod\)\(k+b\)\(mod\)......
  • Codeforces Round #707 (Div. 1, based on Moscow Open Olympiad in Informatics) A
    A.GoingHome观察ai<=2.5e6显然我们两数之和最多5e6我们开桶让后怎么暴力让我发愁了显然我们知道我们可能一个数被用了好多次这样显然不行可以想到就是把这个数对......
  • Codeforces Round #643 (Div. 2) C
    C.CountTriangles显然两边之和大于第三边我们可以先预处理出来这个两边之和我们暴力枚举x然后区间赋值[x+b,x+c]+1然后最后暴力枚举第三个边然后将大于第三边的方案......
  • P4349 [CERC2015]Digit Division
    题目传送门思路以下纯考场思路。今天模拟赛考到了这题的加强版,然后预处理写炸了,\(100\)变成\(70\),当是给CSP攒rp了。首先一眼看到题目可能会没有思路,没什么关系,......
  • Codeforces Round #673 (Div. 2) C. k-Amazing Numbers
    题面Youaregivenanarrayaconsistingofnintegersnumberedfrom1ton.Let’sdefinethek-amazingnumberofthearrayastheminimumnumberthatoccurs......
  • Codeforces Round #828 (Div. 3) A-F
    比赛链接A题解知识点:贪心,模拟。遇到没用过的数字就给个字母,遇到用过的数字就对照字母是否一致。时间复杂度\(O(n)\)空间复杂度\(O(n)\)代码#include<bits/stdc+......
  • Codeforces Round #632 (Div. 2) / 1333C】- C. Eugene and an array
    题面Eugenelikesworkingwitharrays.Andtodayheneedsyourhelpinsolvingonechallengingtask.Anarrayccisasubarrayofanarraybbifcccanbeobta......
  • Codeforces Round #725 (Div. 3) ABC(双指针)F
    https://codeforces.com/contest/1538AB都没啥好说的,C卡了半天,F挺好写的,找到规律了就直接ac1300的题目卡半天,1500的题目写的顺顺利利,真呆啊我A.StoneGame#include<......
  • Codeforces Round #829 (Div. 2)
    Contest链接E题意简述给长为\(n\)序列,随机等概率交换两个不同位置(\(i<j\))的值,要求\(a_i>a_j\)时才能交换。\(n\le200000\)像这个题但是强制要求\(a......
  • Codeforces Round #690 (Div. 3) F
    F.TheTreasureofTheSegments理解题意就是要让我们找一个线段+他相交的所有线段max我们暴力枚举线段然后用sum-不相交的不相交的就好算了只有两种情况一个线段左......