Codeforces Round #765 (Div. 2)
目录
A
分析:
按位计算,同一位上如果1多就记录1,如果0多就记录0,相同随意
遂案例中 2 1 0 1可以输出1or0 8 8 5 16 42 15 83 65 78 42可以输出2or11
AC代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cin.tie(0);
int t,n,l,fei;
cin>>t;
while(t--)
{
vector<int>arr(31);
cin>>n>>fei;
for(int i=0;i<n;i++)
{
cin>>l;
int temp=0;
while(l)
{
arr[temp]+=l%2;
l/=2;
temp++;
}
}
int num=0;
for(int i=31;i>=0;i--)
{
num*=2;
if(arr[i]*2>=n) num++;
}
cout<<num<<endl;
}
return 0;
}
B
分析:
两个长度相同的区间在某一位置的值相同,输出最长的长度。
相同的元素越近越长。存一下下表,遍历遇到相邻的且存放数值相等的元素进行运算并更新。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[150010],b[150010];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,q=0; cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(b[a[i]])
q=max(q,b[a[i]]+n-i);
b[a[i]]=i;
}
for(int i=1;i<=n;i++)
b[a[i]]=0;
if(q<=0) q=-1;
cout<<q<<endl;
}
return 0;
}