1 条题解
-
2姜宏睿 (2024sng008) LV 10 @ 2025-1-26 10:59:21
#include<iostream> #include<algorithm> #include<cstdio> #define int long long using namespace std; int n,m,s; int w[200500],v[200500]; int l[200500],r[200500]; int sum_n[200500],sum_v[200500]; long long ans = 0; void init() { scanf("%lld%lld%lld",&n,&m,&s); for(int i = 1;i <= n; i++) scanf("%lld%lld",&w[i],&v[i]); for(int i = 1;i <= m; i++) scanf("%lld%lld",&l[i],&r[i]); return ; } long long check(int W) { long long ans = 0; for(int i = 1;i <= n; i++) { if( W > w[i] )// 要用前缀和,不然会炸掉!!! { sum_n[i] = sum_n[i-1]; sum_v[i] = sum_v[i-1]; } else { sum_n[i] = sum_n[i-1] + 1; sum_v[i] = sum_v[i-1] + v[i]; } } for(int i = 1;i <= m; i++) { long long a,b; a = sum_v[r[i]] - sum_v[l[i]-1]; b = sum_n[r[i]] - sum_n[l[i]-1]; ans += a*b; } return ans; } long long _abs(long long a) { if( a > 0 ) return a; return -a; } signed main() { init(); int left = 0,right = 1000000,mid; while( left <= right ) { mid = (left + right)>>1; if( check(mid) > s ) left = mid + 1; else right = mid - 1; } ans = _abs(check(left) - s); if( _abs(check(right) - s) < ans ) ans = _abs(check(right) - s); printf("%lld",ans); return 0; }
- 1
信息
- ID
- 720
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 11
- 已通过
- 7
- 上传者