mxqz NOIPT4 卡常
  • 板块题目总版
  • 楼主樱雪喵>w<
  • 当前回复38
  • 已保存回复39
  • 发布时间2023/11/22 17:45
  • 上次更新2023/11/22 20:15:16
查看原帖
mxqz NOIPT4 卡常
234074
樱雪喵>w<楼主2023/11/22 17:45

本地跑大样例在 1.8s 左右但一交就 T,试图去掉 define int long long 没啥作用,求助是哪里常数写大了 /kk

#include<bits/stdc++.h>
#define il inline
using namespace std;
il long long read()
{
    long long xr=0,F=1; char cr;
    while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
    while(cr>='0'&&cr<='9')
        xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
    return xr*F;
}
#define int long long
const int N=2e5+5;
int c,T,n,m,k,d;
struct node{int l,r,x,y,w;} a[N];
int b[N],tot,vis[N],f[N],Vs[N];
vector<int> R[N],L[N];
struct segtree
{
    int tr[N<<2],lz[N<<2];
    #define ls (x<<1)
    #define rs (x<<1|1)
    #define mid (l+r>>1)
    void build(int x,int l,int r)
    {
        tr[x]=lz[x]=0;
        if(l==r) return;
        build(ls,l,mid),build(rs,mid+1,r);
    }
    il void pushdown(int x)
    {
        lz[ls]+=lz[x],lz[rs]+=lz[x];
        tr[ls]+=lz[x],tr[rs]+=lz[x];
        lz[x]=0;
    }
    void add(int x,int l,int r,int ml,int mr,int k)
    {
        if(ml>mr) return;
        if(l==ml&&r==mr) {tr[x]+=k,lz[x]+=k;return;}
        pushdown(x);
        if(mr<=mid) add(ls,l,mid,ml,mr,k);
        else if(ml>mid) add(rs,mid+1,r,ml,mr,k);
        else add(ls,l,mid,ml,mid,k),add(rs,mid+1,r,mid+1,mr,k);
        tr[x]=max(tr[ls],tr[rs]);
    }
    int getmx(int x,int l,int r,int ml,int mr)
    {
        if(l==ml&&r==mr) return tr[x];
        pushdown(x);
        if(mr<=mid) return getmx(ls,l,mid,ml,mr);
        else if(ml>mid) return getmx(rs,mid+1,r,ml,mr);
        else return max(getmx(ls,l,mid,ml,mid),getmx(rs,mid+1,r,mid+1,mr));
    }
    int query(int x,int l,int r,int pos)
    {
        if(l==r) return tr[x];
        pushdown(x);
        if(pos<=mid) return query(ls,l,mid,pos);
        else return query(rs,mid+1,r,pos);
    }
}tr,dt;
signed main()
{
    c=read(),T=read();
    while(T--)
    {
        tot=0;
        n=read(),m=read(),k=read(),d=read();
        for(int i=1;i<=m;i++)
        {
            int x=read(),y=read(); a[i].w=read();
            a[i].r=x,a[i].l=x-y+1;
            b[++tot]=a[i].r,b[++tot]=a[i].l;
        }
        sort(b+1,b+tot+1); tot=unique(b+1,b+tot+1)-b-1;
        tr.build(1,0,tot),dt.build(1,0,tot);
        for(int i=1;i<=m;i++)
        {
            a[i].x=lower_bound(b+1,b+tot+1,a[i].l)-b;
            a[i].y=lower_bound(b+1,b+tot+1,a[i].r)-b;
            if(a[i].r-a[i].l+1<=k) R[a[i].y].push_back(i),L[a[i].x].push_back(i);
        }
        tr.add(1,0,tot,0,0,-d),dt.add(1,0,tot,0,0,1);
        for(int i=1;i<=tot;i++)
        {
            for(auto x:R[i])
            {
                tr.add(1,0,tot,0,a[x].x-1,a[x].w);
            }
            int pos=lower_bound(b+1,b+tot+1,b[i]-k+1)-b-2;
            for(int j=pos+1;j;j--) 
            {
                if(Vs[j]) break; Vs[j]=1;
                for(auto x:L[j]) 
                {
                    tr.add(1,0,tot,0,a[x].x-1,-a[x].w);
                }
            }
            while(pos>=0&&!vis[pos]) 
            {
                vis[pos]=1;
                
                int x=dt.query(1,0,tot,pos);
                int lst=pos+1;
                int len=b[i]-b[lst]+1;
                tr.add(1,0,tot,pos,pos,d*x),tr.add(1,0,tot,pos,pos,-d*len);
                dt.add(1,0,tot,pos,pos,len-x);
                pos--;
            }
            pos=lower_bound(b+1,b+tot+1,b[i]-k+1)-b-1;
            tr.add(1,0,tot,pos,i-2,-d*(b[i]-b[i-1])),dt.add(1,0,tot,pos,i-2,b[i]-b[i-1]);
            f[i]=max(tr.getmx(1,0,tot,0,i-1),f[i-1]);
            dt.add(1,0,tot,i,i,1),tr.add(1,0,tot,i,i,b[i]+1==b[i+1]?f[i-1]-d:f[i]-d);
        }
        printf("%lld\n",f[tot]);

        for(int i=0;i<=tot;i++) L[i].clear(),R[i].clear(),vis[i]=0;
        for(int i=0;i<=tot;i++) f[i]=0,Vs[i]=0;
    }
    return 0;
}
2023/11/22 17:45
加载中...