Interview
codeforces 631
算法:二进制
注释:本题较为简单。
- 二进制或运算只增不减,所以将所有数字求或和,即可得到最大值
- 补充或运算和和运算的逆运算:a|b=c,a&b=d,已知b,c,d求a,a=b^a&d,异或运算的逆运算:a ^ b=c的c ^b=a;
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
int a[1005],b[1005];
int n;
int suma=0;
int sumb=0;
int main() //二进制或运算只增不减
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
cin>>b[i];
}
for(int i=0;i<n;i++)
{
suma=suma|a[i];
sumb=sumb|b[i];
}
cout<<suma+sumb<<endl;
return 0;
}
Print Check
codeforces 631B
算法:思维
注释:本题较为简单。
- 只需记录行号和列号的最终状态(执行的操作序号)即可,输出每个颜色时,查询所在行和列的最大值所对应的操作。
#include<iostream>
#include<cstdio>
#define N 5010
#define K 100010
using namespace std;
int row[N],col[N],a[K];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,k,pos,r,i,j;
cin>>n>>m>>k;
for(i=1;i<=k;i++)
{
cin>>pos>>r>>a[i];
if(pos==1)row[r]=i;
else if(pos==2)col[r]=i;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[max(row[i],col[j])]<<" "