为啥我的代码开了O2 100pts,不开是0pts?
查看原帖
为啥我的代码开了O2 100pts,不开是0pts?
197901
XKJie楼主2022/11/13 20:47
#include <bits/stdc++.h>
#define N 200010
#define int long long
using namespace std;
int n,cnt,s,w;
int x[N<<1],y[N<<1],cntx,cnty;
int ans;
struct node
{
    double x1,y1,x2,y2;
    int val;
    #define x1(x) rec[x].x1
    #define x2(x) rec[x].x2
    #define y1(x) rec[x].y1
    #define y2(x) rec[x].y2
    #define val(x) rec[x].val
}rec[N];
struct node2
{
    int x,y1,y2,val;
}seg[N<<1];
struct st
{
    int l,r,mx,tag;
    #define l(x) tree[x].l
    #define r(x) tree[x].r
    #define mx(x) tree[x].mx
    #define tag(x) tree[x].tag
}tree[N<<4];
bool cmp(node2 a,node2 b)
{
    return a.x<b.x;
}
void build(int p,int l,int r)
{
    l(p)=l;r(p)=r;
    if (l==r)
        return;
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
}
void pushdown(int p)
{
    mx(p<<1)+=tag(p);
    mx(p<<1|1)+=tag(p);
    tag(p<<1)+=tag(p);
    tag(p<<1|1)+=tag(p);
    tag(p)=0;
}
void add(int p,int l,int r,int val)
{
    if ((l<=l(p)) && (r(p)<=r))
    {
        mx(p)+=val;
        tag(p)+=val;
        return;
    }
    pushdown(p);
    int mid=(l(p)+r(p))>>1;
    if (l<=mid) add(p<<1,l,r,val);
    if (mid<r) add(p<<1|1,l,r,val);
    mx(p)=max(mx(p<<1),mx(p<<1|1));
}
int query(int p,int l,int r)
{
    if ((l<=l(p)) && (r(p)<=r))
        return mx(p);
    int mid=(l(p)+r(p))>>1;
    int mx=0;
    if (l<=mid) mx=max(query(p<<1,l,r),mx);
    if (mid<r) mx=max(query(p<<1|1,l,r),mx);
    return mx;
}
signed main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%lld %lld %lld",&n,&s,&w);
        s++;
        for (int i=1;i<=n;i++)
        {
            int a,b,vl;
            scanf("%lld %lld %lld",&a,&b,&vl);
            x1(i)=a;
            x2(i)=a+s-1;
            y1(i)=b;
            y2(i)=b+w-1;
            val(i)=vl;
            x[++cntx]=x1(i);
            x[++cntx]=x2(i);
            y[++cnty]=y1(i);
            y[++cnty]=y2(i);
        }
        sort(x+1,x+cntx+1);
        sort(y+1,y+cnty+1);
        cntx=unique(x+1,x+cntx+1)-(x+1);
        cnty=unique(y+1,y+cnty+1)-(y+1);
        for (int i=1;i<=n;i++)
        {
            x1(i)=lower_bound(x+1,x+cntx+1,x1(i))-x;
            x2(i)=lower_bound(x+1,x+cntx+1,x2(i))-x;
            y1(i)=lower_bound(y+1,y+cnty+1,y1(i))-y;
            y2(i)=lower_bound(y+1,y+cnty+1,y2(i))-y;
            seg[++cnt].x=x1(i);
            seg[cnt].y1=y1(i);
            seg[cnt].y2=y2(i);
            seg[cnt].val=val(i);
            seg[++cnt].x=x2(i);
            seg[cnt].y1=y1(i);
            seg[cnt].y2=y2(i);
            seg[cnt].val=-val(i);
        }
        sort(seg+1,seg+cnt+1,cmp);
        int q=1;
        build(1,1,cnty);
        while(q<=cnt)
        {
            add(1,seg[q].y1,seg[q].y2,seg[q].val);
            while (seg[q+1].x==seg[q].x)
            {
                q++;
                add(1,seg[q].y1,seg[q].y2,seg[q].val);
            }
            ans=max(ans,query(1,1,cnty));
            q++;
        }
        printf("%lld\n",ans);
        cnt=cntx=cnty=ans=0;
        for (int i=1;i<=(n<<3);i++)
            l(i)=r(i)=tag(i)=mx(i)=0;
    }
    //system("pause");
    return 0;
}

开了O2的提交记录
没开的
不知道为啥,就很谜

2022/11/13 20:47
加载中...