第一反應肯定是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天中,他每天都會選擇相應天數的顏料數進行混合...