2 条题解

  • 0
    @ 2025-10-8 16:59:08
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N = 200010;
    int n,h[N];
    ll a[N],c[N];
    
    void add(int x,ll k){for(;x <= n; x += x & -x ) c[x] = max(c[x], k);}
    
    ll query(int x) {
    	ll res= 0;
    	for (; x; x -= x & -x) res = max(res, c[x]);
    	return res;
    } 
    
    int main() {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; ++i) scanf("%d", &h[i]);
    	for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
    	ll ans=0;
    	for (int i = 1; i <= n; ++i) {
    		ll fi = query(h[i] - 1) + a[i]; // 区间查询最大值
    		add(h[i], fi);           // 塞入当前 fi 的值
    		ans = max(ans, fi);      // 记录答案
    	}
    	printf("%lld", ans);
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:02
      #include <bits/stdc++.h>
      using namespace std;
      #define ll long long
      const int N = 200010;
      int n,h[N];
      ll a[N],c[N];
      
      void add(int x,ll k){for(;x <= n; x += x & -x ) c[x] = max(c[x], k);}
      
      ll query(int x) {
      	ll res= 0;
      	for (; x; x -= x & -x) res = max(res, c[x]);
      	return res;
      } 
      
      int main() {
      	scanf("%d", &n);
      	for (int i = 1; i <= n; ++i) scanf("%d", &h[i]);
      	for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
      	ll ans=0;
      	for (int i = 1; i <= n; ++i) {
      		ll fi = query(h[i] - 1) + a[i]; // 区间查询最大值
      		add(h[i], fi);           // 塞入当前 fi 的值
      		ans = max(ans, fi);      // 记录答案
      	}
      	printf("%lld", ans);
      	return 0;
      }
      • 1

      信息

      ID
      1898
      时间
      2000ms
      内存
      1024MiB
      难度
      7
      标签
      递交数
      28
      已通过
      9
      上传者