AtCoder Beginner Contest 213

https://atcoder.jp/contests/abc213/tasks/abc213_a

A - Bitwise Exclusive Or

水题。

题意:给你 a,b 两个数,让你找出 c 使得 a^c=b;

思路:c=a^b;

代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=2e5+5;
using namespace std;
inline int read()
{
	ll s=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
	return s*f;
}
void solve()
{
	int a,b;
	cin>>a>>b;
	cout<<(a^b);
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	solve(); 
	return 0;
}

https://atcoder.jp/contests/abc213/tasks/abc213_b

B - Booby Prize

题意:给你一个长度为n的数组a,其中ai是不一样的,让你找出第二大的ai的位置并且输出该位置的值。

思路:一个数组记录a数组,一个map用来记录a数组的位置,一个sort输出第二大的ai对应的位置

代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=2e5+5;
using namespace std;
inline int read()
{
	ll s=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
	return s*f;
}
map<ll,int>q;
ll f[maxn];
void solve()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>f[i],q[f[i]]=i;
	sort(f+1,f+1+n);
	cout<<q[f[n-1]];
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	solve(); 
	return 0;
}

https://atcoder.jp/contests/abc213/tasks/abc213_c

C - Reorder Cards

题意:给你一个n*m的矩阵,再给你k个坐标,如果矩阵对应的行没有坐标那么就删除该行,对应的列没有坐标就删除该列。处理完后这k个坐标也会发生变化,请你依次输出变化完后的k个坐标。

比如:                             处理前:              处理后:                   输出:

                         

 解释:先看行:第一第四行没有坐标,因此删去第一第四行。

            再看列:第一第三第四列没有坐标,因此删去第一第三第四列。      

 输出:第一个坐标x=3 y=2,x=3之前删了一行,x=3-1=2;

                                              y=2之前删了一列,y=2-1=1; 因此输出2 1。

           第二个坐标x=2 y=5,x=2之前删了一行,x=2-1=1;

                                              y=5之前删了三行,y=5-3=2;因此输出1 2。

思路O(n):对行或者列分开处理。

对行从小到大sort,因此第一个肯定是第一行,遇到与前一个相同的行数就跳过,不同的话行数+1;

对列从小到大sort,因此第一个肯定是第一列,遇到于前一个相同的列数就跳过,不同的话列数+1;

代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
map<ll,ll>c,d;
struct node
{
	ll x, y;
}f[maxn],a[maxn];
bool cmp1(node q,node w){return q.x<w.x;}
bool cmp2(node q,node w){return q.y<w.y;}
ll top,n,m,k;
void solve()
{
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		cin>>f[i].x>>f[i].y;
		a[i].x=f[i].x;
		a[i].y=f[i].y;
	}
	sort(a+1,a+1+k,cmp1);//对行处理 
	for(int i=1;i<=k;i++)
	{
		if(i==1)//如果i=1,先储存第一行。 
		{
			top=a[i].x;//标记第一行对应的a[i].x 
			c[a[i].x]=1;//用c来储存a[i].x对应第行行数 
		}
		else if(top!=a[i].x)//先判断a[i].x是否和top不一样 
		{
			c[a[i].x]=c[top]+1;//行数+1 
			top=a[i].x;//更新top 
		}
	}
	sort(a+1,a+1+k,cmp2);//对列处理 
	for(int i=1;i<=k;i++)
	{
		if(i==1)//如果i=1,先储存第一列 
		{
			top=a[i].y;//标记第一列对应的a[i].y 
			d[a[i].y]=1;//用d来储存a[i].y对应的行数 
		}
		else if(top!=a[i].y)//先判断a[i].y是否和top不一样 
		{
			d[a[i].y]=d[top]+1;//列数+1 
			top=a[i].y;//更新top 
		}
	}
	for(int i=1;i<=k;i++)
	{
		//直接输出f[i].x对应的行,f[i].y对应的列。 
		cout<<c[f[i].x]<<" "<<d[f[i].y]<<endl;
	}
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	solve(); 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值