NOIP2014模擬10 26 數字對

2021-09-10 06:00:25 字數 1575 閱讀 4327

小h是個善於思考的學生,現在她又在思考乙個有關序列的問題。

她的面前浮現出乙個長度為n的序列,她想找出一段區間[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:

54 6 9 3 6

輸入2:

52 3 5 7 11

輸出1:

1 32

輸出2:

5 01 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.

題解:暴力打標記。

易證:o(n)

#include#define n 500010

#define inf 2147483647

#define rint register int

#define ll long long

#define point(a) multiset::iterator

#define mod (ll)(500000)

#define mem(a,b) memset(a,b,sizeof (a))

#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);

using namespace std;

struct interval

s[n];

int n,ans,i;

int bz[n],l,r,a[n],num,flag[n];

void right_updata()

int main()

ans=0;

for(i=1;i<=n;i++)ans=max(ans,s[i].y -s[i].x);

for(mem(flag,0),i=1;i<=n;i++)if(ans == s[i].y-s[i].x && !flag[s[i].x]) ++num,flag[s[i].x]=1;

printf("%d %d\n",num,ans);

for(mem(flag,0),i=1;i<=n;i++)if(ans == s[i].y - s[i].x && !flag[s[i].x]) printf("%d ",s[i].x),flag[s[i].x]=1;

return 0;

}

NOIP2014模擬10 26 改造二叉樹

首先,二叉搜尋樹。來個dfs序來把它變成乙個序列。然後,我們要將其修改成乙個上公升序列。當然,直接打lis 最長上公升子串行 是肯定不可以的。所以我考場直接棄了正解,打了個n2dp,水了個60分。正解的話 我們要使序列a 1 變成 a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 a n ...

noip2014 螺旋矩陣 (模擬)

p1913螺旋矩陣 accepted 標籤 noip普及組2014 乙個 n 行 n 列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第 1 行第 1 列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中 依次填入 1,2...

NOIP2014模擬11 3 蛋糕

今天是bessie的生日,他買了乙個蛋糕和朋友們一起分享,蛋糕可以看成是乙個r行c列的 共有r c個格仔,每個格仔都有乙個0至9的數字,表示該格仔蛋糕擁有的巧克力。現在bessie要把蛋糕橫的切3刀再豎的切3刀,由於bessie刀法厲害,所以每個格仔蛋糕都是完整的,顯然蛋糕會被切成16份,然後bes...