Codeforces #209 (Div. 2) D. Pair of Numbers
思路:将ai排序,从小的开始枚举,两边拓展区间,被拓展的标记下
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define maxn 300005 int a[maxn]; int st[maxn]; bool vis[maxn]; struct node { int idx,val; }ask[maxn]; bool cmp(const node &a,const node &b) { if(a.val==b.val) return a.idx<b.idx; else return a.val<b.val; } int main() { int n,cnt; int l,r,pos,num; int _max; while(scanf("%d",&n)!=EOF) { cnt=0; _max=0; for(int i=1;i<=n;++i) { scanf("%d",&ask[i].val); ask[i].idx=i; a[i]=ask[i].val; vis[i]=false; } sort(ask+1,ask+n+1,cmp); for(int i=1;i<=n;++i) { pos=ask[i].idx; if(!vis[pos]) { //cout<<"pos--"<<pos<<endl; num=ask[i].val; l=r=pos; while(a[l]%num==0&&l>=1) { vis[l]=true; l--; } while(a[r]%num==0&&r<=n) { vis[r]=true; r++; } l++; r--; //cout<<"l--"<<l<<" r--"<<r<<endl; if(r-l==_max) { cnt++; st[cnt]=l; } else if(r-l>_max) { _max=r-l; cnt=1; st[cnt]=l; } } } printf("%d %d\n",cnt,_max); sort(st+1,st+cnt+1); for(int i=1;i<=cnt;++i) { printf("%d",st[i]); if(i==cnt) printf("\n"); else printf(" "); } } return 0; }

浙公网安备 33010602011771号