HN2015集訓 永遠亭的竹筍採摘

2021-08-01 16:33:19 字數 1348 閱讀 5357

第一反應肯定是dp啦,然後就會愉快的t成一頭象拔蚌。

那麼,說說正解吧。

顯然,選取的區間一定可以是兩頭為差值最小的。那就好辦了,只需要預處理出所有的這樣的區間,再dp即可,由於資料是隨機生成的,所以這樣的區間不會太多,有人驗證了,好像是o(n)級別的。

預處理怎麼搞?分塊優化,pre[i][j]表示在第i塊內的數,與j差值的最小值。每一塊內的數取出來排序,兩個下標跟著動就行了。

然後把那些區間搞出來,從a[n]到a[1],先暴力處理自身所在的塊內的。然後在看後面的塊,如果最小值更有,那就再暴力處理這個塊。得出的區間要注意,如果有區間被完全包含並且最小值還小於這個區間,那麼這個區間顯然可以捨去,最小值可以用樹狀陣列來維護。

把右端點相同的區間鏈起來,一次非常簡單的dp就得出答案了。

#include

#include

#include

#include

#include

#include

//#include

#define n 50005

#define ll long long

using namespace std;

const int block=210;

const int inf=0x3f3f3f3f;

template inline void _read(t& x)

for(x=0;t>='0'&&t<='9';t=getchar())x=x

*10+t-'0';

if(!sign)x=-x;

}int n,m,tot,top;

int a[n],pre[255][n],q[n],f[n][1005];

struct node

node(int l,int r,int d)

};vectortra[n];

int c[n];

int lowbit(int

x)void modify(int

x,int d)

}int getmin(int

x) return temp;

}bool check(int

x)void pre()

}/*for(i=1;i<=tot;i++)

cout<*/

}int temp;

void work(int

x,int st,int num)} }

}int main()}}

for(i=0;i<=n;i++)

}f[0][0]=0;

int ans=inf;

for(i=1;i<=n;i++)}}

cout}

NOIP2015集訓總結

又是一年秋天到,對於一介oier來說,又到了新的乙個賽季。最近的兩個星期,我經歷了人生中第一次停課訓練。這樣的生活還是第一次經歷,有乙份新鮮感。好了。廢話不多說,直接進入正題 集訓總結 總的來說,停課訓練還是比較累的 特別是想到回去以後有成噸的文化課要補 但是我也收穫了許多,比如說 學了很多新演算法...

8 1 集訓日記

今天看了有關容斥原理的幾篇部落格。容斥原理的基本思想是 先不考慮重疊的情況,把所有物件的數目求出,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複。首先是乙個經典的互素問題 hdoj 4135 co prime 題目大意是 給定a,b,n,求區間 a,b 中與n互素的數的個數。思...

8 4 集訓日記

今天看了有關組合數學的一些內容。首先,排列組合的 為 ll c ll n,ll m ll a ll n,ll m 一道組合數學 位運算的題,hdoj4810 wall painting 題目大意 有一位畫家,有 n種顏料,給出 n種顏料的值。然後在1到 n天中,他每天都會選擇相應天數的顏料數進行混合...