首页 > 其他分享 >Codeforces Round 879 (Div

Codeforces Round 879 (Div

时间:2023-06-19 16:55:05浏览次数:41  
标签:重叠 879 int 个数 Codeforces long 区间 Div first

Codeforces Round 879 (Div. 2) A-D题解

第一次写题解,请见谅O3O

a题代码是完整的,后面的只显示主要内容的代码

A. Unit Array

题目解释

他会给你一个只包含1或者-1的数字串,每次操作可以把1变成-1或者把-1变成1,要求操作之后的串满足每一位累加>=0,每一位累乘=1,求最小的操作次数

思路分析

累加>=0说明1的个数要大于等于-1的个数,累乘=1说明-1的个数是偶数,所以只需要比较小于等于n的一半的最大偶数和-1的个数

代码

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl '\n'
#define int long long
typedef long long ll;
typedef unsigned long long ull;
const ll N=5e5+7;
constexpr ll mod = 1e9+7;
const ll inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;


void solve()
{
	int n,num=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int t;
		cin>>t;
		if(t==-1) num++;
	 } 
	 if(num%2==0&&num<=n/2)
	 {
	 	cout<<0<<"\n";
	 }
	 else if(num<=n/2)
	 {
	 	cout<<"1\n";
	 }
	 else
	 {
	 	int t=n/2;
	 	if(t%2==1) cout<<num-t+1<<"\n";
	 	else cout<<num-t<<"\n";
	 }
}
signed main()
{
	IOS;
	int _=1;
	cin>>_;
	while(_--)
	{
		solve();
	}
	return 0;
}


B. Maximum Strength

题目解释

告诉你两个数字,你可以在两个之间选择任意两个数(包括端点),要求找到每一位上数字差值的和的最大值

思路分析

最优的解法就是找到形如100000和99999 如果位数不相同就是第一个数加上后面位数*9,如果位数相同,就是找到第一个不相同的,答案是第一个不相同的差值加上后面位数 *9

代码

void solve()
{
	string a,b;
	cin>>a>>b;
	if(a.length()<b.length())
	swap(a,b);
	int sum=0,l=a.length()-b.length();
	for(int i=0;i<l;i++) 
	{
		b="0"+b;
	}
	int g=0;
	for(int i=0;i<a.length();i++)
	{
		if(g==0&&a[i]!=b[i])
		{
			g=1;
			sum+=abs(a[i]-b[i]);
		}
		else if(g==1)
		{
			sum+=9;
		}
	}
	cout<<sum<<"\n";
}

C. Game with Reversing

题目解释

给你两个字符串,A可以选择一个字符串中的一个字符将他变成另一个字符,B可以选择一个字符串将他对称翻转,A是先手,操作顺序是ABABABAB·····要求你找到使两个字符串完全相同的最小的操作次数。

思路分析

B的操作,就相当于正方向匹配和反向匹配,并且操作两次就相当于没有操作(有点类似a的-1),那我们只要找到正向匹配不同字符的个数和最小的偶数次反转操作,还有逆向匹配不同的字符个数和最小奇数次翻转操作。这两个的最小值就是答案

代码

void solve()
{
	int n,num1=0,num2=0;
	string a,b;
	cin>>n>>a>>b;
	for(int i=0;i<n;i++)
	{
		if(a[i]!=b[i]) num1++;
		if(a[i]!=b[n-1-i]) num2++;
	}
	if(num1==0) cout<<0<<"\n";
	else if(num2==0) cout<<2<<"\n";
	else cout<<min(num1+num1-1+(num1-1)%2,num2+num2-(num2-1)%2)<<"\n";
}

D. Survey in Class

题目解释

给你n个区间,要求找到一个区间里面数的个数减去和另一个区间重叠的数的个数的最大值

思路分析

两个区间的情况只有三种,分别是没有任何部分重叠,部分重叠,还有就是一个区间完全被包含。

没有任何部分重叠就是最大的左边界不在区间里面,或者最小的右边界不在区间里面,那就考虑这一区间的本身长度。

部分重叠情况几乎就是上面情况的反面,如果最大的左边界在区间里面,就考虑最大的左边界减去区间左边界;如果最小的右边界在区间里面,就考虑区间右边界减去最小有边界。

第三种情况可能会被非法统计在上面,但是我们只需要考虑最长和最短之间的差,因为如果有多组重叠,并且这个也重叠,那这个肯定是最大的;如果两个是相交的那答案肯定出现在上一种情况;如果不相交,那就会出现在第一种。简单的来说就是如果重叠的情况是答案,那就只可能是最大和最小的重叠。

答案是所有情况的最大值

代码

pair<int,int> p[N];
void solve()
{
	int n,m;
	cin>>n>>m;
	int l1=-1,l2=inf,l=-inf,r=inf;
	for(int i=0;i<n;i++)
	{
		cin>>p[i].first>>p[i].second;
		l1=max(l1,p[i].second-p[i].first);
		l2=min(l2,p[i].second-p[i].first);
		l=max(l,p[i].first);
		r=min(r,p[i].second);
	}
	int ans=l1-l2;
	for(int i=0;i<n;i++)
	{
		if(l>=p[i].first&&l<=p[i].second)
		ans=max(ans,l-p[i].first);
		else ans=max(ans,p[i].second-p[i].first+1);
		if(r>=p[i].first&&r<=p[i].second)
		ans=max(ans,p[i].second-r);
		else ans=max(ans,p[i].second-p[i].first+1);
	}
	cout<<ans*2<<"\n";
}

标签:重叠,879,int,个数,Codeforces,long,区间,Div,first
From: https://www.cnblogs.com/dry-myrica/p/17491555.html

相关文章

  • Understanding JavaScript Garbage Collection: Dive into Reference Counting and Ma
    JavaScript,theprogramminglanguageoftheweb,isoftenpraisedforitsabilitytohandlememorymanagementautomatically.TheJavaScriptengine'sgarbagecollectorplaysapivotalroleinthisprocess.Today,we'lltakeadeepdiveintotwom......
  • Codeforces1 #879 div.2
    第一次参加codeforces比赛,只能做出来俩题,第三个题思路也就一半一半,估计是想不出来的那种,赛后问了下带佬,把我思路添加了点,最终还是A了争取稳过第三题!//A//统计1,-1出现的次数,然后如果-1是奇数,让他变成偶数,次数+1//因为总乘积要是正1,然后再变-1为1,直到>=0为止,这里......
  • tryDiv0
    //tryDiv0.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"intmain(intargc,char*argv[]){ inti,j,k; i=1; j=0; try { k=i/j; } catch(...) { printf("incatch!\n"); } printf("k=%......
  • Educational Codeforces Round 150 (Rated for Div. 2) C. Ranom Numbers
    #include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=2e5+10;typedeflonglongll;//记录每个字母的最前面的位置和最后面的位置intFast[5],End[5];strings,c;llres=-0x3......
  • [数论]Divisor and Gcd
    DivisorandGcd1、算术基本定理:n的质因数分解唯一一些常见结论:1.素数无限2.\(\lim_{n\rightarrow+\infty}n\prod\dfrac{n}{\frac{n}{\ln{n}}}\)(Π(n)表示<=n素数的个数)————即n以下素数个数大约是\(\frac{n}{\ln(n)}\)级别的3.\(Pn=O(nlogn)\)级别的(Pn表示素数)......
  • ARC114F Permutation Division
    题意给定一个\(1\simN\)的排列,Alice把它划分成\(k\)段,Bob把这\(k\)段任意排列。Alice想让字典序最小,Bob想让字典序最大。请问最后的排列。数据范围:\(1\lek\leN\le2\times10^5\)。题解首先Bob的排序只取决于每个段第一个数的大小。字典序不会变小,所以考虑......
  • Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful
    #include<iostream>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],res[N];intt;intmain(){ cin>>t; while(t--){ intn; cin>>n; for(inti=0;i<n;i++){ cin>>a[i]; } intk=a[0]; res[0]=......
  • CodeForces 1841C Ranom Numbers
    洛谷传送门CF传送门先反转\(s\)串,然后考虑dp,设\(f_{i,j,0/1}\)为考虑了\([1,i]\),前缀最大值为\(j\),是否修改过字符的最大得分。转移讨论是否在这个位置修改即可。时间复杂度\(O(n)\)。code//Problem:C.RanomNumbers//Contest:Codeforces-Educational......
  • strDivide2.cpp字符串划分
    //strDivide2.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include"string.h"/*s为bwe@#$at111YYY*oo那么func(s)将打印atbweooYYY★树★(240028358)21:07:57先挑字母,再排序吧国嵌唐老师(22134670)21:21:25我来说说......
  • JavaScript 动态编辑元素某属性值(例如:元素div的class属性)
    元素<divclass="h5-box-search-itemusimglistnodisplay"id="usimglist"></div>(满足条件)动态更新div元素的class属性值://获取目标容器letusimglist=document.getElementById('usimglist');//获取其class的属性值letclassinfo=usimglist.ge......