1 条题解

  • 0
    @ 2025-8-24 23:10:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ran_qwq
    debug 深入思考 只靠样例与自己!

    搬运于2025-08-24 23:10:34,当前版本为作者最后更新于2025-03-01 17:39:32,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    考场思路,大样例过了,不知道对不对。

    考虑对于一个数 xx,它能成为中位数需要满足什么条件。

    首先肯定要有区间包含它,否则 xx 连出现一次都不可能。

    然后设如果有 aa 个数 <x<xbb 个数 =x=xcc 个数 >x>x,那么必须满足以下两个不等式:

    • a+bca+b\ge c。如果 a+b<ca+b<c,第 m+12\lfloor\dfrac{m+1}2\rfloor 个数 >x>x
    • a<b+ca<b+c。如果 ab+ca\ge b+c,第 m+12\lfloor\dfrac{m+1}2\rfloor 个数 <x<x

    有一个贪心策略是如果 li,2xri,2l_{i,2}\le x\le r_{i,2},即可以放 xx,就尽量放 ri,1r_{i,1}xx。因为把非 xx 改成 xxaacc 减小而 bb 增大,显然 xx 成为中位数可能性变大。而且 xx 的个数越多,aacc 不变而 bb 越大,两个不等式中要求大的那部分,即包含 bb 的那部分变大,也是更优的。

    现在问题变成 aacc 取多少。受到个数的限制,aacc 都有个最小值和最大值,aa 的取值范围为 [l,r][l,r]cc 的取值范围为 [L,R][L,R]

    考虑固定 aa,求 cc 的取值范围。第一个不等式化为 ca+bc\le a+b,第二个不等式化为 c>abc>a-b。联立可得 c[ab+1,a+b]c\in[a-b+1,a+b]

    现在不固定 aaa=la=l 时,cc 最小为 lb+1l-b+1a=ra=r 时,cc 最大为 r+br+b。所以 c[lb+1,r+b]c\in[l-b+1,r+b]

    又因为 cc 的取值范围为 [L,R][L,R],所以 c[max(lb+1,L),min(r+b,R)]c\in[\max(l-b+1,L),\min(r+b,R)]

    对于 xx,求出 b,l,r,L,Rb,l,r,L,R 之后,若 cc 的取值范围非空,即 max(lb+1,L)min(r+b,R)\max(l-b+1,L)\le\min(r+b,R),则 xx 可以作为中位数。b,l,r,L,Rb,l,r,L,R 可以枚举每个区间,判断其与 xx 的关系来求。

    到目前为止期望得分 5050

    我们的瓶颈在于算出 b,l,r,L,Rb,l,r,L,R,考虑用差分前缀和优化这一过程。具体来讲,一个区间 [li,2,ri,2][l_{i,2},r_{i,2}],会对 [li,2,ri,2][l_{i,2},r_{i,2}]bb 产生 ri,1r_{i,1} 的贡献,对 (ri,2,)(r_{i,2},\infty)ll 产生 li,1l_{i,1} 的贡献,对 (ri,2,)(r_{i,2},\infty)rr 产生 ri,1r_{i,1} 的贡献,对 [1,li,2)[1,l_{i,2})LL 产生 li,1l_{i,1} 的贡献,对 [1,li,2)[1,l_{i,2})RR 产生 ri,1r_{i,1} 的贡献。而 xx 能否成为中位数只与 b,l,r,L,Rb,l,r,L,R 有关,即如果没有跨过任何区间,不改变 xx 能否成为中位数。

    所以我们可以对由区间左右端点划分而成的一段进行计算,用前缀和算出 b,l,r,L,Rb,l,r,L,R 即可。

    需要排序+离散化,时间复杂度 O(nlogn)O(n\log n)

    可以通过民间数据的代码:

    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");
    }
    
    • 1

    信息

    ID
    11614
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者