國際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為h1,h2,h3,…,那麼必須滿足h1
看完題之後表示沒有看懂題目…….看了十分鐘,表示日本的題意都埋有玄機,23333終於看懂了。
題意就是有乙個經過最長上公升子串行dp後的陣列,然後隨意的刪去其中的乙個值,讓你求出還原之後的合法序列總數。
因為是dp之後的陣列,我們先要知道是怎麼dp,不然怎麼做題? f[
i]=m
ax(f
[j]+
1,f[
i])滿
足(a[
i]>a[
j])
因為要求最大值,我們設t表示i之前的f[i]的最大值。
我們可以發現如果當前的f[i]合法,那麼前面必須滿足t+1>=f[i],那麼每次的答案就加上t+1就好了,因為當前這個i的後面可以填充的值域範圍是(1…t+1),很明顯。
但是還有一種情況,如果t+2=f[i],那麼我在這個位置插入乙個可以轉移到f[i]的數就好了,但是如果這種情況出現了一次以上,那麼就不合法了,因為無法在他之前插入乙個造成多出兩個轉移。如果t+2>f[i],那麼也不合法。
如果在乙個數的左邊插入這個數的值,和右邊插入這個數的值,造成兩次插入是一樣的,這樣是不行的,所以答案減去ans-1就好了。
注意,如果出現了t+2=f[i]的情況,答案還要重新求一遍,必須要滿足能轉移過去導致序列合法。
要開long long啊!
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using
namespace
std;
const
int maxn=1000007;
int i,j,k,l,t,n,m,a[maxn];
long
long ans;
bool bz;
int main()
fo(i,1,n-1)
else
if(t==a[i]-2)
bz=1;
l=a[i];
t=a[i];
}else
if(t2)
ans+=t+1;
}ans-=n-1;
if(bz)
printf("%lld\n",ans);
}else
}
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
裝飾大樓 NOIP2015模擬11 3
其實和這東西只是扯上邊而已,完全沒有考演算法 切入正題 際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為hi,那麼必須滿足h...
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...