TLE on #14
查看原帖
TLE on #14
120947
PurslaneM2GA楼主2021/12/17 21:49

HELP !

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline bool id(const char ch) {
	return ch>='0'&&ch<='9';
}
inline int read(void) {
	int s=0,f=0;
	char ch=getchar();
	while(!id(ch)) f=(ch=='-'),ch=getchar();
	while(id(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return f?-s:s;
}
const int MAXN=120000+10,MAXK=120000+10,MAXW=120000+10;
int n,K,q,idx,TME,dp[MAXN],v[MAXK],w[MAXK],frm[MAXK],to[MAXK],ans[MAXN],p[MAXN];
vector<pair<int,int> >node[MAXK];
void update(const int k,const int l,const int r,const int x,const int y,const int v,const int w) {
	if(x>y) return;
	if(x<=l&&r<=y) {
		node[k].push_back(make_pair(v,w));
		return;	
	}
	int mid=l+r>>1;
	if(x<=mid) update(k<<1,l,mid,x,y,v,w);
	if(y>mid) update(k<<1|1,mid+1,r,x,y,v,w);
	return;
}
void solve(const int k,const int l,const int r) {
	int TMEp[MAXW]={0};
	for(int i=0;i<node[k].size();i++) {
		int v=node[k][i].first,w=node[k][i].second;
		for(int j=K;j>=w;j--) dp[j]=max(dp[j],dp[j-w]+v);
	}
	if(l==r) {
//		printf("?%d\n",l);
//		for(int i=1;i<=K;i++) printf("%d ",dp[i]);
//		printf("\n");
		for(int i=1;i<=K;i++) ans[l]+=dp[i]*p[i-1],ans[l]%=(1000000000+7);
		return;
	}
	int mid=l+r>>1;
	memcpy(TMEp,dp,sizeof(TMEp));
	solve(k<<1,l,mid);
	memcpy(dp,TMEp,sizeof(TMEp));
	solve(k<<1|1,mid+1,r);
	return;
}
signed main() {
	n=read(),K=read(),TME=1;
	p[0]=1;
	for(int i=1;i<=K;i++) p[i]=p[i-1]*(10000000+19)%(1000000000+7);
	for(int i=1;i<=n;i++) v[++idx]=read(),w[idx]=read(),frm[idx]=1;
	q=read();
	for(int i=2,op,x;i<=q+1;i++) {
		op=read();
		if(op==1) v[++idx]=read(),w[idx]=read(),frm[idx]=TME;
		if(op==2) x=read(),to[x]=TME;
		if(op==3) TME++;
	}
	for(int i=1;i<=idx;i++) if(to[i]==0) to[i]=TME;
	for(int i=1;i<=idx;i++) update(1,1,TME,frm[i]+1,to[i],v[i],w[i]);
	solve(1,1,TME);
	for(int i=2;i<=TME;i++) printf("%lld\n",ans[i]);
	return 0;
}
2021/12/17 21:49
加载中...