九省聯考2018 IIIDX 題解

2022-05-05 12:30:11 字數 1466 閱讀 4623

我被自己菜驚了。

一道小題思路錯兩次

怕是沒救了。

硬是寫了2個晚上……

對於每個位置,選能選的最大數。但是要記得預留子樹裡的數字。

感性地說:如果沒有重複數,自然是「擠滿」的,但是有重複數後就可能有空餘。

離散化,對於每個數字用線段樹記錄比它大的數中,數的個數減去已確定的不能選的數的個數。

如果兩點的數衝突,即兩數預留的數中有衝突,那麼從這兩個數到最大數顯然都選了並有數被選兩次,即預留的數個數大於區間內總的數個數。

則比兩數小的數中必然有數的線段樹中的值小於0。

故只要均大於0就合法。以此二分找當前能選的最大數即可。

另外注意:每次新到乙個父節點要把其預留的數「釋放」給子節點。

#include#include

#include

#include

using

namespace

std;

const

int maxn = 2500005

;const

int inf = 0x3f3f3f3f

;int

n, d[maxn], tm, y[maxn], bigger[maxn];

intans[maxn], c[maxn], kk[maxn], lsum[maxn];

double

k;struct

atree

void add(int x, int l, int r, int a, int b, int

k)

int mid=(l+r)/2

; down(x);

add(ls, l, mid, a, b, k);

add(rs, mid+1

, r, a, b, k);

minn[x]=min(minn[x*2], minn[x*2+1

]);

return

; }

int count(int x, int l, int r, int a, int

b)

int mid=(l+r)/2

, t;

down(x);

t=min(count(ls, l, mid, a, b), count(rs, mid+1

, r, a, b));

minn[x]=min(minn[x*2], minn[x*2+1

]);

return

t; }

} t;

inline

int find_p(int

x)

returnl;}

intmain()

for(i=n; i >= 1; i--)

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

return0;

}

九省聯考2018 IIIDX 貪心

題目背景 osu聽過沒?那是konano最喜歡的一款 遊戲,而他的夢想就是有一天自己也能做個獨特酷炫的 遊戲。現在 他在世界知名遊戲公司konmai內工作,離他的夢想也越來越近了。這款 遊戲內一般都包含了許多歌曲,歌曲 越多,玩家越不易玩膩。同時,為了使玩家在遊戲上氪更多的金錢花更多的時間,遊戲一開...

2472 九省聯考 2018 IIIDX

一眼思路的題 就是比較難寫.考慮乙個點必須小於其 i dk id k 那麼容易想出乙個樹形結構,每個點都大於其父親.那麼對於乙個點,那麼他能選取的最大值就是當前能選的所有點中的n size id n s ize id 這個點的值。然後留夠其兒子的位置即可。最後如果有相同的點,容易想到把當前點放在權值...

洛谷4364 九省聯考2018 IIIDX

標籤 線段樹 題目傳送門 osu 聽過沒?那是konano 最喜歡的一款 遊戲,而他的夢想就是有一天自己也能做個獨特酷炫的 遊戲。現在,他在世界知名遊戲公司konmai 內工作,離他的夢想也越來越近了。這款 遊戲內一般都包含了許多歌曲,歌曲越多,玩家越不易玩膩。同時,為了使玩家在遊戲上氪更多的金錢花...