本文 G 来自于幻想家协会会长的个人空间_哔哩哔哩_bilibili的题解
A.Sum
解法:暴力枚举即可
代码:
#include<bits/stdc++.h>
/*
Writer: ZhengZhiLin
Date:///
*/
#define int long long
using namespace std;
signed main()
{
int t;
t=r();
while(t--)
{
int a,b,c;
cin>>a>>b>>c;
if(a==b+c || b==a+c || c==a+b){
cout<<"YES"<<endl;
} else{
cout<<"NO"<<endl;
}
}
return 0;
}
B. Increasing
解法:sort一遍之后再从小到大遍历看是否有重复元素即可
#include<bits/stdc++.h>
/*
Writer: ZhengZhiLin
Time:
*/
#define int long long
using namespace std;
signed main()
{
int t;
t=r();
while(t--)
{
int n;
cin>>n;
int a[n+1];
bool flag=true;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]){
flag=false;
}
}
if(flag==true)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
C.Stripes
解法:暴力判断是否存在有一行全是R字符,没有的话说明最后就是涂的B
#include<bits/stdc++.h>
/*
Writer: ZhengZhiLin
Time:2022-
*/
#define int long long
using namespace std;
signed main()
{
int t;
t=r();
while(t--)
{
cout<<endl;
char a[8][8];
char flag='B';
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cin>>a[i][j];
}
}
for(int i=0;i<8;i++){
if(a[i][0]=='R' && a[i][0]==a[i][1] && a[i][0]==a[i][2] && a[i][0]==a[i][3]&& a[i][0]==a[i][4] && a[i][0]==a[i][5] && a[i][0]==a[i][6] && a[i][0]==a[i][7]){
flag='R';
}
}
if(flag!='R'){
cout<<"B"<<endl;
}else{
cout<<"R"<<endl;
}
}
return 0;
}
E.Scuza
解法:先前缀和记录原来数组,将询问的q个数全部存入结构体,并给结构体排序,最后排序后双指针一个指向原数组,一个指向这个q个数的结构体的开始,最后按照下标再排序一次输出结果(写复杂了,有简便做法)
#include<bits/stdc++.h>
/*
Writer:ZhengZhiLin
Time:
*/
#define int long long
using namespace std;
const int N=2e5+10;
struct node
{
int x;
int id;
int sum;
}e[N];
bool cmp(node a,node b)
{
if(a.x<b.x)
return true;
else if(a.x==b.x){
if(a.id<b.id){
return true;
}else{
return false;
}
}else{
return false;
}
}
bool cmpp(node a,node b)
{
return a.id<b.id;
}
signed main()
{
int t;
t=r();
while(t--)
{
int n,q;
cin>>n>>q;
int a[n+1];
int s[n+1];
s[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=a[i]+s[i-1];
}
for(int i=1;i<=q;i++){
cin>>e[i].x;
e[i].id=i;
}
if(n!=1)
sort(e+1,e+q+1,cmp);
int i,j;
for(i=1,j=1;i<=n && j<=q;)
{
if(i==n && e[j].x>=a[i]){
e[j].sum=s[n];
j++;
continue;
}
if(a[i]>e[j].x){
e[j].sum=s[i-1];
j++;
}else{
i++;
}
}
sort(e+1,e+q+1,cmpp);
for(i=1;i<=q;i++){
cout<<e[i].sum<<" ";
}
cout<<endl;
}
return 0;
}
G.Orray(来自幻想家协会会长的个人空间_哔哩哔哩_bilibili的解法)
解法:很明显第一个数就是其中最大的数,然后由于要找接下来的OR最大,因此我们每次更新mask,每次找到&mask的最大值,不断更新答案存入即可
#include<bits/stdc++.h>
/*
Writher:郑志林
Time:2022-09-06-25
*/
#define int long long
#define for1(i,a) for(int i=0; i<a ; i++)
#define for2(i,a,b) for(int i=a; i<b ; i++)
#define for3(i,a,b,c) for(int i=a; i<b ;i+=c)
#define len(x) ll(x.size())
const int base=131;
int lowbit(int x) {return x & (-x);}
inline int r()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(int X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
using namespace std;
const int N=2e5+10;
int ans[N],vis[N],a[N];
signed main()
{
int t;
t=r();
while(t--)
{
int n;
n=r();
for(int i=1;i<=n;i++){
cin>>a[i];
vis[i]=0;
}
int mask=(1<<30)-1;
for(int i=1;i<=n;i++)
{
int pos=0,maxn=0;
for(int j=1;j<=n;j++)
{
int t=a[j]&mask;
if(t>maxn){
pos=j;
maxn=t;
}
}
if(maxn==0){
for(int j=1;j<=n;j++){
if(vis[j]==0){
ans[i++]=a[j];
}
}
break;
}
ans[i]=a[pos];
vis[pos]=1;
mask=mask^maxn;
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
return 0;
}