NOIP 模拟 $21\; \rm Median$
题解 \(by\;zj\varphi\)
对于这个序列,可以近似得把它看成随机的,而对于随机数列,每个数的分布都是均匀的,所以中位数的变化可以看作是常数
那么可以维护一个指向中位数的指针,同时维护有多少个小于等于它的数。
让这个指针跳值域,用有多少个小于等于它的数来判断
对于 \(k\) 为偶数的情况,维护两个指针即可
注意:素数要卡着筛,而且用 \(bitset\) 必须开 \(O2\)
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
    template<typename T>inline void read(T &x) {
        ri f=1;x=0;register char ch=gc();
        while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        x=f?x:-x;
    }
}
using IO::read;
namespace nanfeng{
    #define FI FILE *IN
    #define FO FILE *OUT
    template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
    template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
    typedef long long ll;
    static const int N=1.8e8+7,M=1e7+7;
    int prim[M],s[M],s2[M],T[M<<1],lw,lw1,cnt,n,k,w,sum,mid,mid1,hk;
    ll ans;
    bitset<N> vis;
    void Getprime() {
        ri n=N-7;
        for (ri i(2);i<=n;p(i)) {
            if (!vis[i]) vis[prim[p(cnt)]=i]=1;
            for (ri j(1);j<=cnt&&prim[j]*i<=n;p(j)) {
                vis[i*prim[j]]=1;
                if (!(i%prim[j])) break;
            }
        }
    }
    inline void mv1() {
        while(lw<=hk) {
            lw+=T[p(mid)];
            if (lw>hk) break;
        }
        while(lw-T[mid]>hk) lw-=T[mid--];
    }
    inline void mv2() {
        while(lw<=hk-1) {
            lw+=T[p(mid)];
            if (lw>=hk) break;
        }
        while(lw-T[mid]>=hk) lw-=T[mid--];
        while(lw1<=hk) {
            lw1+=T[p(mid1)];
            if (lw1>hk) break;
        }
        while(lw1-T[mid1]>hk) lw1-=T[mid1--];
    }
    inline int main() {
        // FI=freopen("nanfeng.in","r",stdin);
        // FO=freopen("nanfeng.out","w",stdout);
        Getprime();
        read(n),read(k),read(w);
        hk=k>>1;
        for (ri i(1);i<=n;p(i)) s[i]=(ll)prim[i]*i%w;
        for (ri i(1);i<=n;p(i)) s2[i]=s[i]+s[i/10+1];
        if (k&1) {
            for (ri i(1);i<=n;p(i)) {
                p(T[s2[i]]);
                if (i>k&&s2[i]<=mid) p(lw);
                if (i>=k) {
                    mv1(),ans+=mid;
                    if (s2[i-k+1]<=mid) --lw;
                    --T[s2[i-k+1]];
                }
            }
        } else {
            for (ri i(1);i<=n;p(i)) {
                p(T[s2[i]]);
                if (i>k&&s2[i]<=mid) p(lw);
                if (i>k&&s2[i]<=mid1) p(lw1);
                if (i>=k) {
                    mv2(),ans+=mid+mid1>>1;
                    if ((mid+mid1)&1) p(sum);
                    if (s2[i-k+1]<=mid) --lw;
                    if (s2[i-k+1]<=mid1) --lw1;
                    --T[s2[i-k+1]];
                }
            }
        }
        ans+=sum>>1;
        printf("%lld",ans);
        if (sum&1) puts(".5");
        else puts(".0");
        return 0;
    }
}
int main() {return nanfeng::main();}
NOIP 模拟 $21\; \rm Median$的更多相关文章
- NOIP 模拟 $21\; \rm Game$
		
题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...
 - NOIP 模拟 $21\; \rm Park$
		
题解 \(by\;zj\varphi\) 首先,分析一下这个答案:本质上是求在一条路径上,选择了一些点,这些点的贡献是它周围的点权和 - 它上一步的点权 对于一棵树,可以先确定一个根,然后每条路径就可 ...
 - NOIP模拟3
		
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
 - NOIP模拟 1
		
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
 - 2021.5.22 noip模拟1
		
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
 - NOIP 模拟 $38\; \rm c$
		
题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过 ...
 - NOIP 模拟 $36\; \rm Cicada 拿衣服$
		
题解 \(by\;zj\varphi\) 发现右端点固定时,左端点的 \(min-max\) 单调递减,且对于 \(or\) 和 \(and\) 相减,最多有 \(\rm2logn\)个不同的值,且相 ...
 - NOIP 模拟 $36\; \rm Dove 打扑克$
		
题解 \(by\;zj\varphi\) 引理 对于一个和为 \(n\) 的数列,不同的数的个数最多为 \(\sqrt n\) 证明: 一个有 \(n\) 个不同的数的数列,和最小就是 \(n\) 的 ...
 - NOIP 模拟 $34\; \rm Equation$
		
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...
 
随机推荐
- python使用笔记18--写日志
			
1 import nnlog 2 import traceback 3 #level:输出日志级别,debug:把所有的日志都打印出来,info:打印info以上的日志, 4 # warning:打印 ...
 - 算法基础~链表~排序链表的合并(k条)
			
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
 - 前端开发入门到进阶第三集【JavaScript中如何将html字符串转化为Jquery对象或者Dom对象】
			
https://www.cnblogs.com/mingjiatang/p/4746845.html
 - linux查看电脑温度
			
sudo apt-get install lm-sensors # 安装yes | sudo sensors-detect # 侦测所有感测器 sensors # 查看温度
 - python之数据驱动Txt操作
			
一.新建数据Mail163.txt文本 二.Txt_Mail163.py脚本如下: import unittestfrom selenium import webdriverfrom selenium ...
 - 微信小程序云开发-云函数-创建云函数
			
一.检查云函数环境 检查云函数环境时候,鼠标右键点击查看当前环境.如果存在多个云开发环境,要确保云函数的当前环境要与app.js中evn的环境值一致. 如果不一致,则鼠标右键切换当前云开发环境.(如果 ...
 - 扩展欧几里得(exgcd)-求解不定方程/求逆元
			
贝祖定理:即如果a.b是整数,那么一定存在整数x.y使得ax+by=gcd(a,b).换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍.(可以来判断一个这样的式子有没有解)有一个 ...
 - 开发工具IDE从入门到爱不释手(四)高级进阶
			
代码生成Alt+Insert set/get生成 构造方法生成 toString生成 hashCode,equals 代码重构Refactor 不改变原有逻辑,让IDE帮助代码美观 重命名 Shift ...
 - Python -- raw_input函数
			
使用raw_input函数,它会把所有的输入当作原始数据(raw data),然后将其放入字符串中: >>> input("Enter a number: ") ...
 - 监控实战之Prometheus
			
author:JevonWei 版权声明:原创作品 目录 一 背景 二 部署Prometheus Server Prometheus 主配置文件 targets 节点配置文件 rules 告警规则 运 ...