18 8 20 校內NOIP模擬賽

2022-04-29 22:45:16 字數 2475 閱讀 3011

給你乙個凸多邊形,和多邊形內一點$p$,求其滾動一圈,點$p$的軌跡長。

$0\leq n\leq50$

**題。對於每個頂點求其與點$p​$的距離和兩條邊的夾角即可。

#include#include#include#include#include#includeusing namespace std;

templateinline void read(t& s)

while(c>='0' && c<='9')

s*=f;

}const double pi = acos(-1);

template t rabs(t x)

struct node

void readp()

double the()

double dis()

}s[100],xx;

node operator - (node a,node b)

int n;

int main()

printf("%.3lf\n",ans);

return 0;

}

求氣泡排序外層迴圈執行$k$次後的序列。

$2\leq n \leq 10^5$。

首先觀察發現 氣泡排序每進行一次,每個數字最多向後移動一次,但向前移次數沒有限制。

也就是說,最終序列的第$1$項一定是原序列的第$1$項到第$k+1$項裡面其中乙個。

顯而易見,第$1$項一定是這裡面最小的乙個(如果存在乙個比它更小的,那麼$k$次操作後它一定在這個數字的前面,所以最小的乙個一定是第$1$項)。

同理,第$2$項一定是剩餘數字加上第$k+2$項內最小的乙個(因為向前移動次數沒有限制,所以需要繼承上次的集合)。

因此,最終只需要維護乙個大小始終為$k+1$的堆,然後每次取最小值即可。

#include#include#include#include#includeusing namespace std;

templateinline void read(t& s)

while(c>='0' && c<='9')

s*=f;

}priority_queueq;

int n,k;

int s[100005];

int ans[100005];

int tot=0;

int main()

$表示當前轉移到了以$i$為根的子樹,選了$j$個葉子的最小代價。

轉移方法顯而易見。

時間複雜度$o(nk)$

以下是(不夠嚴謹的)證明。

顯而易見,將選擇葉子改為選擇節點後,複雜度不變。

先考慮此問題的弱化版,限制不為$k$而是$n$。

對於$x$來講,每一次和子節點$v$的子樹合併,需要列舉$v$的子樹大小和之前已經合併過的$x$的子樹(以下稱之為左側子樹)的大小。

顯然,我們可以視為列舉左側子樹的每乙個點以及$v$的子樹的每乙個點。兩者的計算次數是相等的。

那麼我們可以發現,任意兩個點當且僅當在其最近公共祖先處被合併。

所以總複雜度為$o(n^2)$。

來看原問題。

如果需要合併後的子樹大小沒有超過$k$,和上面問題等價。

如果合併後的子樹大小超過了$k$,那麼選擇的個數上限取$k$。

我們可以認為,個數上限為$k$列舉個數,與子樹大小為$k$枚舉子節點是等價的,顯然這部分的上界是$o(nk)$。

所以當合併後子樹超過$k$時,超過的部分會被刪掉,設多餘的部分為$x$。每次合併的計算次數大約是$kx$(不嚴謹,具體次數還和兒子的具體大小有關,均攤似乎是這個?),這部分是$o(nk)$的。

所以此問題解法複雜度為$o(nk)$。

#include#include#include#include#includeusing namespace std;

templateinline void read(t& s)

while(c>='0' && c<='9')

s*=f;

}int box[100005],las[200005],edv[200005],edw[200005],cnt=0;

void adde(int u,int v,int w)

int n,k;

int rot;

int dd[100005];

long long dp[100005][105];

int yzc[100005];

void dfs(int now,int fa)

dp[now][0]=0;

for(int i=box[now];i;i=las[i])

if(edv[i]!=fa)

}int main()

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

if(dd[i]!=1)

dfs(rot,0);

printf("%lld\n",dp[rot][k]);

return 0;

}

NOIP校內模擬 塔

我們可以這樣考慮 x 必定是由若干個立方數拼起來的 因此我們可以逆著求 只需關心每次取哪個立方數即可 設a是最大的 a 使得 a 3 不超過 m 分析樣例 我們發現在第一次的時候 就可以取a或者a 1 那第一次取a 2 a 3.行不行呢?1.用 a,剩下m a 3 2.用 a 1,x 最大為 a 3...

NOIP校內模擬 航班

描述 l因為業務繁忙,經常會到處出差。因為他是航空公司的優質客戶,於是某個航空 公司給了他乙個優惠券。他可以利用這個優惠券在任何乙個國家內的任意城市間免費旅行,當他的路線跨國 才會產生費用。l有乙個航空公司的 表與航線。而且每個城市出發都能到所有的城 市,2 個城市間可能有不止乙個航班,乙個國家內的...

NOIP校內模擬 階乘

描述 有n個正整數a i 設它們乘積為p,你可以給p乘上乙個正整數q,使pq剛好為正整數m的階乘,求m的最小值。輸入共兩行。第一行乙個正整數n。第二行n個正整數a i 輸出共一行 乙個正整數m。樣例輸入16 樣例輸出3提示 樣例解釋 當p 6,q 1時,pq 3!資料範圍與約定 對於10 的資料,n...