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;
}