CF1320C World of Darkraft: Battle for Azathoth
题目描述
题解
首先对
x
x
x值进行排序(包括怪兽的),于是
x
x
x值的限制关系较为容易满足了,只需要维护两个指针,扫一遍即可,但我们需要考虑对于当前
x
x
x值,如何选取到最优的
y
y
y值。
我们考虑用线段树维护,对于线段树y值(离散化过后)的位置减去他的价值(单点修改),然后每次双指针扫到怪兽
i
i
i的时候,给区间
[
x
i
[x_i
[xi,正无穷
]
]
]加上
z
i
z_i
zi值,每次单点查询区间最大值即可,最后减去当前
x
x
x值装备的价值即可
代码实现
#include<bits/stdc++.h>
#define int long long
#define M 200009
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
const int inf=1e16;
int n,m,p,ans=-inf,last=1,len,sum[M*5],d[M];
struct data{
int x,y,val;
}a[M],b[M],c[M];
struct tree{
int l,r,add,sum;
}tr[M*8];
bool cmp(const data &a,const data &b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void add(int k,int val){
tr[k].add+=val;
tr[k].sum+=val;
}
void pushdown(int k){
if(tr[k].add){
add(k<<1,tr[k].add);
add(k<<1|1,tr[k].add);
}tr[k].add=0;
}
void pushup(int k){
tr[k].sum=max(tr[k<<1].sum,tr[k<<1|1].sum);
}
void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
if(l==r){
tr[k].sum=-sum[l];
return;
}tr[k].sum=-inf;
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void update(int k,int l,int r,int val){
if(tr[k].l>r||tr[k].r<l||l>r) return;//这步很关键,因为怪物的攻击值有大于所有武器的
if(tr[k].l>=l&&tr[k].r<=r) return add(k,val);
pushdown(k);
int mid=(tr[k].l+tr[k].r)>>1;
if(l<=mid) update(k<<1,l,r,val);
if(r>mid) update(k<<1|1,l,r,val);
pushup(k);
}
signed main(){
n=read(),m=read(),p=read();
for(int i=1;i<=n;i++) d[i]=a[i].x=read(),a[i].val=read();
for(int i=1;i<=m;i++) b[i].x=read(),b[i].val=read();
for(int i=1;i<=p;i++) c[i].y=read(),c[i].x=read(),c[i].val=read();
sort(b+1,b+m+1,cmp),sort(c+1,c+p+1,cmp),sort(d+1,d+n+1);
len=unique(d+1,d+n+1)-d-1;
for(int i=1;i<=len;i++) sum[i]=inf;
for(int i=1;i<=n;i++){
a[i].x=lower_bound(d+1,d+len+1,a[i].x)-d;
sum[a[i].x]=min(a[i].val,sum[a[i].x]);
}build(1,1,len);
for(int i=1;i<=p;i++)
c[i].y=upper_bound(d+1,d+len+1,c[i].y)-d;
for(int i=1;i<=m;i++){
while(last<=p&&c[last].x<b[i].x){
update(1,c[last].y,len,c[last].val);
last++;
}ans=max(ans,tr[1].sum-b[i].val);
}printf("%lld\n",ans);
return 0;
}