C~F Java题解,代码已去除冗余~~~
由于两数的与运算结果一定不大于两数的最小值,因此y的最高位必须要与x的最高位相同,否则不构成有效三角形,而题目有要求y小于x,因此在x比特数为1的时候需要特判,时间复杂度O(T)
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
for(int i=sc.nextInt();i!=0;i--){
int x=sc.nextInt();
System.out.println(Integer.bitCount(x)==1?-1:1<<(int)(Math.log(x)/Math.log(2)));
}
}
}
由题意可知,字符串末尾必定不是1,且假如,字符串是由若干段连续1构成的话,第一段1也构不成一个连续1,一次判断即可,实际爱你复杂度O(Tn)
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
for(int i=sc.nextInt();i!=0;i--){
int n=sc.nextInt();
String s=sc.next();
boolean ok=s.charAt(n-1)=='0';
for(int j=0;j<n;j++){
if(s.charAt(j)=='1'){
int p=j;
while(p<n&&s.charAt(p)=='1'){
p++;
}
ok&=p-j>1;
break;
}
}
System.out.println(ok?"YES":"NO");
}
}
}
无视掉k的大小,所有操作可以视为,n右移到某一位的时候,此时数字为奇数,它以及它的若干次乘2的数字的集合,直到n减少为0为止,时间复杂度O(Tlogn)
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
for(int i=sc.nextInt();i!=0;i--){
int n=sc.nextInt(),k=sc.nextInt();
long ans=0;
while(n!=0&&k>=0){
int p=find(n);
ans+=k-Math.max(-k,-p)+1;
k-=p+1;
for(int j=0;j<=p;j++){
n>>=1;
}
}
if(n==0&&k>=0){
ans++;
}
System.out.println(ans);
}
}
static int find(int a){
int ans=0;
for(;a%2==0;a>>=1,ans++);
return ans;
}
}
先假设,每种集合的分组数就是两个一组,再枚举每一种小球作为绝对众数的前提下贡献变化多少,时间 复杂度O(Tn^2+C^2),C==5000
import java.util.*;
public class Main{
static int mod=998244353,comb[][]=new int[5005][5005];
static{
for(int i=0;i<=5000;i++){
comb[i][0]=1;
for(int j=1;j<=i;j++){
comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%mod;
}
}
}
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
for(int i=sc.nextInt();i!=0;i--){
int n=sc.nextInt();
Map<Integer,Integer> map=new HashMap<>();
for(int j=0;j<n;j++){
int a=sc.nextInt();
map.put(a,map.getOrDefault(a,0)+1);
}
long ans=0;
for(int j=1;j<=n;j++){
ans=(ans+(j+1)/2L*comb[n][j])%mod;
}
for(int a:map.values()){
for(int j=1;j<=a;j++){
for(int k=0;k<j&&k+a<=n;k++){
//总长度为j+k,
ans=(ans+comb[n-a][k]*(j-(j+k+1L)/2)%mod*comb[a][j])%mod;
}
}
}
System.out.println(ans);
}
}
}