题解:P11830 [省选联考 2025] 幸运数字(民间数据)
考场思路,大样例过了,不知道对不对。
考虑对于一个数
首先肯定要有区间包含它,否则
然后设如果有
有一个贪心策略是如果
现在问题变成
考虑固定
现在不固定
又因为
对于
到目前为止期望得分
我们的瓶颈在于算出
所以我们可以对由区间左右端点划分而成的一段进行计算,用前缀和算出
需要排序+离散化,时间复杂度
可以通过民间数据的代码:
int n,ln,cf,as,l1[N],r1[N],l2[N],r2[N],dc[N*2],f[N*2];
ll ca,cb,cc,cd,ce,a[N*2],b[N*2],c[N*2],d[N*2],e[N*2];
void QwQ() {
n=rd();
for(int i=1;i<=ln;i++) a[i]=b[i]=c[i]=d[i]=e[i]=f[i]=0;
ln=ca=cb=cc=cd=ce=cf=as=0;
for(int i=1;i<=n;i++)
l1[i]=rd(),r1[i]=rd(),l2[i]=rd(),r2[i]=rd(),
dc[++ln]=l2[i],dc[++ln]=r2[i]+1;
sort(dc+1,dc+1+ln),ln=unique(dc+1,dc+1+ln)-dc-1;
for(int i=1,x,y;i<=n;i++)
x=lb(dc+1,dc+1+ln,l2[i])-dc,y=lb(dc+1,dc+1+ln,r2[i]+1)-dc,
a[x]+=r1[i],a[y]-=r1[i],
b[y]+=l1[i],c[y]+=r1[i],
d[1]+=l1[i],d[x]-=l1[i],
e[1]+=r1[i],e[x]-=r1[i],
f[x]++,f[y]--;
for(int i=1;i<ln;i++) {
ca+=a[i],cb+=b[i],cc+=c[i],cd+=d[i],ce+=e[i],cf+=f[i];
if(cf&&max(cb-ca+1,cd)<=min(cc+ca,ce)) as+=dc[i+1]-dc[i];
}
wr(as,"\n");
}