1 条题解
-
0
自动搬运
来自洛谷,原作者为

ran_qwq
debug 深入思考 只靠样例与自己!搬运于
2025-08-24 23:10:34,当前版本为作者最后更新于2025-03-01 17:39:32,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
考场思路,大样例过了,不知道对不对。
考虑对于一个数 ,它能成为中位数需要满足什么条件。
首先肯定要有区间包含它,否则 连出现一次都不可能。
然后设如果有 个数 , 个数 , 个数 ,那么必须满足以下两个不等式:
- 。如果 ,第 个数 。
- 。如果 ,第 个数 。
有一个贪心策略是如果 ,即可以放 ,就尽量放 个 。因为把非 改成 , 和 减小而 增大,显然 成为中位数可能性变大。而且 的个数越多, 和 不变而 越大,两个不等式中要求大的那部分,即包含 的那部分变大,也是更优的。
现在问题变成 和 取多少。受到个数的限制, 和 都有个最小值和最大值, 的取值范围为 , 的取值范围为 。
考虑固定 ,求 的取值范围。第一个不等式化为 ,第二个不等式化为 。联立可得 。
现在不固定 。 时, 最小为 。 时, 最大为 。所以 。
又因为 的取值范围为 ,所以 。
对于 ,求出 之后,若 的取值范围非空,即 ,则 可以作为中位数。 可以枚举每个区间,判断其与 的关系来求。
到目前为止期望得分 。
我们的瓶颈在于算出 ,考虑用差分前缀和优化这一过程。具体来讲,一个区间 ,会对 的 产生 的贡献,对 的 产生 的贡献,对 的 产生 的贡献,对 的 产生 的贡献,对 的 产生 的贡献。而 能否成为中位数只与 有关,即如果没有跨过任何区间,不改变 能否成为中位数。
所以我们可以对由区间左右端点划分而成的一段进行计算,用前缀和算出 即可。
需要排序+离散化,时间复杂度 。
可以通过民间数据的代码:
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
- 上传者