求助NOIP T4卡常
  • 板块学术版
  • 楼主DiaоsiKreator
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/11/22 20:30
  • 上次更新2023/11/23 19:01:33
查看原帖
求助NOIP T4卡常
137242
DiaоsiKreator楼主2023/11/22 20:30

跑的超级慢,本地大样例8s,洛谷评测机56pts

#include<bits/stdc++.h>
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
using namespace std;
const ll N=1000010,INF=1e9+7,INFF=0x3f3f3f3f3f3f3f3f;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline void swap(ll &x,ll &y){x^=y^=x^=y;}
ll c,t,n,m,k,d,tot,ans,cnt;
vector<ll> s;
vector<pair<ll,ll> > h[N];
unordered_map<ll,ll> ls,rs;
inline ll read(){
    char c=getchar();ll x=0,f=1;
    while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
    while('0'<=c&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
struct SegmentTree{
	ll l,r;
	ll dat,tag;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define dat(x) tree[x].dat
	#define tag(x) tree[x].tag
}tree[N<<3];
void pushup(ll p){
	dat(p)=max(dat(l(p)),dat(r(p)));
}
ll build(){
	ll p=++cnt;
	l(p)=r(p)=0;
	dat(p)=tag(p)=0;
	return p;
}
void pushdown(ll p){
	if(!tag(p))return;
	if(l(p))dat(l(p))+=tag(p),tag(l(p))+=tag(p);
	if(r(p))dat(r(p))+=tag(p),tag(r(p))+=tag(p);
	tag(p)=0;
}
void insert(ll p,ll l,ll r,ll pos,ll val){
	if(l==r){dat(p)+=val;return;}
	ll mid=(l+r)>>1;
	pushdown(p);
	if(pos<=mid){
		if(!l(p))l(p)=build();
		insert(l(p),l,mid,pos,val);
	}
	else{
		if(!r(p))r(p)=build();
		insert(r(p),mid+1,r,pos,val);
	}
	pushup(p);
}
void change(ll p,ll l,ll r,ll L,ll R,ll val){
	if(L>R)return;
	if(L<=l&&r<=R){
		dat(p)+=val;tag(p)+=val;
		return;
	}
	ll mid=(l+r)>>1;
	pushdown(p);
	if(L<=mid&&l(p))change(l(p),l,mid,L,R,val);
	if(R>mid&&r(p))change(r(p),mid+1,r,L,R,val);
	pushup(p);
}
ll query(ll p,ll l,ll r,ll L,ll R){
	if(L>R)return -INFF;
	if(L<=l&&r<=R)return dat(p);
	ll mid=(l+r)>>1,val=-INFF;
	pushdown(p);
	if(L<=mid&&l(p))val=max(val,query(l(p),l,mid,L,R));
	if(R>mid&&r(p))val=max(val,query(r(p),mid+1,r,L,R));
	return val;
}
void add(int x){
	if(x<=0)return;
	if(!rs[x])rs[x]=++tot,s.push_back(x);
}
int main(){
	c=read();t=read();
	while(t--){
		ans=cnt=tot=0;dat(0)=-INFF;
		s.clear();ls.clear();rs.clear();
		n=read();m=read();k=read();d=read();
		for(ll i=1;i<=m;i++){
			ll x=read(),y=read(),v=read();
			if(y<=k){
				ls[x-y+1]=1;
				add(x-1);add(x);add(x+1);
				add(x-y);add(x-y+1);add(x-y+2);
				h[rs[x]].push_back(make_pair(x-y+1,v));
			}
		}
		build();
		insert(1,0,n,0,-d*n);
		sort(s.begin(),s.end());
		for(ll i=0;i<(ll)s.size();i++){
			ll r=s[i],lst=ans;
			insert(1,0,n,r,-d*(n-r));
			for(pair<ll,ll> z:h[rs[r]])
				change(1,0,n,0,z.fi-1,z.se);
			ans=max(ans,query(1,0,n,max(0,r-k),r-1)+d*(n-r));
			insert(1,0,n,r,ls[r+1]?lst:ans);
		}
		printf("%lld\n",ans);
		for(int i=1;i<=tot;i++)h[i].clear();
	}
	return 0;
}
2023/11/22 20:30
加载中...