记录编号 410935 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 有趣的有趣的家庭菜园 最终得分 100
用户昵称 Gravatarasd 是否通过 通过
代码语言 C++ 运行时间 9.988 s
提交时间 2017-06-02 23:10:36 内存使用 36.94 MiB
显示代码纯文本
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #define fo(i,a,b) for(i=a;i<=b;i++)
    #define fod(i,a,b) for(i=a;i>=b;i--)
    typedef long long ll;
    using namespace std;
    const int maxn=100007;
    int i,j,k,l,n,m;
    ll tt,ans;
    ll a[maxn],b[maxn],c[maxn],d[maxn],tot;
    ll f[maxn],g[maxn];
    struct nod {
    	ll a,d;
    } e[maxn];
    struct node {
    	ll da,biao,biao1,biao2;
    } t[maxn*10];
    bool cmp(nod x,nod y) {
    	return x.a<y.a;
    }
    void doing1(int x,ll y) {
    	t[x].da=max(t[x].da,y);
    	ll u=y-t[x].biao;
    	if(t[x].biao2)t[x].biao1=max(t[x].biao1,u);
    	else t[x].biao2=1,t[x].biao1=u;
    }
    void doing2(int x,ll y) {
    	t[x].da+=y;
    	t[x].biao+=y;
    }
    void doing(int x) {
    	if(t[x].biao2!=0) {
    		doing1(x*2,t[x].biao1);
    		doing1(x*2+1,t[x].biao1);
    		t[x].biao1=t[x].biao2=0;
    	}
    	if(t[x].biao!=0) {
    		doing2(x*2,t[x].biao);
    		doing2(x*2+1,t[x].biao);
    		t[x].biao=0;
    	}
    }
    void change(int x,int l,int r,int y,int z,ll o) {
    	if (y>z) return;
    	if (l==y&&r==z) {
    		doing2(x,o);
    		return;
    	}
    	int mid=(l+r)/2;
    	doing(x);
    	if (z<=mid) change(x*2,l,mid,y,z,o);
    	else if (y>mid) change(x*2+1,mid+1,r,y,z,o);
    	else change(x*2,l,mid,y,mid,o),change(x*2+1,mid+1,r,mid+1,z,o);
    	t[x].da=max(t[x*2].da,t[x*2+1].da);
    }
    void change1(int x,int l,int r,int y,int z,ll o) {
    	if (y>z) return;
    	if (l==y&&r==z) {
    		doing1(x,o);
    		return;
    	}
    	int mid=(l+r)/2;
    	doing(x);
    	if (z<=mid) change1(x*2,l,mid,y,z,o);
    	else if (y>mid) change1(x*2+1,mid+1,r,y,z,o);
    	else change1(x*2,l,mid,y,mid,o),change1(x*2+1,mid+1,r,mid+1,z,o);
    	t[x].da=max(t[x*2].da,t[x*2+1].da);
    }
    ll find(int x,int l,int r,int y) {
    	if (l==r) return t[x].da;
    	int mid=(l+r)/2;
    	doing(x);
    	if (y<=mid)return find(x*2,l,mid,y);
    	else return find(x*2+1,mid+1,r,y);
    }
    int main() {
    	freopen("Fgarden.in","r",stdin);
    	freopen("Fgarden.out","w",stdout);
    	scanf("%d",&n);
    	fo(i,1,n) {
    		scanf("%lld%lld%lld",&e[i].a,&b[i],&c[i]);
    		e[i].d=i;
    	}
    	sort(e+1,e+n+1,cmp);
    	tot=1;
    	a[e[1].d]=tot;
    	fo(i,2,n) {
    		if(e[i-1].a!=e[i].a)a[e[i].d]=++tot;
    		else a[e[i].d]=tot;
    	}
     
    	fo(i,1,n) {
    		f[i]=b[i]+find(1,1,tot,a[i]);
    		change(1,1,tot,1,a[i]-1,-c[i]);
    		change1(1,1,tot,a[i],tot,f[i]);
    	}
    	memset(t,0,sizeof(t));
    	fod(i,n,1) {
    		g[i]=b[i]+find(1,1,tot,a[i]);
    		change(1,1,tot,1,a[i]-1,-c[i]);
    		change1(1,1,tot,a[i],tot,g[i]);
    	}
    	fo(i,1,n) {
    		ans=max(ans,f[i]+g[i]-b[i]);
    	}
    	printf("%lld",ans);
    }