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; }
}