連接:https://ac.nowcoder.com/acm/contest/992/B
來源:牛客網
c++
第一行一個整數n(0<n<=200000),表示小埋家的傢俱數。
第二行n個整數,對於每一個整數ai, 0<=ai<=10^9,表示第i個傢俱的高度。
第三行n個整數,對於每一個整數vi, 0<=vi<=10^9,表示第i個傢俱上的快樂水的happy值。
一個整數,表示小埋得到的happy值總和。
6
核心: 題意很可愛,但我只會線段樹吧,開心,1C...今天qixi, 想你!!
#include <bits/stdc++.h> #define lson l, m, rt*2 #define rson m+1, r, rt*2+1 using namespace std; typedef long long LL; const int N=2e5+7; LL tree[4*N]; int a[N], sort_a[N]; int val[N]; int n, cnt; inline void pushup(int rt) { tree[rt]=max(tree[rt*2], tree[rt*2+1]); } LL query(int L, int R, int l, int r, int rt) { if (r<L||l>R) return 0; if (l>=L&&r<=R) return tree[rt]; int m=(l+r)/2; return max (query(L, R, lson), query(L, R, rson)); } void update(int k, LL key, int l, int r, int rt) { if (l==r) { tree[rt]=max(tree[rt], key); return ; } int m=(l+r)/2; if (k<=m) update(k, key, lson); else update(k, key, rson); pushup(rt); } int main() { scanf("%d", &n); for (int i=1;i<=n;i++) { scanf("%d", &a[i]); sort_a[i]=a[i]; } for (int i=1;i<=n;i++) scanf("%d", &val[i]); sort(sort_a+1, sort_a+1+n); cnt=1; for (int i=2;i<=n;i++) if (sort_a[i]!=sort_a[cnt]) sort_a[++cnt]=sort_a[i]; LL ans=0; for (int i=n;i>=1;i--) { int k=lower_bound(sort_a+1, sort_a+1+cnt, a[i])-sort_a; //printf("%d\n",k); LL tmp=query(k, cnt, 1, cnt, 1)+val[i]; ans=max(ans, tmp); update(k, tmp, 1, cnt, 1); } printf("%lld\n",ans); return 0; }