思路:看起来这是一个冒泡排序,但我们知道,冒泡排序最坏的情况的时间复杂度是n*(n-1)/2,刚好比题意中大,所以只有当这个数组严格降序的时候才会不符合,所以只用判断是不是严格降序就ok了。
1 #include <bits/stdc++.h>
2 #define int long long
3 #define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
4 const int maxn=5e4+50;
5 const int INF=0x3f3f3f3f;
6 int a[maxn];
7 using namespace std;
8 signed main(){
9 IOS;
10 int t;cin>>t;
11 while(t--){
12
13 int n;
14 cin>>n;
15 for(int i=0;i<n;i++)cin>>a[i];
16 int flag=0;
17 for(int i=0;i<n-1;i++){
18 if(a[i]<=a[i+1]){
19 flag=1;break;
20 }
21 }
22 //for(int i=0;i<n;i++)cout<<a[i]<<" ";
23
24 if(flag==1)cout<<"yes"<<‘\n‘;
25 else cout<<"no"<<‘\n‘;
26 }
27 return 0;
28 }
题意:给一个数组求i<j且a[i]&a[j]>=a[i]^a[j];
思路:当转化的二进制位数相同的时候,符合题意(至于为什么,看到了一个解释的很好的)看这里;
把每个数转化二进制最多32位吧,然后如果有n个相同的位数,就加上n(n-1)/2
#include <bits/stdc++.h>
#define int long long
#define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const int maxn=2e5+50;
const int INF=0x3f3f3f3f;
using namespace std;
int a[maxn];
signed main(){
IOS;
int t;cin>>t;
while(t--){
int n;cin>>n;
int b[32];
for(int i=0;i<=32;i++)b[i]=0;
for(int i=0;i<n;i++){
cin>>a[i];
int j=0;
while(a[i]){
a[i]/=2;
j++;
}
b[j]++;//cout<<b[j]<<"&&"<<j<<" ";
}
int ans=0;
for(int i=1;i<=32;i++){
if(b[i]>1){
int cnt=b[i];
ans+=cnt*(cnt-1)/2;
}
}
cout<<ans<<‘\n‘;
}
return 0;
}
Codeforces Round #672 (Div. 2)9月24号思维(时间复杂度)A+位运算二进制B+动态规划C
原文:https://www.cnblogs.com/ahijing/p/13733104.html