Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)

//GNU C++17可以AC,Clang++17 Diagnostics会超时,可能解除读入同步对它无用。

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int x[1000007],y[1000007];
long long a[1000007];
int cc[2000007];
vector<pair<int,long long> >v[2000007];
long long mx[4000007],lz[4000007],mxid[4000007];
long long cmx,cid;
int n,cnt;
void up(int rt){
if(mx[rt<<1]>=mx[rt<<1|1]){
mx[rt]=mx[rt<<1];
mxid[rt]=mxid[rt<<1];
}
else{
mx[rt]=mx[rt<<1|1];
mxid[rt]=mxid[rt<<1|1];
}
}
void down(int rt){
lz[rt<<1]+=lz[rt];
lz[rt<<1|1]+=lz[rt];
mx[rt<<1]+=lz[rt];
mx[rt<<1|1]+=lz[rt];
lz[rt]=0;
}
void build(int rt,int l,int r){
if(l==r){
mx[rt]=-cc[l];
mxid[rt]=l;
return ;
}
build(rt<<1,l,(l+r)>>1);
build(rt<<1|1,((l+r)>>1)+1,r);
up(rt);
}
void update(int rt,int l,int r,int L,int R,long long k){
if(L<=l&&r<=R){
lz[rt]+=k;
mx[rt]+=k;
return ;
}
down(rt);
if(L<=((l+r)>>1))
update(rt<<1,l,(l+r)>>1,L,R,k);
if(R>((l+r)>>1))
update(rt<<1|1,((l+r)>>1)+1,r,L,R,k);
up(rt);
}
void query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R){
if(mx[rt]>cmx){
cmx=mx[rt];
cid=mxid[rt];
}
return ;
}
down(rt);
if(L<=((l+r)>>1))
query(rt<<1,l,(l+r)>>1,L,R);
if(R>((l+r)>>1))
query(rt<<1|1,((l+r)>>1)+1,r,L,R);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cnt=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>x[i]>>y[i]>>a[i];
cc[++cnt]=x[i];
cc[++cnt]=y[i];
}
sort(cc+1,cc+1+cnt);
cnt=unique(cc+1,cc+1+cnt)-(cc+1);
for(int i=1;i<=n;++i){
x[i]=lower_bound(cc+1,cc+1+cnt,x[i])-cc;
y[i]=lower_bound(cc+1,cc+1+cnt,y[i])-cc;
if(x[i]>y[i])
swap(x[i],y[i]);
v[x[i]].push_back({y[i],a[i]});
}
long long ans=0;
int cx=cc[cnt]+1;
int cy=cx;
build(1,1,cnt);
for(int i=cnt;i;--i){
for(int j=0;j<v[i].size();++j){
int r=v[i][j].first;
long long w=v[i][j].second;
update(1,1,cnt,r,cnt,w);
}
cmx=-2e18;
cid=-1;
query(1,1,cnt,i,cnt);
if(ans<cmx+cc[i]){
ans=cmx+cc[i];
cx=cc[i];
cy=cc[cid];
}
}
cout<<ans<<"\n";
cout<<cx<<" "<<cx<<" "<<cy<<" "<<cy;
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11601382.html