NOIP模擬 裝飾大樓

2021-07-11 06:59:42 字數 1359 閱讀 9367

國際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為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...