RE求调,谢谢!!!
查看原帖
RE求调,谢谢!!!
577987
caizhetong楼主2023/7/20 15:47
#include<bits/stdc++.h>
using namespace std;
long long t,n,tot,num,cnt;
long long w[1000010],y[1000010];
set<long long> stl,str;
struct line{
    long long l,r,c,id,ans;
}z[1000010];
struct tree{
    long long num,tag;
}tre[1000010];
bool px(line a,line b)
{
    if(a.c<b.c) return true;
    if(a.c>b.c) return false;
    return false;
}
bool px1(line a,line b)
{
    if(a.id<b.id) return true;
    if(a.id>b.id) return false;
    return false;
}
void pushup(long long x)
{
    tre[x].num=tre[x<<1].num+tre[x<<1|1].num;
}
void pushdown(long long x,long long l,long long r)
{
    long long mid=(l+r)/2;
    tre[x<<1].num+=(mid-l+1)*tre[x].tag;
    tre[x<<1|1].num+=(r-mid)*tre[x].tag;
    tre[x<<1].tag+=tre[x].tag;
    tre[x<<1|1].tag+=tre[x].tag;
    tre[x].tag=0;
}
void build(long long x,long long l,long long r)
{
    //cout<<l<<" "<<r<<"\n";
    if(l==r)
    {
        tre[x].num=0;
        tre[x].tag=0;
        return;
    }
    int mid=(l+r)/2;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
}
void update(long long x,long long l,long long r,long long ql,long long qr,long long k)
{
    //cout<<l<<" "<<r<<" "<<ql<<" "<<qr<<"\n";

    if(ql<=w[l]&&w[r]<=qr)
    {
        tre[x].num+=(r-l+1)*k;
        tre[x].tag+=k;
        return;
    }
    pushdown(x,l,r);
    int mid=(l+r)/2;
    if(ql<=w[mid]) update(x<<1,l,mid,ql,qr,k);
    if(qr>=w[mid+1]) update(x<<1|1,mid+1,r,ql,qr,k);
    //cout<<(x<<1|1)<<" "<<w[mid+1]<<" "<<w[r]<<" "<<ql<<" "<<qr<<" "<<k<<"\n";
    pushup(x);
}
long long query(long long x,long long l,long long r,long long ql,long long qr)
{
    //cout<<l<<" "<<r<<" "<<ql<<" "<<qr<<"\n";
    if(ql<=w[l]&&w[r]<=qr)
    {
        return tre[x].num;
    }
    pushdown(x,l,r);
    int mid=(l+r)/2,ans=0;
    if(ql<=w[mid]) ans+=query(x<<1,l,mid,ql,qr);
    if(w[mid+1]<=qr) ans+=query(x<<1|1,mid+1,r,ql,qr);
    return ans;
}
signed main()
{
    //freopen("ti.in","r",stdin);
    ios::sync_with_stdio(0);

    cin>>t;
    while(t--)
    {
        cin>>n;
        tot=0;
        for(int i=1;i<=n;i++)
        {
            cin>>z[i].l;
            cin>>z[i].r;
            cin>>z[i].c;
            //cout<<1<<" "<<1<<" "<<1<<"\n";
            tot++;y[tot]=z[i].l;tot++;y[tot]=z[i].r;
            stl.insert(z[i].l);
            str.insert(z[i].r);
            z[i].id=i;

        }
        sort(y+1,y+1+tot);
        num=0;cnt=0;
        while(num<tot)
        {
            num++;
            cnt++;
            w[cnt]=y[num];
            while(num+1<=tot&&y[num+1]==y[num]) num++;
        }
        build(1,1,cnt);

        for(int i=1;i<=n;i++)
        {
            update(1,1,n,z[i].l,z[i].r,1);
            update(1,1,n,z[i].l,z[i].r,1);
        }
        sort(z+1,z+1+n,px);
        int i=1;
        while(i<=n)
        {
            num=0;
            while(i+num+1<=n&&z[i+num+1].c==z[i+num].c)
            {
                num++;
                update(1,1,cnt,z[i+num].l,z[i+num].r,-1);
                stl.erase(z[i+num].l);
                str.erase(z[i+num].r);
            }
            for(int j=i;j<=i+num;j++)
            {
                if(query(1,1,cnt,z[j].l,z[j].r)!=0)
                {
                    z[j].ans=0;
                    continue;
                }
                auto a=stl.lower_bound(z[j].r);
                auto b=str.lower_bound(z[j].l);
                z[j].ans=min((*a)-z[j].r,z[j].l-(*(--b)));
            }
            i++;
            i+=num;
        }
        sort(z+1,z+1+n,px1);
        for(int i=1;i<=n;i++) cout<<z[i].ans<<" ";
        cout<<"\n";
    }

    //fclose(stdin);
	return 0;
}

2023/7/20 15:47
加载中...