題意:
有多組測試資料,每組資料的n和d表示,有n個數,求間距大於d的最長上公升序列。
題解:1、按權值從小到大排序,權值相同的時候按下標從大到小排序。
2、線段樹維護符合條件的上公升子串行,然後去找當前情況在其前面符合間距的範圍裡找當前最長的上公升子串行,再更新進去就可。
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#define pi 2*asin(1.0)
#define ll long long
#define pb push_back
#define pa pair#define clr(a,b) memset(a,b,sizeof(a))
#define lson lr<<1,l,mid
#define rson lr<<1|1,mid+1,r
#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)
#define key_value ch[ch[root][1]][0]c:\program files\git\bin
const int mod = 1e9+7;
const ll n = 2e5+15;
const int maxn = 1e4+1000;
const int letter = 130;
const int inf = 1e17;
const double pi=acos(-1.0);
const double eps=1e-8;
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,d,mx[n<<2];
struct nodeque[n];
bool cmp(node a,node b)
void pushup(int lr)
void build(int lr,int l,int r)
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(lr);
}void update(int id,int v,int lr,int l,int r)
int mid=(l+r)>>1;
if(id<=mid) update(id,v,lson);
else update(id,v,rson);
pushup(lr);
}int query(int ll,int rr,int lr,int l,int r)
int max1=0,mid=(l+r)>>1;
if(ll<=mid) max1=max(max1,query(ll,rr,lson));
if(rr>mid) max1=max(max1,query(ll,rr,rson));
return max1;
}int main()
sort(que+1,que+n+1,cmp);
build(1,1,n);
for(int i=1;i<=n;i++)
else update(que[i].id,1+query(1,que[i].id-d-1,1,1,n),1,1,n);
}printf("%d\n",mx[1]);
}return 0;
}
HDU4521 小明系列問題 小明序列
description 大家都知道小明最喜歡研究跟序列有關的問題了,可是也就因為這樣,小明幾乎已經玩遍各種序列問題了。可憐的小明苦苦地在各大 上尋找著新的序列問題,可是找來找去都是自己早已研究過的序列。小明想既然找不到,那就自己來發明乙個新的序列問題吧!小明想啊想,終於想出了乙個新的序列問題,他欣喜...
HDU 4521 小明序列 線段樹 DP
題目鏈結 include include include include include include include include includeusing namespace std const int maxn 100005 const int inf 1 30 0x7f int n,d ...
小明系列故事 買年貨(HDU)
題意理解 有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?問題分析 多維01揹包問題,用dp。動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp ii jj kk ll 表示前ii個年貨花了jj錢...