# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
613830 | czhang2718 | Constellation 3 (JOI20_constellation3) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
#define f first
#define s second
const int N=2e5+1;
int c[N], x[N], y[N];
int n, m;
vector<int> xs;
int ind[N];
ll sum[N];
vector<pair<int,int>> pts;
struct segtree{
int n;
vector<pair<int,int>> mx;
segtree(){
}
void init(int n, vector<int> &v){
this->n=n;
mx.resize(4*n);
build(v, 0, 0, n);
}
void build(vector<int> &v, int x, int lx, int rx){
if(rx-lx==1){
mx[x]={v[lx],lx};
cout << "max " << lx << " "<< rx << ' ' << mx[x].f << '\n';
return;
}
int m=(lx+rx)/2;
build(v, 2*x+1, lx, m);
build(v, 2*x+2, m, rx);
mx[x]=max(mx[2*x+1], mx[2*x+2]);
}
void pull(int i, int x, int lx, int rx){
if(rx-lx==1){
mx[x]={-1e9, i};
return;
}
int m=(lx+rx)/2;
if(i<m) pull(i, 2*x+1, lx, m);
else pull(i, 2*x+2, m, rx);
mx[x]=max(mx[2*x+1], mx[2*x+2]);
}
void pull(int i){ pull(i, 0, 0, n); }
pair<int,int> get_max(int l, int r, int x, int lx, int rx){
cout << x << endl;
if(lx>=l && rx<=r) return mx[x];
if(lx>=r || rx<=l) return {-1e9, 9};
int m=(lx+rx)/2;
return max(get_max(l, r, 2*x+1, lx, m), get_max(l, r, 2*x+2, m, rx));
}
pair<int,int> get_max(int l, int r){ return r<=l?make_pair(-int(1e9), 0):get_max(l, r, 0, 0, n); }
} star, pillar;
ll ft[N];
void upd(int i, ll v){
i++;
while(i<=n){
ft[t]+=v;
i+=i&-i;
}
}
ll sum(int i){
i++;
ll ret=0;
while(i){
ret+=ft[i];
i-=i&-i;
}
}
ll sum(int l, int r){
l++; r++;
return sum(r)-sum(l-1);
}
ll solve(int l, int r){
cout << "lr " << l << " " <<r << endl;
if(r<l) return 0;
vector<int> ind;
pair<int,int> p=pillar.get_max(l, r+1);
int mx=p.f;
cout << "max! " << mx << " " << p.s << "\n";
pillar.pull(p.s);
ind.push_back(p.s);
while((p=pillar.get_max(l, r+1)).f==mx){
int j=p.s;
pillar.pull(j);
ind.push_back(j);
}
int L=lower_bound(xs.begin(), xs.end(), l)-xs.begin();
int R=upper_bound(xs.begin(), xs.end(), r)-xs.begin();
while((p=star.get_max(L, R)).f>mx){
int j=p.s;
int st=pts[j].s;
star.pull(j);
sum.upd(x[st], c[j]);
}
ll ret=1e18;
int prv=l-1;
ind.push_back(r+1);
for(int i=0; i<ind.size(); i++){
ret=min(ret, solve(prv+1, ind[i]-1));
prv=ind[i];
}
cout << "solve " << l << " "<< r <<" " << ret << "\n";
return ret;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n;
vector<int> h(n);
for(int &x:h) cin >> x;
pillar.init(n, h);
ll tot=0;
cin >> m;
vector<int> ys;
for(int i=0; i<m; i++){
cin >> x[i] >> y[i] >> c[i];
x[i]--;
xs.push_back(x[i]);
pts.push_back({x[i],i});
tot+=c[i];
}
sort(pts.begin(), pts.end());
sort(xs.begin(), xs.end());
for(auto &p:pts) p.f=y[p.s], ys.push_back(p.f);
star.init(m, ys);
cout << tot-solve(0,n-1);
}