首页 > 其他分享 >Atcoder Beginner Contest 330 题解

Atcoder Beginner Contest 330 题解

时间:2024-11-30 10:22:21浏览次数:5  
标签:Atcoder le 10 int 题解 330 long cin freopen

前言

过于水的一场。

A Counting Passes

题面

给出一个长度为 \(n\) 的序列 \(a\),求出 \(a\) 之中大于等于 \(l\) 的数个个数。

\(1\le n\le 100,1\le a_i\le 1000,1\le l\le 1000\)。

制約

  • 入力は全て整数
  • $ 1\ \le\ N\ \le\ 100 $
  • $ 1\ \le\ L\ \le\ 1000 $
  • $ 0\ \le\ A_i\ \le\ 1000 $

思路

简单暴力。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,l,cnt;
int a[1001];
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>l;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]>=l) cnt++;
	}
	cout<<cnt<<"\n";
	return 0;
}

B Minimize Abs 1

题面

有一个长为 \(N\) 的数列 \(A\) 和两个整数 \(L,R\)。对于每个 \(A_{i}\),你需要选出一个数 \(X_{i}\),满足如下条件:

  • \(L\le X_{i}\le R\)
  • 对于所有整数 \(L\le Y\le R\),\(|X_{i}-A_{i}|\le|Y-A_i|\)

制約

  • $ 1\leq\ N\leq\ 2\times\ 10^5 $
  • $ 1\leq\ L\leq\ R\ \leq\ 10^9 $
  • $ 1\leq\ A_i\leq\ 10^9 $
  • 入力は全て整数

思路

只需要根据范围求出 \(|Y-A_i|\) 的最小值,找一个 \(X_{i}\) 使得 \(|X_{i}-A_{i}|= min{|Y-A_i|}\) 即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200005],l,r;
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(l<=a[i]&&a[i]<=r) cout<<a[i]<<" ";
		else if(a[i]<l)
		{
			cout<<l<<" ";
		}
		else{
			cout<<r<<" ";
		}
	}
	return 0;
}

C Minimize Abs 2

题面

给你一个整数 \(D\) ,找到对于非负整数 \(x,y\) 的 \(|x^2+y^2-D|\) 的最小值

制約

  • $ 1\leq\ D\ \leq\ 2\times\ 10^{12} $
  • 入力は全て整数

思路

只需枚举 \(x\),\(y\) 取 \([\sqrt{D-x^2},\sqrt{D-x^2}+1]\),再计算最小值即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int d;
int minn=2e9;
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>d;
	for(int i=1;i<=1e6;i++)
	{
		int x=i;
		int y=sqrt(abs(x*x-d));
		int y2=y+1;
		minn=min(minn,abs(x*x+y*y-d));
		minn=min(minn,abs(x*x+y2*y2-d));
	}
	cout<<minn<<"\n";
	return 0;
}

D Counting Ls

题面

现有一个 \(N\) 行 \(N\) 列的字符数组,满足对于每个 \(1 \le i \le N,1 \le j \le N\) 都有 $ S_{i,j} \in {o,x} $

请问在该数组里有多少个满足以下条件的三方格组:

  • 三个格子内都是 \(o\)

  • 三个方格互不相同

  • 恰好有两个方格在同一行

  • 恰好有两个方格在同一列

思路

先预处理每一行 o 的数量 \(h_{i}\) 和每一列 o 的数量 \(l_{i}\)。

对于每一个位置,如果它是 o,那它的贡献就是 \((h_{i}-1)\times(l_{i}-1)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
char a[2001][2001];
int h[2001],l[2001];
int hz,lz;
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='o') h[i]++;
		}
		hz+=h[i];
	}
	for(int j=1;j<=n;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(a[i][j]=='o') l[j]++;
		}
		lz+=l[j];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]=='o') ans+=(h[i]-1)*(l[j]-1);
		}
	}
	cout<<ans<<"\n";
	return 0;
}

E Mex and Update

题面

给定一个序列,支持单点修改,每次修改后输出全局 \(\operatorname{mex}\)。

一个序列的 \(\operatorname{mex}\) 定义为,序列中最小的没有出现过的非负整数。

制約

  • 入力は全て整数
  • $ 1\ \le\ N,Q\ \le\ 2\ \times\ 10^5 $
  • $ 0\ \le\ A_i\ \le\ 10^9 $
  • $ 1\ \le\ i_k\ \le\ N $
  • $ 0\ \le\ x_k\ \le\ 10^9 $

思路

首先易证明一个长度为 \(n\) 的序列的 \(\operatorname{mex}\) 最大为 \(n\)。

那我们可以用一个 set 存没出现过的数,一个 map 记录每个数字在序列里出现的次数。

对于每次修改,我们将 \(mp_{a_{x}}\) 减 \(1\),将 \(mp_{y}\) 加 \(1\)。

如果 \(mp_{a_{x}}\) 减到 \(0\),把这个数字加到 set。

如果 \(mp_{y}\) 为 \(1\),则从 set 里删除这个数。

最后输出 set 的第一个数字就行了。

// LUOGU_RID: 191957479
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
int a[200005];
set<int> s;
map<int,int> mp;
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=0;i<=n+1;i++) s.insert(i);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]>n) a[i]=n+1;
		if(s.count(a[i]))s.erase(a[i]);
		mp[a[i]]++;
	}
	while(q--)
	{
		int x,y;
		cin>>x>>y;
		if(y>n) y=n+1;
		mp[a[x]]--;
		mp[y]++;
		if(mp[y]==1) s.erase(y);
		if(mp[a[x]]==0) s.insert(a[x]);
		cout<<*s.begin()<<"\n";
		a[x]=y;
		
	}
	return 0;
}

F Minimize Bounding Square

题面

给定平面内 \(n\) 个点,你可以把这 \(n\) 个点一共在坐标上移动 \(k\) 次。移动可以是横着或者竖着走 \(1\) 单位长度。移动结束后会有一个最小的正方形把所有点都框起来。最小化这个正方形的边长。

制約

  • 入力は全て整数
  • $ 1\ \le\ N\ \le\ 2\ \times\ 10^5 $
  • $ 0\ \le\ K\ \le\ 4\ \times\ 10^{14} $
  • $ 0\ \le\ X_i,Y_i\ \le\ 10^9 $

思路

二分答案,对于一个边长 \(x\),只要使得每一对的 \(x_i\) 和 \(y_i\) 经过 \(k\) 次操作后绝对值在 \(x\) 以内即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int x[200005],y[200005];
bool check(int len){
	int cnt=0;
	for(int i=1;i<=(n>>1);i++)cnt+=max(0LL,x[n-i+1]-x[i]-len)+max(0LL,y[n-i+1]-y[i]-len);
	return cnt<=k;
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i];
	}
	sort(x+1,x+n+1);
	sort(y+1,y+n+1);
	int l=0,r=1e16,ans=0;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(check(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	cout<<ans<<"\n";
	return 0;
}

标签:Atcoder,le,10,int,题解,330,long,cin,freopen
From: https://www.cnblogs.com/yaaaaaan/p/18578127

相关文章

  • 读数据质量管理:数据可靠性与数据质量问题解决之道19数据未来
    1. 开创可靠数据系统的未来1.1. 数据作为一个行业很可能正在经历一场巨大且不可逆转的巨变1.2. 分析型数据正变成现代企业最关键和最具竞争力的核心资产1.2.1. 不再是公司是否依赖数据的问题1.2.2. 是使用多少数据以及将数据用于什么场景的问题1.3. 仅仅收集更......
  • 题解:AT_abc018_4 [ABC018D] バレンタインデー
    暴力搜索当我们发现u很小时,就可以直接暴搜。但我们该怎么搜索呢?因为是教师送给学生礼物,所以我们先搜索老师,记录下来当前这个老师选还是不选。当我们选完了p个老师,学生部分就可以直接算分数。先枚举每一个老师,如果当前老师选上了,就去枚举学生,在当前这个学生的贡献中加上幸......
  • 正规数的判定->题解
    结论根据题目中正规数的定义,可以得出结论:设一个正规数为\(n\),则\(n\)有且只有一种质因数分解的结果:\(n=2^p\times3^m\times5^n\)其中\(p,m,n\)均为自然数所以,我们就可以通过质因数分解的方法来判断\(n\)是否是正规数代码#include<iostream>#include<cstdio>usingname......
  • 逆波兰式->题解
    前文看到这种表达式的题目,第一时间就想到了栈,尤其是这种关于后缀表达式的题目.理论用栈来模拟后缀表达式是非常便捷的.对于后缀表达式,当遇到数字时,将数字压入栈中,如果是运算符号,就将栈顶的两个元素弹出,根据符号进行运算,再把值放回栈中.代码\(tips1:\)由于题目中的空格在......
  • CF2037G - Natlan Exploring 题解
    又来到我们最喜欢的数论环节了。题面纳特兰地区由\(n\)座城市组成,每座城市的吸引力值为\(a_i\)。从城市\(i\)到城市\(j\)之间存在一条有向边,当且仅当\(i<j\)和\(\gcd(a_i,a_j)\neq1\),其中\(\gcd(x,y)\)表示整数\(x\)和\(y\)的最大公约数(GCD)。从城市......
  • P11337 「COI 2019」IZLET 题解
    先考虑构建树的形态,显然可以将所有边按边权从小到大排序,构造最小生成树。注意到相邻的两个点之间的颜色数只可能是\(1\)或\(2\),所以只考虑边权\(\le2\)的就好了。接下来考虑怎么染色。考虑从一个点开始dfs,每次确定当前遍历到的点的颜色,考察当前点到父亲的边权:等于\(1\)......
  • [ABC355F] MST Query 题解
    原题链接link题目大意给你一棵\(n\)个点的带边权的树,有\(q\)次询问,每次询问加一条带边权的边,输出当前的最小生成树的边权和。思路这道题我们观察题目范围,可知权值的范围很小。所以我们考虑枚举权值,计录这种权值的边对答案的变化\(dp_i\)。对于一条边,我们用并查集记录这......
  • 装配线调度题解
    装配线调度题解初始化:F[1][1]=e1+a1,1F[2][1]=e2+a2,1对于第i个装配站(3<=i<=n),我们可以考虑两种情况:在第1条装配线上完成第i个装配站的最短总时间:F[1][i]=min(F[1][i-1]+a1,i,F[2][i-1]+a1,i+t2,i-1)在第2条装配线上完成第i个装配站的最短总时间:F[2][......
  • [CSP-S 2024] 染色 题解
    题目链接[CSP-S2024]染色题解这是一道线性\(dp\)问题,难点在于在具体的题目背景中抽象出实际问题,最难的地方是分类讨论。根据题目的意思,如果第\(i\)位数字(\(a_{i}\))的颜色和第\(i\)位之前的数字(\(a_{[1,i]}\))的颜色都不同,则这个数字贡献为\(0\),接着,如果前面有相同的颜......
  • CF1479E School Clubs 题解
    感觉这种题都比较套路。思路我们考虑定义势能函数\(\Phi(x)\),满足:对于一个随机过程,\(E(\Phi(A_{x+1})-\Phi(A_{x})|A_x,\cdots,A_0)=-1\)。\(\Phi(A_t)\)为定值,并且\(\Phi(A_t)=\Phi(A_i)\)当且仅当\(i=t\)。此时,\(\Phi(x)+x\)为离散时间鞅。根据停时定理,\(E(\Phi(A......