QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#304859 | #8006. Dinosaur Bones Digging | ucup-team992# | WA | 0ms | 3600kb | C++17 | 3.1kb | 2024-01-14 04:32:13 | 2024-01-14 04:32:14 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef int uci;
typedef long long ll;
#define int long long
#define F first
#define S second
#define ar array
int n;
void update(int v, int val, int l, int r, int lq, int rq, vector<ar<int, 2>> &seg){
if(l > r || lq > r || rq < l)
return;
else if(lq <= l && r <= rq){
seg[v][1] += val;
seg[v][0] += val;
}else{
int mid = l + (r-l)/2;
if(seg[v][1] != 0){
update(v*2, seg[v][1], l, mid, l, mid, seg);
update(v*2+1, seg[v][1], mid+1, r, mid+1, r, seg);
seg[v][0] = max(seg[v*2][0], seg[v*2+1][0]);
seg[v][1] = 0;
}
update(v*2, val, l, mid, lq, rq, seg);
update(v*2+1, val, mid+1, r, lq, rq, seg);
}
}
int query(int v, int l, int r, int lq, int rq, vector<ar<int, 2>> &seg){
if(l > r || rq < l || lq > r)
return 0;
else if(lq <= l && r <= rq)
return seg[v][0];
else{
int mid= l + (r-l)/2;
if(seg[v][1] != 0){
update(v*2, seg[v][1], l, mid, l, mid, seg);
update(v*2+1, seg[v][1], mid+1, r, mid+1, r, seg);
seg[v][0] = max(seg[v*2][0], seg[v*2+1][0]);
seg[v][1] = 0;
}
return max(query(v*2, l, mid, lq, rq, seg), query(v*2+1, mid+1, r, lq, rq, seg));
}
}
void solve(){
cin >> n;
vector<ar<int, 2>> a(n);
for(int i{}; i < n; ++i){
cin >> a[i][0];
a[i][1] = i;
}
int m;
cin >> m;
vector<ar<int, 2>> b(m);
for(int i{}; i < m; ++i){
cin >> b[i][0] >> b[i][1];
b[i][0]--, b[i][1]--;
}
sort(b.begin(), b.end());
vector<ar<int, 2>> c;
int furthest = -1;
for(int i{}; i < m; ++i){
if(b[i][1] > furthest)
c.push_back(b[i]);
furthest = max(furthest, c.back()[1]);
}
m = c.size();
b.swap(c);
vector<ar<int, 2>> seg(4*m);
sort(a.rbegin(), a.rend());
int out{};
for(int i{}; i < n; ++i){
int lb = m, rb{};
int l = 0, r = m-1;
while(l <= r){
int mid = l + (r-l)/2;
if(b[mid][0] <= a[i][1] && a[i][1] <= b[mid][1]){
lb = mid;
r = mid-1;
}else{
if(b[mid][1] < a[i][1])
l = mid+1;
else
r = mid-1;
}
}
l = 0, r = m-1;
while(l <= r){
int mid = l + (r-l)/2;
if(b[mid][0] <= a[i][1] && a[i][1] <= b[mid][1]){
rb = mid;
l = mid+1;
}else{
if(b[mid][1] < a[i][1])
l = mid+1;
else
r = mid-1;
}
}
if(lb <= rb){
int bb = query(1, 0, m-1, lb, rb, seg);
out = max(out, a[i][0]*bb);
update(1, 1, 0, m-1, lb, rb, seg);
}
}
cout << out << '\n';
}
uci main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
solve();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3528kb
input:
6 3 5 2 7 4 6 2 1 5 3 6
output:
9
result:
ok answer is '9'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3536kb
input:
1 100 1 1 1
output:
0
result:
ok answer is '0'
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3600kb
input:
20 451541695 690066663 673479208 448269517 560111835 982439295 929007403 955125568 735150915 829197546 256554877 435297385 348361716 763574893 202875223 881879899 590527232 256896900 31383620 400212120 5 4 8 4 17 11 13 19 20 17 18
output:
4410905490
result:
wrong answer expected '4480894680', found '4410905490'