84pts卡常求调
查看原帖
84pts卡常求调
788951
TLE_AK楼主2024/11/5 22:24
#include<bits/stdc++.h>
using namespace std;
#define ll long long

namespace acac
{
	
	ll ls[200010],dy[200010],ne[200010];
	ll Q[200010];
	map<int,int>mp;
	int n,m,k,d,tot;
	
	void init()
	{
		sort(ls+1,ls+1+2*m);
		dy[0]=-1;
		tot=0;
		for(int i=1;i<=2*m;i++)
		{
			if(ls[i]!=ls[i-1])tot++;
			mp[ls[i]]=tot;
			dy[tot]=ls[i];
			Q[tot]=ls[i]*d;
		}
	}
	 
	struct node
	{
		int l,r;
		int val;	
	}line[100010];
	
	bool cmp(node a,node b)
	{
		if(a.r==b.r)return a.l>b.l;
		return a.r<b.r;
	}

	ll tree[800010][3],dp[200010];
	
	void pd(int u)
	{
		if(tree[u][1])
		{
			tree[2*u][0]+=tree[u][1];
			tree[2*u+1][0]+=tree[u][1];
			tree[2*u][1]+=tree[u][1];
			tree[2*u+1][1]+=tree[u][1];
			tree[u][1]=0;
		}
	}
	void pu(int u)
	{
	
		tree[u][0]=max(tree[2*u][0],tree[2*u+1][0]);
	}
	
	void c(int u,int l,int r,int L,int R,ll num)
	{
		if(l>R||L>r)return ;
		if(L<=l&&R>=r)
		{
			tree[u][0]+=num;
			tree[u][1]+=num;
			return ;
		}
		pd(u);
		int mid=(l+r)>>1;
		c(2*u,l,mid,L,R,num);
		c(2*u+1,mid+1,r,L,R,num);
		pu(u);
	}
	
	ll qr(int u,int l,int r,int L,int R)
	{
		if(L>r||l>R||L>R)return 0;
		if(L<=l&&R>=r)return tree[u][0];
		pd(u);
		int mid=(l+r)>>1;
		return max(qr(2*u,l,mid,L,R),qr(2*u+1,mid+1,r,L,R)); 
	}
	
	void build(int u,int l,int r)
	{
		tree[u][1]=tree[u][0]=0;
		if(l==r)
		{
			tree[u][0]=tree[u][1]=0;
			return ;
		}
		int mid=(l+r)>>1;
		build(2*u,l,mid);
		build(2*u+1,mid+1,r);
		pu(u);
	}

	int read()
	{
		int ans=0;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar(); 
		}
		return ans;
	}

	int main()
	{
		int C=read(),T=read();
		while(T--)
		{
			n=read(),m=read(),k=read(),d=read();
			for(int i=1;i<=m;i++)
			{
				int y;
				line[i].r=read(),y=read(),line[i].val=read();
				line[i].l=line[i].r-y+1;
				ls[i]=line[i].l;
				ls[i+m]=line[i].r;
			//	cout<<line[i].l<<' '<<line[i].r<<endl;
			}
			init();
			build(1,0,tot);
			sort(line+1,line+1+m,cmp);
			int w=1;
			for(int i=1;i<=tot;i++)
			{
				dp[i]=dp[i-1];
				int pos=upper_bound(dy,dy+1+tot,dy[i]-k)-dy,nx=(dy[i]-dy[i-1]==1)?i-2:i-1;
				//cout<<pos<<' '; 
				c(1,0,tot,i,i,dp[nx]+Q[i]);
			//	cout<<Q[i]<<endl;
				while(w<=m&&line[w].r==dy[i])
				{
					c(1,0,tot,0,mp[line[w].l],line[w].val);					
					w++;
				}
				dp[i]=max(dp[i],qr(1,0,tot,pos,i)-(dy[i]+1)*d);
			//	cout<<dp[i]<<' ';
			}
			cout<<dp[tot]<<'\n';
		}
		return 0;
	}
}

int main()
{
//	freopen("run2.in","r",stdin);
//	freopen("wa.out","w",stdout);
	acac::main();
	return 0;
}
/*
1 1
10 5 8 2
5 5 9
9 5 8
5 3 5
6 5 7
2 1 5
out:
14
*/

萌新补题时被狠狠卡常了QWQ

2024/11/5 22:24
加载中...