AtCoder Beginner Contest 310 - A B C E

题目传送门:abc 310
比赛摘记:
B题没读懂题意。。。如此简单题卡了好久
image
继续加油哈

A

简单,就是判断使用优惠券 Q 加一个价格最小的菜 D 便宜还是原价便宜,输入比较,在输出即可

B

打的时候题意没读懂。。。读懂了的时候时间已经过去一大半了qwq
就是给你一大堆产品,每个产品都有各自的价值 P 与功能 C 。问你是否存在两个产品[i,j],使得以下三个条件同时成立

  • \(P_i\ge P_j\)
  • 产品 j 拥有产品 i 的所有功能
  • 要么\(P_i>P_j\),要么产品 j 拥有产品 i 没有的功能

打时死于第三条,or没整明白
因为数据规模较小,暴力匹配即可

C

题意:
一个字符串与其翻转字符串同属一类,问你给定的许多字符串能分为多少类
思路:
利用set或者map标记某一类字符串是否出现过,每次没出现过的时候++ans,最终ans即为答案
过程较为简单,模拟统计,使用STL即可

E - NAND repeatedly

题意:

\[求解式子:\sum_{i=1}^{N}\sum_{j=i}^{N}f(i,j) \]

\[f(i,j)= \begin{cases} A_i & \text {(i = j)} \\ f(i,j-1) ⊼ A_j & \text{(i < j)} \end{cases} \]

⊼ 表示逻辑运算与非,\(0⊼0=1,0⊼1=1,1⊼0=1,1⊼1=0\)
思路:
注意到\(1≤N≤10^6\)\(O(n^2)\)的方法估计不行,所以我们需要考虑题目的规律性。
首先我们知道与非有0出1,所以当\(A_j=0\)时,\(f(i,j)=1\)
\(A_j=1\)时,我们就需要考虑前面的\(f(i,j-1)\)的值,而此时结果即为\(\overline{f(i,j-1)}(取非)\)
所以一遍前往后的递推式即可求解,我们统计到每个位置的0和1的数量,为了下一位做准备。那么统计的是什么0和1呢?就是\(f(i,j)\)在每个i时0和1的数量。
以样例00110为例,我们可以画出下面的表:

i 1 2 3 4 5
\(A_i\) 0 0 1 1 0
i=1 0 1 0 1 1
i=2 x 0 1 0 1
i=3 x x 1 0 1
i=4 x x x 1 1
i=5 x x x x 0
0:1,1:0 0:1,1:1 0:1,1:2 0:2,1:2 0:1,1:4

ans即为所有的1的个数和
我们用p[0]和p[1]来记录从前到后遍历i时0和1的个数。

  • \(A_i=0\)时,$p[0]=1,p[1]=i-1 $
  • \(A_i=1\)时,我们就需要考虑前面的\(f(i,j-1)\)的值,而此时\(p[0]=pp[1],p[1]=pp[0]+1\),pp代表原来的值

感觉没有说清楚,看的时候结合上面那张表再理解理解?
好像可以再精简一点的,上面写的好理解,在理解的基础上会发现,出答案的方式有很多其实,比如说没必要统计每一个位置上1的个数,只需要统计0的个数就够了,因为1的个数无论在哪种情况都可以计算出来。
下为代码:

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define debug(x) cout << #x << " = " << x << endl
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << endl
//#define int long long

using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ull,ull> pull;
typedef pair<double,double> pdd;
/*

*/
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
int n;
string ss;

void solve(){
	cin>>n>>ss;
	ll ans=0;
	int p[2]={0,0};
	for(int i=0;i<n;++i){
		int c=ss[i]-'0';
		ans+=c;
		if(i){
			if(c==0){
				ans+=i;
				p[0]=1;
				p[1]=i;
			}else{
				ans+=p[0];
				swap(p[0],p[1]);
				++p[c];
			}
		}else ++p[c];
	}
	cout<<ans<<'\n';
	return ;
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}
posted on 2023-07-15 22:16  Qiansui  阅读(219)  评论(0编辑  收藏  举报