首页 > 其他分享 >[题解]ABC346 补题C~E

[题解]ABC346 补题C~E

时间:2024-04-05 21:45:03浏览次数:14  
标签:int 题解 0101 long 200010 cntv 补题 ABC346 1010

想起上次的ABC346没打,刚才虚拟参赛打了A~D,E题思路有,但是实现方式没选好导致WA了,没能在赛时做出来。写下题解记录一下~

C - Σ

用求和公式先把\(1\sim k\)的和求出来:\(\frac{k(k+1)}{2}\),然后对于\(A\)数组中的元素依次减去就行(注意相同元素不能减\(2\)次)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,a[200010];
unordered_map<int,bool> m;
signed main(){
	cin>>n>>k;
	int ans=(k+1)*k/2;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(!m[a[i]]){
			m[a[i]]=1;
			if(a[i]<=k) ans-=a[i];
		}
	}
	cout<<ans;
	return 0;
}

D - Gomamayo Sequence

这个题就是让我们把字符串变成一个01交替,但是中间有且仅有一个00或者11的字符串。

所以我们可以枚举在哪里重复,需要注意的是一个位置有两种情况,比如:
1010101001010
0101010110101

从重复的位置分割,可以形成0101+10101010+0101结构的字符串,这样我们只需要知道前缀和后缀需要多少次变化成01011010就行。可以通过预处理来维护前缀的代价和后缀的代价,各需要两个数组,分别维护变成\(0101…\)和\(1010…\)的代价。这样\(O(n)\)枚举,\(O(1)\)查询,总时间复杂度\(O(n)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c[200010];
int f[4][200010];
//0:0101...前缀	1:1010...前缀
//2:0101...后缀 3:1010...后缀
string s;
signed main(){
	cin>>n>>s;
	s=' '+s;
	for(int i=1;i<=n;i++){
		cin>>c[i];
	}
	for(int i=1;i<=n;i++){
		char temp='0'+i%2,ltemp='0'+(n-i+1)%2;
		f[0][i]=f[0][i-1]+(s[i]==temp)*c[i];
		f[1][i]=f[1][i-1]+(s[i]!=temp)*c[i];
		f[2][n-i+1]=f[2][n-i+2]+(s[n-i+1]==ltemp)*c[n-i+1];
		f[3][n-i+1]=f[3][n-i+2]+(s[n-i+1]!=ltemp)*c[n-i+1];
	}
	int ans=LLONG_MAX;
	for(int i=2;i<=n;i++){
		ans=min(ans,f[0][i-1]+f[3][i]);
		ans=min(ans,f[1][i-1]+f[2][i]);
	}
	cout<<ans;
	return 0;
}

E - Paint

首先我们对原数组进行一个去重,也就是\(t\)和\(a\)都相同的操作,以最后面的为准。这样每行每列都最多有\(1\)次操作。

倒序遍历,记录下填充了多少行,多少列,每次累加需要减去,比如当前填充某一行,此后填充了\(cntv\)列,那么这个颜色实际上只填了\(w-cntv\)个格子,列同理。

用\(vis\)数组+倒序遍历可以省掉去重这一步骤。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int h,w,m;
int t[200010],a[200010],x[200010];
bool vx[200010],vy[200010];
int ans[200010];
//0=op1 1=op2
signed main(){
	cin>>h>>w>>m;
	for(int i=1;i<=m;i++) cin>>t[i]>>a[i]>>x[i];
	int cnth=0,cntv=0;//多少行和多少列涂了颜色
	for(int i=m;i>=1;i--){
		if(t[i]==1&&!vx[a[i]]){//涂的行
			vx[a[i]]=1;
			ans[x[i]]+=w-cntv;
			cnth++;
		}
		if(t[i]==2&&!vy[a[i]]){//涂的列
			vy[a[i]]=1;
			ans[x[i]]+=h-cnth;
			cntv++;
		}
	}
	int cntans=0;
	ans[0]=h*w;
	for(int i=1;i<=200000;i++) ans[0]-=ans[i];
	for(int i=0;i<=200000;i++) cntans+=bool(ans[i]);
	cout<<cntans<<endl;
	for(int i=0;i<=200000;i++){
		if(ans[i]){
			cout<<i<<" "<<ans[i]<<endl;
		}
	}
	return 0;
}

标签:int,题解,0101,long,200010,cntv,补题,ABC346,1010
From: https://www.cnblogs.com/Sinktank/p/18116214

相关文章

  • P9902 『PG2』模拟最大流 题解
    首先最大流等于最小割,然后就能很容易地想到一个状压dp做法:记\(f_{i,s}\)表示使得前\(i\)个点中,最后\(k\)个点与点\(1\)的联通情况为\(s\)的最小代价。然后考虑下一个点是否联通直接转移即可,然后就做完了。时间复杂度\(\mathcalO(n2^k)\)。参考代码:#include<bits/s......
  • P9058 [Ynoi2004] rpmtdq 题解
    Description给定一棵有边权的无根树,需要回答一些询问。定义\(\texttt{dist(i,j)}\)代表树上点\(i\)和点\(j\)之间的距离。对于每一组询问,会给出\(l,r\),你需要输出\(\min(\texttt{dist(i,j)})\)其中\(l\leqi<j\leqr\)。\(n\leq2\times10^5\),\(q\leq10^6\),\(1\l......
  • 二叉树计算【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-二叉树计算给出一个二叉树如下图所示:6/79\/-26请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。20(7-2+9+6)/\-26\/......
  • 学生重新排队【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-学生重新排队n个学生排成一排,学生编号分别是1到n,n为3的整倍数。老师随机抽签决定将所有学生分成m个3人的小组,n=3*m为了便于同组学生交流,老师决定将小组成员安排到一起,也就是同组成员彼此相连,同组任意两个成员输入描述:之间无其它组的成员。因此老师决定调整队伍,......
  • cfGlobalRound24--BC补题
    B-Doremy'sPerfectMathClass思路:假设答案集合,在普遍的答案集合中找到特别之处.!!假设!!a1,a2,a3,a4就是某个集合S的答案。a2-a1=a1,即a2=2*a1.必然的..因为a2-a1<a2,结果又存在于S中,结果只能是a1.a3-a2=a1ora2?假如a3-a2=a2,则a3=2*a2=4*a1.那么a3-a1=3*a1..又3*a1>a2......
  • 题解 CF1942F【Farmer John's Favorite Function】
    萌萌F题,上大分。首先,如下定义\(g(i)\):\(g(1)=\lfloor\sqrt{a_1}\rfloor\);对于所有\(i>1\),\(g(i)=\lfloor\sqrt{g(i-1)+a_i}\rfloor\)。也就是将\(f(i)\)的每一步运算后都向下取整。注意到\(\lfloorf(i)\rfloor=g(i)\)恒成立,于是我们只需要转而求每次修改后\(g(n......
  • P9870 [NOIP2023] 双序列拓展 题解
    题意:称某个序列\(B=\{b_1,b_2,\cdots,b_n\}\)是另一个序列\(A=\{a_1,a_2,\cdots,a_m\}\)的拓展当且仅当存在正整数序列\(L=\{l_1,l_2,\cdots,l_m\}\),将\(a_i\)替换为\(l_i\)个\(a_i\)后得到序列\(B\)。例如,\(\{1,3,3,3,2,2,2\}\)是\(\{1,3,3,2\}\)的拓展,......
  • CF1530G 题解
    考虑对操作进行转换。假设\(a_i\)为第\(i\)个\(1\)前面的\(0\)的个数。则操作可以进行如下转换:转换1:选择一个长度为\(k+1\)的子区间\(a_{l~l+k}\)。我们先把\(a_{l+1~l+k-1}\)翻转,然后更改\(a_l\)和\(a_{l+k}\)使得\(a_l+a_{l+k}\)不......
  • 【蓝桥杯选拔赛真题56】C++求位数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编
    目录C++求位数一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、推荐资料C++求位数第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题一、题目要求1、编程实现给定一个正整数N(1<N<10^8),输出N为几位数2、......
  • 2024-4-4 分块补题
    P3203[HNOI2010]弹飞绵羊记录每个位置跳出当前块所需要的步数和跳出的位置。从后往前统计#include<bits/stdc++.h>#definemaxn200100usingnamespacestd;intn,m,len;intpos[maxn],k[maxn];intnxt[maxn],stp[maxn];structfk{intl,r;}a[maxn];intread(){......