牛客小白月賽16 小石的妹子 線段樹

2021-09-25 06:47:34 字數 1679 閱讀 8109

小石的妹子

官方題解:

因為有兩維的限制,所以我們先按 ai 從大到小排一下序,

對於排序後的第 i 個妹子,她的排名就是 max+1 (bj>bi),

那麼我們把排名 bi 當成下標,把 rki 當成值,用線段樹維護一下區間  max 即可。

將bi排序,將每個妹子對應的bi變成排序後bi的編號,,對ai進行從大到小排序。

i 從 0 到 n 遍歷,對於每個妹子,將她插入線段樹中,妹子的重要程度為區間(bi,n)的最大值 + 1,然後將妹子的重要程度更新到bi位置。

模擬:妹子0,查詢線段樹中區間(bi,n)的最大值,此時線段樹中每個節點都是0,所以妹子0的重要程度為 1 ,然後將妹子0的重要程度更新到bi位置。。由於對ai進行從大到小排序,所以妹子0重要程度肯定1。

妹子1,查詢線段樹中區間(bj,n)的最大值,如果bj < bi,那麼妹子1 的重要程度為 2,因為妹子0的細心和熱心程度都大於妹子1 。如果bj > bi ,那麼區間(bj,n)的最大值為 0 ,妹子1 的重要程度為 1 。因為除了妹子0,沒有人比妹子1的a大,但是妹子0的b小於妹子1。妹子1 的重要程度為 1 正確。 然後將妹子1 的重要程度更新到bj位置。

#includeusing namespace std;

#define mid (l+r>>1)

#define lson (id<<1)

#define rson (id<<1|1)

#define left lson,l,mid

#define right rson,mid+1,r

const int n = 1e5+10;

int n;

int tree[4*n];

int b[n];

int res[n];

struct nodee[n];

bool cmp(node x, node y)

void update(int id, int l, int r, int pos, int val)

if(pos <= mid) update(left,pos,val);

else update(right,pos,val);

tree[id]=max(tree[lson], tree[rson]);

}int query(int id, int l, int r, int ql, int qr)

int ans = 0;

if(ql <= mid) ans = max(ans, query(left,ql,qr));

if(qr > mid) ans = max(ans, query(right,ql,qr));

return ans;

}int main()

sort(b,b+n);

int len = unique(b,b+n) - b;

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

sort(e, e+n, cmp);

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

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

cout << res[i] << "\n";

return 0;

}

牛客小白16月賽 小石的妹子

題目 小石的妹子 題意 給n個妹子排序,i妹子比j妹子好的需要滿足ai aj bi bj,當然如果一大一小的是無法比較大小的,於是排名就相同。思路 這是個二維偏序的問題,先對一維排序 即是按a從大到小排序 之後我們考慮b,對於第k個妹子,在排序完之後,那麼他前面的妹子的a都比她的,於是考慮b即可,顯...

牛客小白月賽16 小石的妹子 (貪心 )

小石的妹子 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 小石有 n 個妹子,每個妹子都有乙個細心程度 aia iai 和乙個熱心程度 bib ibi 小石想給她們乙個重要程度 tit iti 重要程度為 1 ...

牛客小白月賽16

很容易得到n 1時,因為小石先手,所以小石一定輸 而n!1時,假設n 5 小石先取1 小陽取2 4 小石去3 小陽輸,無論怎樣小石都有贏的機會 includeusing namespace std int main 打表求出1 1e3之間的所有三角形每層之和 include define ll lo...