小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:30%: 1 <= n <= 30 , 1 <= ai <= 32.1 32
輸出2:
5 01 2 3 4 5
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...