1. 程式人生 > >[2018.10.15 T3] 數列

[2018.10.15 T3] 數列

暫無連線

數列

【題目描述】

小Q和小C是好朋友。

小Q喜歡數列。有一天,他心血來潮,寫下了三個長度均為 n n 的數列。

小C也很喜歡數列。但是他只喜歡其中一種,波動數列。

小C把他的喜好告訴了小Q。小Q便打算找出這三個數列內的最長波動數列。

也就是說,如果我們將三個數列記做 a

[ n ] [ 3 ] a[n][3] ,他必須要構造一個二元組序列: ( p
[ i ] , q [ i ] ) (p[i], q[i])
,使得對於任何 i > 1 i>1 有:

p [ i ] > p [ i 1 ] p[i]>p[i-1]

q [ i ] = 0 a [ p [ i ] ] [ q [ i ] ] a [ p [ i 1 ] ] [ q [ i 1 ] ] q[i]=0,a[p[i]][q[i]]≥a[p[i-1]][q[i-1]]

q [ i ] = 2 q[i]=2 ,只要保持段內同向即可(就是對於連續的一段 q [ i ] = 2 q[i]=2 ,要麼都有 a [ p [ i ] ] [ q [ i ] ] a [ p [ i 1 ] ] [ q [ i 1 ] ] a[p[i]][q[i]]≥a[p[i-1]][q[i-1]] ,要麼都有 a [ p [ i ] ] [ q [ i ] ] a [ p [ i 1 ] ] [ q [ i 1 ] ] a[p[i]][q[i]]≤a[p[i-1]][q[i-1]] )。

小Q希望這個二元組序列儘可能長。

提示:當 q [ i ] ! = q [ i 1 ] q[i]!=q[i-1] 時,數列的增減性由 q [ i ] q[i] 而非 q [ i 1 ] q[i-1] 決定。

【簡版題意】

小Q拿到一個 3 × n 3×n 的陣列,要在每一列選一個數(或者不選),滿足以下條件:

(1)如果在第一行選,那它必須大於等於上一個數

(2)如果在第二行選,那麼必須小於等於上一個數

(3)如果在第三行選,對於連續的一段在第三行選的數,必須滿足方向相同(都小於等於上一個數或者都大於等於上一個數)

【輸入】

輸入包含 4 4 行,第一行包含一個整數 n n 表示數列長度,第 2 3 4 2、3、4 行每行 n n 個整數,分別表示三個數列。

【輸出】

輸出僅包含一個整數,即最長波動數列的長度。

【輸入樣例】

6
1 2 3 6 5 4
5 4 3 7 8 9
1 2 3 6 5 4

【輸出樣例】

6

【提示】
【樣例解釋】

取第三行 1   2   3 1\ 2\ 3 (增),然後取第 1 1 6 6 (增),然後取第三行 5   4 5\ 4 (減),長度為 6 6

【資料規模和約定】

對於 20 % 20\% 的資料, n 10 m 1000 n≤10,m≤1000
對於 60 % 60\% 的資料, n 1000 m 1000 n≤1000,m≤1000
對於 100 % 100\% 的資料, n 100 , 000 m 1 0 9 n≤100,000,m≤10^9

其中 m = m a x a [ i ] m=max|a[i]|

題解

這道題的題面是真的有毒,完整題面沒說 q [ i ] = 1 q[i]=1 的情況,簡版題面又沒說選選連續第三行的時候增減性要考慮第一個第三行前面的數。。。

讀懂題面以後這道題就變得簡單起來, d p [ i ] [ 1 ] dp[i][1] 表示選第 i i 列第一行為結尾的最長長度, d p [ i ] [ 2 ] dp[i][2] 同理, d p [ i ] [ 3 ] dp[i][3] 表示選第三行並且單增, d p [ i ] [ 4 ] dp[i][4] 表示單減。暴力轉移是 O ( n 2 ) O(n^2) 的,發現轉移時查詢的實際上是值域最大值,所以開一棵值域線段樹即可 O ( log n ) O(\log n) 轉移。

程式碼
#include<bits/stdc++.h>
#define ls v<<1
#define rs v<<1|1
using namespace std;
const int M=1e5+5;
int dp[M][5],a[M][5],data[M<<2],n,ans,q;
struct sd{
	int mx[M<<4];
	void up(int v){mx[v]=max(mx[ls],mx[rs]);}
	void add(int v,int le,int ri,int pos,int val)
	{
		if(le==ri){mx[v]=max(mx[v],val);return;}
		int mid=le+ri>>1;
		if(pos<=mid)add(ls,le,mid,pos,val);
		else add(rs,mid+1,ri,pos,val);
		up(v);
	}
	int ask(int v,int le,int ri,int lb,int rb)
	{
		if(lb<=le&&ri<=rb){return mx[v];}
		int mid=le+ri>>1,ans=0;
		if(lb<=mid)ans=ask(ls,le,mid,lb,rb);
		if(mid<rb)ans=max(ans,ask(rs,mid+1,ri,lb,rb));
		return ans;
	}
}sgt[4];
void in()
{
	scanf("%d",&n);
	for(int j=1;j<=3;++j)for(int i=1;i<=n;++i)scanf("%d",&a[i][j]),data[++q]=a[i][j];
	data[++q]=INT_MAX;
}
void ac()
{
	sort(data+1,data+1+q);q=unique(data+1,data+1+q)-data-1;
	for(int j=1;j<=3;++j)for(int i=1;i<=n;++i)a[i][j]=lower_bound(data+1,data+1+q,a[i][j])-data;
	for(int i=1;i<=n;++i)
	{
		dp[i][1]=max(max(sgt[1].ask(1,1,q,1,a[i][1]),sgt[2].ask(1,1,q,1,a[i][1])),sgt[3].ask(1,1,q,1,a[i][1]))+1;
		dp[i][2]=max(max(sgt[1].ask(1,1,q,a[i][2],q),sgt[2].ask(1,1,q,a[i][2],q))
            
           

相關推薦

[2018.10.15 T3] 數列

暫無連線 數列 【題目描述】 小Q和小C是好朋友。 小Q喜歡數列。有一天,他心血來潮,寫下了三個長度均為 n n

2018.10.15學習筆記——H5新特性

.com 代碼 分享 筆記 bubuko 引入 解決 瀏覽器 動態創建 一、新標簽兼容ie678方式:   1.動態創建標簽;   2.引入別人寫好的兼容插件;   3.完美解決方式:cc:ie6;   上代碼:         二、video/audio標簽兼容方式:  

第五周動手動腦(2018.10.15-10.21)

自定義 兩種 靜態方法 不同的 div 演示 觀察 val ima 問題一: 早期經常這樣定義變量:int value=100; 前面的這樣定義:myclass obj=new myclass(); 這兩種方式定義的變量是一樣的嗎? 答:當聲明一個對象類型的變量時,實際上並

pcl計算樣點法向並顯示(2018.10.15

利用最小二乘法估計樣點表面法向,並顯示 #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/kdtree/kdtree_flann.h> #include <pcl/

點雲的曲面法向量估計(此例輸出點雲法向資訊,沒視覺化)(2018.10.15)

表面法線是幾何體表面的重要屬性,在很多領域都有大量應用,例如:在進行光照渲染時產生符合可視習慣的效果時需要表面法線資訊才能正常進行,對於一個已知的幾何體表面,根據垂直於點表面的向量,因此推斷表面某一點的法線方向通常比較簡單。然而,由於我們獲取的點雲資料集在真實物體的表面表現為一組定點樣本,這樣就會有

2018.10.15——10.21

2018.10.15——10.21 一週總結 《Python程式設計從入門到實踐》 10.15(週一)四章 五章 第三章 列表簡介 第四章 操作列表 第五章 第六章 字典 第七章 使用者輸入和w

2018-10-15工作日報

上午 1.深入研究-webkit-overflow-scrolling:touch及ios滾動 2.CSS控制文字,超出部分顯示省略號,記住是這個樣式是設在具體的文字節點上的,而不是容器上。 下午 3.chrome怎麼除錯js 4.繼續學習vue.js (1)當它們處

[2018.10.31 T3] 玩

暫無連結 玩 題目背景 你的昆特牌打的太好啦!不一會你就 A K AK

[2018.10.24 T3] 老大

暫無連結 老大 【題目描述】 因為 OB 今年拿下 4 4 4塊金牌,學校贊助擴建勞模

[2018.10.25 T3] 旅程

暫無連結 旅程 【題目描述】 您曾經帶領著我,穿過我的白天的擁擠不堪的旅程,而到達了我的黃昏的孤寂之境。在通宵的寂靜裡,我等待著它的意義。 神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞

[2018.10.23 T3] 新的家園

暫無連結 新的家園 ——過去已成為過去,而未來終將是過去。所有事物在出現的那一刻都註定成為歷史…… 題目背景 公元 8102

2018/10/15 SpringBoot

一、springBoot對日誌的支援 1.springboot預設選用slf4j,logback 2.springBoot預設已經配置好了日誌 3.通過LoggerFactory.getLogger(xx.class); 獲得日誌物件 4.常用方法trace debugger inf

2018.10.15 NOIP2018個人訓練賽第一場總結與題解

題目來源:https://www.jisuanke.com/contest/777?view=challenges T1 純暴力時間複雜度 O (

2018/10/15

JavaScript 程式設計題 1.查詢「sdddrtkjsfkkkasjdddj」字串中,出現次數最多的字元和次數。 var str = “sdddrtkjsfkkkasjdddj”; var o = {}; //遍歷str,統計每個字元出現的次數 for (var i

貝殼2018.10.15筆試 找尋序列

題目描述 n確認序列長度,m確定最後一個數。還有一個要求是(從提示可以明顯看出),每兩個數,後者要能整除前者,比如[1,3,3]中,【1,3】要3能整除1,【3,3】要3能整除3。 動態規劃 如果n=1那麼只有一種情況。 如果n>1,那麼有遞迴式,dp[n,m] =

[2018.10.15 T2] 字串

暫無連線 字串 【題目描述】 小C學會了 S A SA

[2018.10.15 T1] 或

暫無連線 或 【題目描述】 小Q非常喜歡序列和位運算。 有一天,小Q想到了一個模型:一個長度為 n n

[2018.10.11 T3] 欠錢

暫無連結 欠錢 題目描述 南極的企鵝王國大學中生活著 n n n只企鵝,作為

[2018.10.18 T3] 小 G 的線段樹

暫無連結 小 G 的線段樹 【題目描述】 小 G 是一名 O I e

2018-10-15 例項化物件 Instantiate與銷燬遊戲物件GameObject.Destroy

  GameObject.Instantiate(Object, Vector3, Quaternion, transform.parent); Quaternion[四元數]:例項化後物件的旋轉情況 Quaternion.identity:無旋轉   &nb