首页 > 其他分享 >CF-932(已更新 A B)

CF-932(已更新 A B)

时间:2024-03-06 20:55:05浏览次数:26  
标签:int CF 更新 cin -- long 932 op define

CF-932(已更新 A B)

之前的CF也都掉分了的打了的,只是都还没补题……

逆天舍友打游戏看抖音都外放-^-,打游戏生气了还要大声地祖安别人……

A

赛时只想到了在暴力的做法,写得还巨丑,鉴定为天天喝八宝粥喝的(⊙﹏⊙)

分析

题意已经如此直白而自己赛时居然一直在死磕一个最复杂的写法

操作

  1. 用两个指针l,r分别从最前面与最后面开始遍历,只要先出现s[l]<s[r],就说明不需要翻转,而先出现s[l]>s[r],说明需要翻转
  2. 操作次数是偶数,意味着输出的字符串只有两种情况:原字符串s或反转后的字符串+s,答案要求字典序最小,只需要输出两者的较小的一个

代码

自己调的虽然但是,它只跑了0ms

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
void solve(){
	int n;cin>>n;
	string s;cin>>s;	
	int r=s.length()-1,l=0;
    int f=1;
	while(l<r){
       if(s[l]<s[r]){
           f=1;
           break;
       } 
       else if(s[l]>s[r]){
           f=0;
           break;
       }
       l++,r--;
    }
    if(f) cout<<s;
	else{
		string ss=s;
		reverse(s.begin(),s.end());
		cout<<s<<ss;
	}
	cout<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}

 

看了题解写的虽然但是,它跑了15ms

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
void solve(){
	int n;cin>>n;
	string s;cin>>s;	
	string ss=s;
	reverse(s.begin(),s.end());
	s+=ss;
	cout<<min(s,ss)<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}

 

B

自己没想明白,看题解的思路才懂是怎么个事

调了两小时(⊙﹏⊙),这样看来是我赛时过不了的题……我这题解有写的必要╰(°▽°)╯

……看了题解的代码,只能说我是sb还有很大优化空间


分析

即找到的区间要满足最小的未在区间内出现过的数op相同,这些区间又包含了a数组的所有元素,所以op一定是a数组中未出现过的数的最小值,又因为要找的区间的op都要相同,所以我们可以干脆就找2个合法的区间就行

如[0 1 7] 这个数是2,[1,1,2] 这个数是0,[2,2,2] 这个数是0

操作

要找最小的未在区间内出现过的数op,可以在输入时记录出现每个数的出现次数及最大值mx,然后遍历0到mx+1,当遍历到的第一个未出现就是op;对于找两个区间,它们必须都含有[0,op)内的所有数,为此,我们可以先用set存下[0,op)内的所有数,用左右两个指针ll,rr分别从数组两边开始遍历,如果左边与右边比op小的数都至少出现1次,说明存在这两个合法区间,两个区间的分界点可以是rr-1与rr或者ll与ll+1

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N=1e5+5;
int a[N],l[3],r[3];
void solve(){
	int n;cin>>n;
	map<int,int>mp;
	int mx=0;
	rep(i,1,n){
		cin>>a[i];
		mx=max(a[i],mx);
		mp[a[i]]++;
	}
	set<int>s;
    //int op=0;
	rep(i,0,mx+1){
		if(!mp[i]){
            //op=i;
			break;
		}
		s.insert(i);
	}
	l[1]=1,r[2]=n;
	// 0 1 7| 1 0 |1 0 3  -> 0 1 7 1 0 | 1 0 3 
	//左边与右边比op小的数都至少出现1次 
	// 0 1 1 
	// 1 1 2
	int ll=1,rr=n,ls=0,rs=0,f=1;
	map<int,int>lmp,rmp;
	while(ll<rr){
		if(ls==rs&&ls==s.size()){
			f=0;
			l[2]=rr,r[1]=rr-1;
			break;
		}
		if(!lmp[a[ll]]&&s.count(a[ll])) ls++;
		if(!rmp[a[rr]]&&s.count(a[rr])) rs++;
		lmp[a[ll]]=1,rmp[a[rr]]=1;
		if(ls<s.size()) ll++;
		if(rs<s.size()) rr--;
	} 
	if(f){
		cout<<-1<<endl;
		return;
	}
	cout<<2<<endl;
	rep(i,1,2){
		cout<<l[i]<<" "<<r[i]<<endl;
	}
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}

标签:int,CF,更新,cin,--,long,932,op,define
From: https://www.cnblogs.com/mono-4/p/18057572

相关文章

  • 并查集解mex_cf932_B. Informatics in MAC
    目录题目概述思路想法参考代码做题反思题目概述原题参考:B.InformaticsinMAC给出一个长度为n的数组,问是否可以将其分为k个(k>1)mex相同的数组,如果可以的话,作出一种划分思路想法假设一个数组可以被分为k(k>2)个区间,每个区间的mex相同,那么可以确定的是,该数组中一定不存在mex这......
  • 1935.Codeforces Round 932 (Div. 2) - sol
    20240306逊哎~打一半去写申请书然后12点睡觉,相对成功!第二天早上起来把赛时发愣的C和F切了。CodeforcesRound932(Div.2)A.EntertainmentinMACCongratulations,youhavebeenacceptedtotheMaster'sAssistanceCenter!However,youwereextremelybore......
  • ps破解版百度云网盘下载+部署教程+更新补丁
    Photoshop是一款由Adobe公司开发的图像处理软件,它是目前业界最为常用的图像处理软件之一。它拥有丰富的功能和强大的操作性,可以处理各种类型的图像,包括照片、绘画、图表等等。本文将介绍Photoshop的基本功能和应用范围。只要你有最低的系统要求,可以有效和平稳地运行......
  • solution-cf877d
    题解CF877D【OlyaandEnergyDrinks】原题一道几乎板子的广搜题。(然而我调了10几次才过我们只需要在广搜板子的基础上添加移动$1-k$步的部分即可就像这样:inth[]={-1,1,0,0};intl[]={0,0,-1,1};for(inti=0;i<4;i++){ for(intj=1;j<=k;j......
  • solution-cf236b
    题解CF236B【EasyNumberChallenge】原题此题一个暴力就可以过了。看着别的大佬不加记忆化吸口氧就过了,而我的却死活TLE可能因为我人丑常数大?注意到i*j*k的值会出现重复,所以考虑记忆化。时间复杂度\(O(n^3\sqrtn)\),跑得飞快代码constintN=1e6+10,M=1073741824......
  • solution-cf120e
    题解CF120E【PutKnight!】原题我一开始以为这题\(n\)为奇数就是先手赢,偶数就是后手赢没想到还真是这样那么要怎么证明呢?一般地,在一个空棋盘上下出一枚棋,会有8个格子被这颗棋限制:XXXXKXXXX容易看......
  • (持续更新)c++中的继承、封装、多态
    c++面向对象的三大特性为:继承、封装和多态c++认为万事万物都皆为对象,对象上有其属性和行为例如:人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌⋯车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调…具有相同性......
  • CF1935E Distance Learning Courses in MAC
    CF1935EDistanceLearningCoursesinMAC题目大意给定\(n\)个变量\(z_i\in[x_i,y_i]\),你可以在范围内任意指定\(z_i\)的值。\(q\)次查询,每次查询给定区间\([l_i,r_i]\),求用这些变量得到的二进制或最大值。思路选择\(z\in[x,y]\),贡献分为两部分(1)\([x,y]\)的......
  • Codeforces Round 932 (Div. 2)
    CodeforcesRound932(Div.2)A-EntertainmentinMAC解题思路:如果翻转字符小于原字符,那么一直翻转即可。否则,翻转\(n-1\)次,然后添加一次。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;typedefdoubledb;......
  • 从CF1935C看带反悔的贪心和multiset
    Problem-C-Codeforces.思路首先很显然对\(b\)数组排序能最小化\(b\)的花费。难点在\(a\)的选择,因为已经对\(b\)排序,不可能再兼顾\(a\)的优劣,所以\(a\)需要类似枚举的技术,这是一个类似搜索最优子集的问题,可以用\(DP\),但是更可以贪心带反悔的贪心这类问题就......