C++实现给你n个数分别是a1a2an。求一个最长的区间xy使得区间中的数axax+1ax+2ay-1ay的和能被7整除。输出区间长度。若没有符合要求的区间输出0。输入描述第一行一个整数n1=n=50000接下来是每一个整数输出描述一个最长的区间
#include
void insert(int u,int l,int r,int x,int y,int k){ if(L[u] >= x && R[u] <= y){ add(k,u); return; } int mid = L[u] + R[u] >> 1; if(x <= mid) insert(u << 1,l,mid,x,y,k); if(y > mid) insert(u << 1 | 1,mid + 1,r,x,y,k); }
int q[N]; bool st[N]; int bfs(int start){ int hh = 0,tt = -1; q[++tt] = start,st[start] = true; while(hh <= tt){ int t = q[hh++]; for(int i = h[t];i != -1;i = ne[i]){ int j = e[i]; if(!st[j]){ q[++tt] = j; st[j] = true; } } } return tt; } int main(){ cin>>n; memset(h,-1,sizeof h); for(int i = 1;i <= n;i++){ cin>>a[i]; s[i] = s[i - 1] + a[i]; } for(int i = 0;i <= n;i++){ int r = s[i] % 7; add(r,i + n); } build(1,1,n); for(int i = n;i >= 1;i--){ int r = s[i] % 7; insert(1,1,n,i + 1,n,r + n); } int res = 0; for(int i = 0;i < 7;i++){ memset(st,0,sizeof st); for(int j = 0;j <= n;j++){ if(st[j + n]) continue; if(j == n) continue; if(j != 0) add(j + n - 1,j + n); int k = (i - s[j] % 7 + 7) % 7; for(int t = h[k];t != -1;t = ne[t]){ int l = e[t] - n; if(l > j) break; if(l == j){ res = max(res,1); }else{ int tot = bfs(l); res = max(res,j - l + 1 + tot); } } } } cout<<res<<endl; return 0;
原文地址: https://www.cveoy.top/t/topic/fKT6 著作权归作者所有。请勿转载和采集!