首页 > 其他分享 >ABC330 A-E 题解

ABC330 A-E 题解

时间:2023-11-26 22:22:05浏览次数:41  
标签:ABC330 题解 mid long cin int text 2010

ABC330题解

AtCoder Beginner Contest 330

A - Counting Passes

思路:

枚举一遍,当前数大于\(L\)使\(ans+1\)即可.

代码:

#include<iostream>
#define int long long
using namespace std;
		
int n, l, ans;
int x;
		
signed main()
{
	cin >> n >> l;
	for(int i=1; i<=n; i++)
	{
		cin >> x;
		if(x >= l)
		{
			ans ++;
		}
	}
	cout << ans;
	return 0;
}

B - Minimize Abs 1

思路:

枚举一遍,当前数在\(L,R\)之间,结果就是它本身,小于\(L\)为\(L\),大于\(R\)为\(R\).

代码:

#include<iostream>
#define int long long
using namespace std;

int n, l, r;
int x;

signed main()
{
	cin >> n >> l >> r;
	for(int i=1; i<=n; i++)
	{
		cin >> x;
		if(x <= l)
		{
			cout << l << " ";
			continue;
		}
		if(x >= r)
		{
			cout << r << " ";
			continue;
		}
		cout << x << " ";
	}
	return 0;
}

C - Minimize Abs 2

思路:

枚举\(i:0\sim\sqrt{d}\)为第一个数,以\(1\)为左边界,\(\sqrt{d-i^2}+1\)为右边界,判定条件为\(mid^{2}\)与\(d-i^2\)之间的大小关系,每次更新边界后\(ans=\min{ans, |d-i^2-mid^2|}\)为条件二分查找第二个数.

其中\(d-i^2\)为当前的\(i\)下剩余\(d\)的大小,\(mid\)为当前的第二个数\((mid > i)\)

特判:当\(mid^2=d-i^2\)时直接输出\(0\).

代码:

#include<iostream>
#include<cmath>
#define int long long
using namespace std;

int abss(int x)
{
	return x > -x ? x : -x;
}

int d, ans = 1e18;
int t, l, r, mid;

signed main()
{
	cin >> d;
	for(int i=0; i*i<d; i++)
	{
		t = d - i*i;
		l = 1;
		r = sqrt(t) + 1;
		while(l <= r)
		{
			mid = (l + r) >> 1;
			if(mid * mid < t)
			{
				l = mid + 1;
			}
			else if(mid * mid > t)
			{
				r = mid - 1;
			}
			else
			{
				cout << 0;
				return 0;
			}
			ans = min(ans, abss(t - mid * mid));
		}
	}
	cout << ans;
	return 0;
}

D - Counting Ls

思路:

由于元组的无序性,仅顺序不同的元组会被视为同一个元组,所以我们只统计每个\(\text{o}\)能和后面的\(\text{o}\)组成合法元组的个数.

只统计第2、3点在第1点右方、下方的方案,忽略左方、上方的点

设:
\(row_i\)表示第\(i\)行\(\text{o}\)的个数
\(col_i\)表示第\(i\)列\(\text{o}\)的个数
\(b_{i,j}\)表示第\(i\)行中第\(j\)列后每个\(\text{o}\)所在列在第\(i\)行往下\(\text{o}\)的个数总和
\(c_{i,j}\)表示第\(i\)行中第\(j\)列后\(\text{o}\)的个数总和

则第\(i\)行第\(j\)列的\(\text{o}\)可组成的方案个数为:

  1. 当第二个点位于第\(j\)列上,第三个点位于第\(i\)行上时:
    第二个点的方案数\(\times\)第三个点的方案数

    (col[j] - 1) * c[i][j+1]

  2. 当第二个点位于\(i,j_2\),第三个点位于第\(j_2\)列上时:
    每个第二个点所对应的第三个点的方案数总和

    b[i][j+1]

将它们加起来,最后输出即可

代码:

#include<iostream>
#define int long long
using namespace std;

int n, ans;
bool a[2010][2010];
int row[2010], col[2010];
int b[2010][2010]; //第i行第j列每列的o后缀和
int c[2010][2010]; //第i行第j列的o后缀和

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	char ch;
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=n; j++)
		{
			cin >> ch;
			a[i][j] = (ch == 'o');
			row[i] += a[i][j];
		}
	}
	for(int j=1; j<=n; j++)
	{
		for(int i=1; i<=n; i++)
		{
			col[j] += a[i][j];
		}
	}
	for(int i=1; i<=n; i++)
	{
		for(int j=n; j>=1; j--)
		{
			b[i][j] = b[i][j+1];
			c[i][j] = c[i][j+1];
			if(a[i][j])
			{
				b[i][j] += col[j] - 1;
				c[i][j] += 1;
			}
		}
	}
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=n; j++)
		{
			if(a[i][j])
			{
				ans += (col[j] - 1) * c[i][j+1];
				ans += b[i][j+1];
			}
		}
	}
	cout << ans;
	return 0;
}

E - Mex and Update

思路:

\(\large STL大法好\)

因为\(A\)数组最多有\(2\times10^5\)个数,所以输出的答案必定小于\(2\times10^5\)

所以\(Mex\)可以转化为:一个存储了\(1\sim2\times10^5\)所有数的数组,去掉\(A\)数组中的数,剩下数中的最小值

有序数组,无需插入,删除,\(\Theta(n\log{n})\),可以使用\(map\),先在\(map\)里存储\(1\sim2\times10^5\)所有数,再设\(cnt_i\)表示\(map\)去掉\(A\)之后剩下的每个数的数量(同样只需要存储\(1\sim2\times10^5\))

在输入时

  • cnt[y]--;,如果cnt[y] < 0,那么s.erase(y);
  • cnt[a[x]]++;,如果cnt[a[x]] >= 0,那么s.insert(a[x]);
  • a[x]=y;

再输出*s.begin()即可

代码:

#include<iostream>
#include<set>
#define int long long
using namespace std;

const int N = 200010;

int n, m;
int cnt[N], a[N];
set<int> s;

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i=0; i<=n; i++)
	{
		s.insert(i);
	}
	for(int i=1; i<=n; i++)
	{
		cin >> a[i];
		if(a[i] > N-10)
		{
			continue;
		}
		cnt[a[i]]--;
		s.erase(a[i]);
	}
	while (m--)
	{
		int x, y;
		cin >> x >> y;
		if(y <= 2e5)
		{
			cnt[y]--;
			if(cnt[y] < 0)
			{
				s.erase(y);
			}
		}
		if(a[x] <= 2e5)
		{
			cnt[a[x]]++;
			if(cnt[a[x]] >= 0) 
			{
				s.insert(a[x]);
			}
		}
		a[x] = y;
		cout << *s.begin() << '\n';
	}
	return 0;
}

标签:ABC330,题解,mid,long,cin,int,text,2010
From: https://www.cnblogs.com/gctiruct/p/17858097.html

相关文章

  • Information Graph 题解
    题目链接InformationGraph分析在线并不好做,考虑离线,先将树建出来\(2\)操作时\(x\)节点与当前根节点之间的点都会获得文件当前根节点可以用并查集维护对于查询的节点判断它是否为链上的点即可具体的,若该节点为\(rt\)子树中的点且该节点的子树包含\(x\)节点,它就......
  • P8706 [蓝桥杯 2020 省 AB1] 解码 ( 入门 ) 题解
    题目传送门思路:有一个原串\(t\)。将原串\(t\)转换成简写字符串\(s\)的规则如下:如果有连续的\(2\sim9\)个相同字母,那么可以将它改为字母+数字的格式。如果是单独的字符,也就是与左右两边的字母都不相同,在简写字符串中一模一样。所以,现在告诉我们简写字符串,要我们求出......
  • ICPC2022Xian G Perfect Word 题解
    LinkICPC2022XianGPerfectWordQuestion给出\(n\)个串,我们称\(t\)串是"good"当且仅当\(t\)的所有子串都在\(n\)个串中出现过问最长的"good"的串的长度Solution由于所有串的子串个数为\(L\times(L+1)/2\),\(L\)为串的长度所以”good“串的长度不会大......
  • ICPC2022Xian E Find Maximum 题解
    LinkICPC2022XianEFindMaximumQuestion定义\(f(x)\)求Solution通过打表我们可以发现\(f(x)\)表示三进制表达中有效位数与数码和之和接下来考虑如何获得最大的\(f(x)\)贪心的去考虑,假设答案为\(Ans\),\((Ans)_3\)肯定是前几位和\((R)_3\)的前几位一样,然后某一......
  • Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决
    Linux_sqlcmd或者是Cloudquery连接SQLSERVER2012的问题解决背景最近想使用shell脚本给SQLServer数据库插入数据,但是发现了报错同时进行CLoudquery连接SQLServer数据库时也出现了异常.作为笔记记录一下问题和解决方法sqlcmd的问题现象sqlcmd的提示信息第一:安装sudo......
  • warning: Signature not supported. Hash algorithm SHA1 not available 问题解决
    在使用RockyLinux安装服务的时候碰到此问题,记录下解决方法update-crypto-policies--setLEGACY参考资料https://www.redhat.com/en/blog/rhel-security-sha-1-package-signatures-distrusted-rhel-9......
  • 【luogu题解】T378828 位运算
    位运算题目背景题目由daiyulong20120222创作(me)并由QBW1117完善以及数据。题目描述给定两个数\(x,y\),在给定一个位运算符号\(c\)。请你列出\(x,y\)进行\(c\)位运算是的算数竖式式。注:竖式这么列:显示出两个数的完整二进制,包括前导零。32个'-'。显示出......
  • T402161 run 题解
    LinkT402161runQuestion亮亮总共要跑\(n\)圈,可以分成多次,但是每次跑的圈数必须要比上一次跑的多,求跑完\(n\)圈的方案数Solution显然动态规划定义\(F[i][j]\)表示一共跑了\(i\)圈,最后一次跑了\(j\)圈的方案数,转移方程就为\[F[i][j]=\sum\limits_{k=1}^{j-1}F[i......
  • P1091 合唱队形题解(普及/提高−) 题解
    题目传送门这道题是一个很经典的动态规划。因为合唱队形的身高是从低——高——低来排的,所以就可以利用分治的思想将队形分成两个部分:低——高是最长上升子序列;高——低是最长下降子序列。这道题其实可以用二分查找来优化,可是这题n≤100,没有必要优化,需优化题详见P1020导弹拦截......
  • ABC330
    D记录每一行,每一列有多少个o,然后统计答案即可。codeE想到\(mex^{i\len}_{i=1}a_i\len\)这整个题就可做了。所以我们把从\(0\)到\(n\)的所有数加进set里面,如果有这个数,那么直接把它从这个set中删掉,如果没有就把他加进set。所答案是这个set的第一个元素......