首页 > 其他分享 >AtCoder Beginner Contest 278 ABCDE

AtCoder Beginner Contest 278 ABCDE

时间:2023-06-12 19:58:07浏览次数:50  
标签:AtCoder 题意 int ABCDE cin base mp 278 op

AtCoder Beginner Contest 278

A - Shift

Problem Statement

题意:给你一个长度为n的序列,让你移走前面k个后面补k个0。

Solution

思路:按照题意模拟即可。

#include<bits/stdc++.h>
using namespace std;
int a[1100];
int main()
{
	int n,k;
	cin>>n>>k;
	k = min(k,n);
	for(int i = 1;i<=n;i++)
		cin>>a[i];
	for(int i = k+1;i<=n;i++)
		cout<<a[i]<<" ";
	for(int i = n+1;i<=(n+k);i++)
		cout<<0<<" ";
	cout<<endl;
	return 0;
}

B - Misjudge the Time

Problem Statement

题意:给你一个时间用\(H:M\)的形式,对小时很分钟拆分开看呢就是\(AB:\mathrm{CD}\)这里是24小时计时法。

我们需要做的是找出给定时间的下一个可能产生歧义的时间(包含当下时间)

image

比如对于图3,可能是\(21:\mathrm{03}\)\(或者\)\(20:\mathrm{13}\)都是合法时间,这样的就是有歧义的时间

Solution

思路:对于给定时刻往后枚举,去判断\(AB:\mathrm{CD}\)和\(AC:\mathrm{BD}\)是不是同时合法,是的话就是答案。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int h,m;
	cin>>h>>m;
	
	while(1)
	{
		int a = h/10,b = h%10;
		int c = m/10,d = m%10;
		//cout<<a*10+c<<" "<<b*10+d<<endl;
		if((a*10+c<=23&&b*10+d<=59))
		{
			cout<<h<<" "<<m<<endl;
			break;
		}
		m++;
		if(m==60)
		{
			m = 0,h++;
			if(h==24)
				h = 0;
		}
	}	
	return 0;
}

C - FF

Problem Statement

题意:q个询问,每个询问给出T,A,B,

当T=1时,让A跟随B

当T=2时,让B跟随A

当T=3时,询问是否A与B相互跟随

Solution

思路:用map记录跟随关系,解决

#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int>mp;
int main()
{
	int n,q;
	cin>>n>>q;
	while(q--)
	{
		int op,a,b;
		cin>>op>>a>>b;
		if(op==1)
			mp[{a,b}] = 1;
		else if(op==2)
			mp[{a,b}] = 0;
		else
			if(mp[{a,b}]&&mp[{b,a}])cout<<"Yes\n";
			else cout<<"No\n";

	}
	return 0;
}

D - All Assign Point Add

Problem Statement

题意:给你一个长度为\(n\)的序列

给你\(q\)个询问,有三种类型:

  1. 给你\(x\),让你把x赋值给所有(就是让所有元素变成\(x\))
  2. 给你\(i\)和\(x\),把第\(i\)个元素假设\(x\)
  3. 给你\(i\),输出第\(i\)个元素的值

Solution

思路:首先直接模拟肯定不行的,我们思考一下本质是什么?

我们先用\(a[]\)记录初始序列,同时用\(map\)复制一遍,我们用\(base\)记录当前的基准值,一开始记为\(0\),之后如果有\(1\)操作\(base\)就变成相应的\(x\),同时\(map.clear\),因为之前的操作相当于清空了。总的来说就是除了一开始的操作是对于原\(a\)序列操作,当然也是在\(map\)进行,这也是为什么我们复制一次到\(map\),之后只要出现\(1\)操作,其实之前的所有操作就没有用了,我们只需要记录\(base\)值就行,\(2\)操作正常进行,输出当前的值就是\(mp[i]+base\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int a[N];
map<int,int>mp;
signed main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	for(int i = 1;i<=n;i++)
		cin>>a[i],mp[i] = a[i];
	int q,base = 0;
	cin>>q;
	while(q--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x;
			cin>>x;
			base = x;
			mp.clear();
		}
		else if(op==2)
		{
			int i,x;
			cin>>i>>x;
			mp[i]+=x;
		}
		else 
		{
			int i;
			cin>>i;
			cout<<base+mp[i]<<'\n';
		}
	}
	return 0;
}

E - Grid Filling

Problem Statement

题意:给你一个\(n\)行\(m\)列矩阵,里面有数字,给你一个\(N\),表示里面数字是从\(1\)到\(N\)的。

在给你\(h\)和\(w\)表示你需要把该\(n\)行\(m\)列的大矩阵中的\(h\)行\(w\)列涂黑(相当于暂时不存在),看看操作之后剩余是数字种类。

操作方式如下:

img

Solution

思路:首先直接暴力肯定是不行的,看见对二维区间操作,我想到了二维前缀和,那是不是可以用前缀和的思想去预处理出一个在二维区间的每个数的个数。

在一开始读入时候统计每个数的个数,之后用二维前缀和思想预处理出每个数的出现情况,之后就是询问部分,每次询问,for一遍1到N,如果\(cnt[i]-sum[i]==0\),那种类数\(-1\)即可,最后输出答案即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int a[N][N];
int s[N][N][N];
map<int,int>mp;
int main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

	int n,m,N,h,w;
	cin>>n>>m>>N>>h>>w;
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=m;j++)
			cin>>a[i][j],mp[a[i][j]]++;

	for(int x = 1;x<=N;x++)
	{
		for(int i = 1;i<=n;i++)
		{
			for(int j = 1;j<=m;j++)
			{
				s[x][i][j] = s[x][i-1][j]+s[x][i][j-1]-s[x][i-1][j-1];
				if(a[i][j]==x)s[x][i][j]++;
			}
		}
	}
	// for(int x = 1;x<=N;x++)
	// {
	// 	for(int i = 1;i<=n;i++)
	// 	{
	// 		for(int j = 1;j<=m;j++)
	// 		{
	// 			cout<<"x = "<<x<<" i = "<<i<<" j = "<<j<<" ";
	// 			cout<<"s[x][i][j] = "<<s[x][i][j]<<" "<<endl;
	// 		}
	// 	}
	// }

	for(int i = 1;i<=n-h+1;i++)
	{
		for(int j = 1;j<=m-w+1;j++)
		{
			int t = N;
			cnt.clear();
			int x1 = i,y1 = j,x2 = i+h-1,y2 = j+w-1;
			//cout<<"x1 = "<<x1<<" y1 = "<<y1<<" x2 = "<<x2<<" y2 = "<<y2<<endl;
			for(int k = 1;k<=N;k++)
			{
				int sum = s[k][x2][y2]-s[k][x1-1][y2]-s[k][x2][y1-1]+s[k][x1-1][y1-1];
				//cout<<"k = "<<k<<" mp[k] = "<<mp[k]<<" sum = "<<sum<<endl;
				if(mp[k]-sum==0)t--;
			}
			cout<<t<<" ";
		}
		cout<<"\n";
	}
	return 0;
}

标签:AtCoder,题意,int,ABCDE,cin,base,mp,278,op
From: https://www.cnblogs.com/nannandbk/p/17475968.html

相关文章

  • UNIQUE VISION Programming Contest 2023 New Year (AtCoder Beginner Contest 287) A
    UNIQUEVISIONProgrammingContest2023NewYear(AtCoderBeginnerContest287)A-MajorityProblemStatement题意:给你n个字符串,字符串是For表示agree,字符串Against表示disagree,让你判断最终是否通过。Solution思路:统计For和Against的数量,比较一下即可。#include......
  • AtCoder Beginner Contest 284 ABCDE
    AtCoderBeginnerContest284A-SequenceofStringsProblemStatement题意:给你n个字符串,让你倒序输出Solve#include<bits/stdc++.h>usingnamespacestd;constintN=20;strings[N];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) cin>>s......
  • Atcoder-AGC033C
    看到这道题,是个博弈论,没见过树上的,于是想到在数列里的博弈论,又联想到树的特殊形式————链。于是我们来讨论一下链的情况(对于没有硬币的点,我们就视为它被删掉了):讨论链的情况发现若是选择两端的点,顶点数会减一;若是选择中间的点,顶点数会减二。现在我们站在链的角度来思考......
  • AtCoder Beginner Contest 302
    A-Attack题目大意给定两个数a和b,问我们需要进行多少次a-b,才能让a小于等于0解题思路签到题不多嗦了神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10;signedmain(){inta,b,c;cin>>a>>b;if(a%b......
  • AtCoder Beginner Contest 305 题解
    https://atcoder.jp/contests/abc305/tasks_printE-ArtGalleryonGraph冷知识:md这题赛时没做出来/cy刚看到题:这是什么题啊,\(K,h\)都\(1e5\)能做吗/fn确实能做。考虑类似SPFA的操作。设\(a_x\)表示\(x\)还可以对距离最多为\(a_x\)的点产生贡献,然后就直接......
  • AtCoder Beginner Contest 258 F Main Street
    洛谷传送门AtCoder传送门发现这题有个远古的WA就来改了(发现走法很多种,不想分类讨论,考虑最短路。设起点编号为\(1\),终点为\(11\)。\(x=Bn\)和\(y=Bn\)把坐标系分成了若干块。考虑过起点作一条平行于\(Ox\)的直线,与左右两条\(x=Bn\)的线有两个交点,给它们编号......
  • AtCoder Beginner Contest 305
    A-WaterStation(abc305a)题目大意给定一个数字\(x\),输出一个数字,它是最接近\(x\)的\(5\)的倍数。解题思路令\(y=x\%5\),如果\(y\leq2\),那答案就是\(x-y\),否则就是\(x+5-y\)。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=long......
  • ATCoder [ABC167D] Teleporter
    #题目解析这段代码的目标是处理一个含有$n$个元素的整数序列,根据一定的规则,重复操作$k$次后,确定操作结束时位于序列哪个位置。##解题思路1.**读取输入**:首先,我们读取输入的整数$n$和$k$,以及整数序列`a`。我们需要对序列的每个元素减一,以适应从0开始的索引。cin......
  • AtCoder Beginner Contest 290 Ex Bow Meow Optimization
    洛谷传送门AtCoder传送门考虑观察答案形态。当\(n,m\)均为偶数时,前一半位置有\(\frac{n}{2}\)个是狗,\(\frac{m}{2}\)个是猫。并且前半段从前往后和后半段从后往前都是按权值从小到大放。调整法证明即可。当\(n\)或\(m\)为奇数时,把\(a_i\)或\(b_i\)最大的放中间......
  • Atcoder ARC100D Equal Cut
    发现是\(3\)个断点且数据范围的\(n\le2\times10^5\),根据2022CSP-SA留下的心理阴影不难想到可以枚举中间的那个点的同时移动左右两个端点。考虑如何移动,已知现在在枚举中间的断点\(i\),则现在被分为了两部分\(1\simi\)和\(i\simn\),因为要使极差最小,那就先可以让每一......