社区讨论
整体二分爆零,似乎无法自查
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 条回复,欢迎继续交流。
正在加载回复...