小石的妹子
官方題解:
因為有兩維的限制,所以我們先按 ai 從大到小排一下序,將bi排序,將每個妹子對應的bi變成排序後bi的編號,,對ai進行從大到小排序。對於排序後的第 i 個妹子,她的排名就是 max+1 (bj>bi),
那麼我們把排名 bi 當成下標,把 rki 當成值,用線段樹維護一下區間 max 即可。
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...