数字对 (长乐一中模拟赛day2T2)
2.數字對
【題目描述】
小H是個善于思考的學生,現在她又在思考一個有關序列的問題。
她的面前浮現出一個長度為n的序列{ai},她想找出一段區間[L, R](1 <= L <= R <= n)。
這個特殊區間滿足,存在一個k(L <= k <= R),并且對于任意的i(L <= i <= R),ai都能被ak整除。這樣的一個特殊區間 [L, R]價值為R - L。
小H想知道序列中所有特殊區間的最大價值是多少,而有多少個這樣的區間呢?這些區間又分別是哪些呢?你能幫助她吧。
?
【輸入格式】
?????? 第一行,一個整數n.
?????? 第二行,n個整數,代表ai.
?
【輸出格式】
?????? 第一行兩個整數,num和val,表示價值最大的特殊區間的個數以及最大價值。
第二行num個整數,按升序輸出每個價值最大的特殊區間的L.
?
【樣例輸入1】
5
4 6 9 3 6
?
【樣例輸出1】
1 3
2
?
【樣例輸入2】
5
2 3 5 7 11
?
【樣例輸出2】
5 0
1 2 3 4 5
?
【數據范圍】
??? 30%: 1 <= n <= 30 , 1 <= ai <= 32.
??? 60%: 1 <= n <= 3000 , 1 <= ai <= 1024.
??? 80%: 1 <= n <= 300000 , 1 <= ai <= 1048576.
?? 100%: 1 <= n <= 500000 , 1 <= ai < 2 ^ 31.
?
思路:
暴力出奇跡,亂搞壓正解!
我們暴力枚舉每個ak點
然后記錄最長的區間
判一下重
輕松ac
?
來,上代碼:
#include<vector> #include<cstdio> #include<iostream> #include<algorithm>using namespace std;int n,if_Z,ai[500005],head_num=0;char word;vector<int>ans[500005];inline void read_int(int &now_001) {now_001=0,if_Z=1;word=getchar();while(word<'0'||word>'9'){if(word=='-') if_Z=-1;word=getchar();}while(word<='9'&&word>='0'){now_001=now_001*10+(int)(word-'0');word=getchar();}now_001*=if_Z; }int main() {ios::sync_with_stdio(false);read_int(n);for(int i=1;i<=n;i++) read_int(ai[i]);int lik,rik,cur_1,maxn=0;for(int i=1;i<=n;i++){lik=i,rik=i,cur_1=0;while(lik-1>0){if(ai[lik-1]%ai[i]==0) lik--;else break;}while(rik+1<=n){if(ai[rik+1]%ai[i]==0) rik++;else break;}ans[rik-lik].push_back(lik);maxn=max(maxn,rik-lik);} sort(ans[maxn].begin(),ans[maxn].end());vector<int>::iterator it=ans[maxn].begin();while(it<ans[maxn].end()){if(*it!=ai[head_num]){head_num++;ai[head_num]=*it;}it++;}printf("%d %d\n",head_num,maxn);for(int i=1;i<=head_num;i++) printf("%d ",ai[i]);return 0; }?
轉載于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6065852.html
總結
以上是生活随笔為你收集整理的数字对 (长乐一中模拟赛day2T2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改maven本地仓库位置
- 下一篇: html标签思维导图