D题159分求调,思路和b题解一样,但是最后两个测试点过不去

#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 4e6+5;
int ans;

int cal(int x){
    int res=0;
    if(x%3==0) res+=1;
    if(x%9==0) res+=2;
    if(x%5==0) res+=4;
    if(x%11==0) res+=8;
    return res;
}

bool blood(int x,int y){
    if(((x|y)==15)||((x|y)==13&&x&1&&y&1)) return true;
    else return false;
}
int main(){
    cin >> n;
    vector<int> a(n+5,0),b(n+5,0);
    vector<vector<int>> pre(n+5,vector<int>(16,0));
    vector<vector<int>> suf(n+5,vector<int>(16,0));
  for(int i=1;i<=n;i++){
	  cin >> a[i];
	  b[i]=cal(a[i]);
	  for(int j=0;j<=15;j++){
		  if(blood(b[i],j)) ans+=pre[i-1][j];
	  }
	  for(int k=0;k<=15;k++){
			  pre[i][k]=pre[i-1][k];
		  }
		  pre[i][b[i]]++;
  }

  for(int i=n;i>=1;i--){
	  for(int j=0;j<=15;j++){
		  suf[i][j]=suf[i+1][j];
	  }
	  suf[i][b[i]]++;
  }

  int Max=0;
  for(int i=1;i<=n;i++){
	  int mask=cal(a[i]+1);
	  int res=0;
	  for(int j=0;j<=15;j++) if(blood(b[i],j)) res-=pre[i-1][j];
	  for(int j=0;j<=15;j++) if(blood(b[i],j)) res-=suf[i+1][j];

	  for(int j=0;j<=15;j++) if(blood(mask,j)) res+=pre[i-1][j];
	  for(int j=0;j<=15;j++) if(blood(mask,j)) res+=suf[i+1][j];
	  Max=max(Max,res);
  }

  cout << ans+Max;

  return 0;
}

}

全部评论
int改为long long过了,可能是数组最长400000,要是全是495的话就是400000里选2两个,1.6e11爆int了
点赞 回复 分享
发布于 2024-11-26 19:31 河南

相关推荐

不愿透露姓名的神秘牛友
07-07 13:47
点赞 评论 收藏
分享
07-03 16:02
门头沟学院 Java
点赞 评论 收藏
分享
05-26 09:07
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 17:30
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务