我被自己菜驚了。
一道小題思路錯兩次
怕是沒救了。
硬是寫了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 內工作,離他的夢想也越來越近了。這款 遊戲內一般都包含了許多歌曲,歌曲越多,玩家越不易玩膩。同時,為了使玩家在遊戲上氪更多的金錢花...