TLE4
查看原帖
TLE4
1122530
elpsconr楼主2025/1/6 02:38

求优化,tle了四个点,我把效用比我当前位置低还,比我花钱多的位置删去,还是TLE了,不知道该怎么优化了

/*
  卫风·芄兰
芄兰之支,童子佩觿.
虽则佩觿,能不我知?
容兮遂兮,垂带悸兮.
芄兰之叶,童子佩韘.
虽则佩韘,能不我甲?
容兮遂兮,垂带悸兮.
*/
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define tul array<__int128,3>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define bp(x) __builtin_popcountll(x)
#define ctz(x) __builtin_ctzll(x)
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define lc (rt<<1)
#define rc (rt<<1|1)
mt19937_64 rnd(time(0));
const int N=5e5+5,yyx=998244353;
vector<int> to[N];
int n,x,d;
int dp[N];
inline int mod(int x){
  return (x%yyx+yyx)%yyx;
}
inline int cmin(int &x,int y){
  return x>y?x=y,1:0;
}
inline int cmax(int &x,int y){
  return x<y?x=y,1:0;
}
struct node{
    int p,u;
    bool operator< (const node &w)const{
        if(p==w.p) return u>w.u;
        return p<w.p;
    }
};
vector<node> e[N];
int ndp[N][30],f[N][30];
PII v[N];
struct ST{
  vector<int> lg;
  ST(int n){
    rep(i,0,n) rep(j,0,29) ndp[i][j]=f[i][j]=0;
    lg.resize(n+1,0);
    for(int i=1;i<=n;++i) ndp[i][0]=v[i].first,f[i][0]=v[i].first;
    for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
    for(int j=1;j<=lg[n];++j){
      for(int i=1;i+(1<<j)-1<=n;++i){
        ndp[i][j]=max(ndp[i][j-1],ndp[i+(1<<(j-1))][j-1]);
      }
    }
    for(int j=1;j<=lg[n];++j){
      for(int i=1;i+(1<<j)-1<=n;++i){
        f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
      }
    }
  }
  int getmax(int l,int r){
    if(l>r) return 0;
    int k=lg[r-l+1];
    return max(ndp[l][k],ndp[r-(1<<k)+1][k]);
  }
  int getmin(int l,int r){
    if(l>r) return 0;
    int k=lg[r-l+1];
    return min(f[l][k],f[r-(1<<k)+1][k]);
  }
};
inline void solve(){
  cin>>n>>x>>d;
  rep(i,1,n){
    int p,u,c;cin>>p>>u>>c;
    e[c].push_back({p,u});
  }
  rep(i,1,n) sort(all(e[i]));
  int ans=0;
  rep(i,1,n){
    int s=e[i].size();
    vector<int> ma,pp;
    vector<int> ff(x+1,0);
    rep(k,1,s){
        auto [p,u]=e[i][k-1];
        rep_(j,x,0){
            if(j>=p) cmax(ff[j],ff[j-p]+u);
        }
    }
    set<PII> sst,g;
    map<int,int> mp;
    rep(j,0,x){
        if(ff[j]>0&&!mp[ff[j]]) sst.insert({ff[j],j}),mp[ff[j]]=1; 
    }
    int cnt=0;
    for(auto [u,p]:sst) v[++cnt]={p,u};
    v[++cnt]={2e14,2e14};
    ST st(cnt);
    rep(m,1,cnt-1){
      auto [p,u]=v[m];
      int xx=st.getmin(min(m+1,cnt),cnt);
      //cout<<p<<" "<<xx<<endl;
      if(xx>p) g.insert({p,u});//,cout<<p<<" jj "<<u<<endl;
    }
    rep_(j,x,0){
        for(auto [p,u]:g){
            if(j>=p) cmax(dp[j],dp[j-p]+u+d);
            //cout<<pp[k]<<" "<<ma[k]<<" "<<k<<endl;      
        }
        cmax(ans,dp[j]);
    }
  }
  cout<<ans<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}
2025/1/6 02:38
加载中...