社区讨论

整体二分爆零,似乎无法自查

P3527[POI 2011] MET-Meteors参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7wdgfd
此快照首次捕获于
2025/11/21 04:42
4 个月前
此快照最后确认于
2025/11/21 04:42
4 个月前
查看原帖
CPP
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define N 310000
#define inf 1000000007
using namespace std;
long long n,m,k,tg[N],bl[N],ll[N],rr[N];
long long id[N],lc[N],rc[N],cntl,cntr;
long long now=0;
long long ans[N];
long long val[N],cnt[N],tr[N];
vector <long long> son[N];
long long Read()
{
    long long x=0,f=1;
    char c=getchar();
    while (c<'0'||c>'9') 
    {
        if (c=='-') f=-1;
        c=getchar();
    }
    while (c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return f*x;
}
long long lowbit(long long x)
{
    return x&-x;
}
long long Query(long long x)
{
    long long ret=0;
    for (long long i=x;i;i-=lowbit(i)) ret+=tr[i];
    return ret;
}
void Update(long long x,long long v)
{
    for (long long i=x;i<=m;i+=lowbit(i)) tr[i]+=v;
    return;
}
void Modify(long long lll,long long rrr,long long v)
{
    if (lll<=rrr) Update(lll,v),Update(rrr+1,-v);
    else
    {
        Update(lll,v);
        Update(m+1,-v);
        Update(1,v);
        Update(rrr+1,-v);
    }
    return;
}
void solve(long long ql,long long qr,long long l,long long r)
{
    if (ql>qr||l>r) return;
    if (ql==qr)
    {
        for (long long i=l;i<=r;i++) ans[id[i]]=ql;
        return;
    }
    long long mid=(ql+qr)>>1;
    while (now>mid) Modify(ll[now],rr[now],-val[now]),now--;
    while (now<mid) now++,Modify(ll[now],rr[now],val[now]);
    for (long long i=l;i<=r;i++)
    {
        cnt[id[i]]=0;
        long long len=son[id[i]].size();
        for (long long j=0;j<len;j++) 
        {
            cnt[id[i]]+=Query(son[id[i]][j]);
            if (cnt[id[i]]>=tg[id[i]]) break;
        }
    }
    cntl=cntr=0;
    for (long long i=l;i<=r;i++)
    {
    	if (cnt[id[i]]>=tg[id[i]]) lc[++cntl]=id[i];
        else rc[++cntr]=id[i]; 
    }	
    for (long long i=1;i<=cntl;i++) id[l+i-1]=lc[i];
    for (long long i=1;i<=cntr;i++) id[l+cntl+i-1]=rc[i];
    solve(ql,mid,l,l+cntl-1);
    solve(mid+1,qr,l+cntl,r);
    return;
}
int main()
{
	freopen("testdata.in","r",stdin);
    n=Read(),m=Read();
    for (long long i=1;i<=m;i++) bl[i]=Read();
    for (long long i=1;i<=n;i++) tg[i]=Read();
    k=Read(),k++;
    for (long long i=1;i<k;i++) ll[i]=Read(),rr[i]=Read(),val[i]=Read();
    for (long long i=1;i<=m;i++) son[bl[i]].push_back(i);
    for (long long i=1;i<=n;i++) id[i]=i;
    ll[k]=1,rr[k]=m,val[k]=inf;
    solve(1,k,1,n);
    for (long long i=1;i<=n;i++)
        if (ans[i]==k) printf("NIE\n");
        else printf("%lld\n",ans[i]);
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...