Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
80949 sh25_zhuwy 聪明的质监员(Day 2) C++ 通过 178 MS 9628 KB 1360 2026-01-04 15:35:57

Tests(20/20):


#include <iostream> #include <cmath> #include <cstring> using namespace std; const int maxn = 200005; long long n, m, s; long long w[maxn], v[maxn]; long long l[maxn], r[maxn]; long long sum1[maxn], sum2[maxn]; void init(long long x) { memset(sum1, 0, sizeof(sum1)); memset(sum2, 0, sizeof(sum2)); for ( int i = 1 ; i <= n ; ++ i ) { sum1[i] = sum1[i - 1]; sum2[i] = sum2[i - 1]; if ( w[i] >= x ) { sum1[i] ++; sum2[i] += v[i]; } } } long long check(long long x) { init(x); long long ans = 0; for ( int i = 1 ; i <= m ; ++ i ) { ans += (sum1[r[i]] - sum1[l[i] - 1]) * (sum2[r[i]] - sum2[l[i] - 1]); } return ans; } int main() { cin >> n >> m >> s; for ( int i = 1 ; i <= n ; ++ i ) { cin >> w[i] >> v[i]; } for ( int i = 1 ; i <= m ; ++ i ) { cin >> l[i] >> r[i]; } long long ll = -1e12, rr = 1e12; while ( ll < rr ) { long long mid = (ll + rr + 1) / 2; if ( check(mid) >= s ) { ll = mid; }else { rr = mid - 1; } } long long tmp = min(abs(s - check(ll)), abs(s - check(ll + 1))); cout << tmp << endl; return 0; }


测评信息: