题目描述

定义两个数列:

$$S=\{S(1),S(2),...,S(n)\}\text{和}S_2\{S_2(1),S_2(2),...,S_2(n)\}$$

$$S(k)=(p_k\times k)\mod w,where\ p_k\ is\ the\ kth\ prime\ number$$

$$S_2(k)=S(k)+S(\left\lfloor\frac{k}{10}\right\rfloor+1)$$

令$M(i,j)$表示$S_2(i)$到$S_2(j)$的中位数(个数为奇数就是中间的数,否则为中间的两个数除以二)。现给定$n,k$,求:

$$\sum \limits_{i=1}^{n-k+1}M(i,i+k-1)$$


输入格式

输入只有一行,为三个正整数$n,k,w$(同题意)。


输出格式

输出只有一行,为所求的答案。如果答案不是整数,使用$.5$表示一半,否则用$.0$


样例

样例输入1:

100 10 10007

样例输出1:

387895.5

样例输入2:

100000 10000 10007

样例输出2:

897586519.5


数据范围与提示

对于$20\%$的数据,$n,k\leqslant 6,000$
对于另外$30\%$的数据,$n,k\leqslant 10,000$
对于另外$20\%$的数据,$w=3$
对于$100\%$的数据,$w\leqslant k\leqslant n\leqslant 10^7$


题解

首先,想说一下我在考试的时候的思路(毕竟对着这道$T1$刚了一个小时……)

$10^7$的数据范围$n\log n$可能差不多,于是我想到了$Splay$……

然后我就打了,还以为$A$了这道题。

然后忽然想到筛素数不能只筛到$10^7$,我们需要$10^7$素数,当场歇逼……

因为我发现要筛到$179424673$……

然后我就打算从$w$入手,推式子,找规律,最后啥也没发现,于是我只筛到了$10^7$,因为我觉得多了会$T$(学校$OJ$太菜)……

然而正解告诉我们,就是要筛到$179424673$……

因为$OJ$太才,于是标程$T$掉了,老师把时限开到了$4s$并重测,那些筛到$179424673$的人(本来都$T$飞了……)都拿到了$70$分,然而我差点跌出了前$10$……

擦干眼泪,笑面未来!!!

于是我们开始讲这道题……

思考一个类似莫队的思路,也类似滑动窗口叭~

维护一个指针指向中位数,挪动窗口时更新位置即可($k$是偶数时维护两个即可)。

总之这是一道卡常题,$\Theta(n\log n)$的做法就别想了,因为它是这样的$\downarrow$

然后我去尝试了正解$\downarrow$

其实我也不知道我到底哪里把常数给写大了,总之别人的是这样的$\downarrow$

然而我就筛个素数就$\downarrow$

时间复杂度:$\Theta(179424673+n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,k,w;
int S1[10000001],S2[10000001];
int prime[10000001],cnt;
int t[10000001];
char vis[179424674];
double ans;
void pre_work()
{
for(int i=2;i<179424674;i++)
{
if(!vis[i])prime[++cnt]=i;
for(int j=1,x;j<=cnt&&(x=i*prime[j])<179424674;j++)
{
vis[x]=1;
if(!(i%prime[j]))break;
}
}
}
int main()
{
pre_work();
scanf("%d%d%d",&n,&k,&w);
for(long long i=1;i<=n;i++)S1[i]=prime[i]*i%w;
for(int i=1;i<=n;i++)S2[i]=S1[i]+S1[i/10+1];
for(int i=1;i<k;i++)t[S2[i]]++;
if(k&1)
{
int median=(k>>1)+1;
int lst=0;
int hand=-1;
for(int i=k;i<=n;i++)
{
t[S2[i]]++;
if(S2[i]<=hand)lst++;
if(i>k)
{
t[S2[i-k]]--;
if(S2[i-k]<=hand)lst--;
}
while(lst<median)lst+=t[++hand];
while(lst>=median+t[hand])lst-=t[hand--];
ans+=hand;
}
}
else
{
int median=(k>>1);
int lst1=0,lst2=0;
int hand1=-1,hand2=-1;
for(int i=k;i<=n;i++)
{
t[S2[i]]++;
if(S2[i]<=hand1)lst1++;
if(S2[i]<=hand2)lst2++;
if(i>k)
{
t[S2[i-k]]--;
if(S2[i-k]<=hand1)lst1--;
if(S2[i-k]<=hand2)lst2--;
}
while(lst1<median)lst1+=t[++hand1];
while(lst2<median+1)lst2+=t[++hand2];
while(lst1>=median+t[hand1])lst1-=t[hand1--];
while(lst2>=median+1+t[hand2])lst2-=t[hand2--];
ans+=(double)(hand1+hand2)/2;
}
}
printf("%.1lf",ans);
return 0;
}

rp++

[CSP-S模拟测试]:Median(暴力+模拟)的更多相关文章

  1. [CSP-S模拟测试]:跳房子(模拟)

    题目描述 跳房子,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一.跳房子是在$N$个格子上进行的,$CYJ$对游戏进行了改进,该成了跳棋盘,改进后的游戏是在一个$N$行$M$列的棋盘上进行,并 ...

  2. [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)

    题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...

  3. [考试反思]0719NOIP模拟测试6 + 0722NOIP模拟测试7

    连续爆炸,颇为愉快. 第6次:Rank #4 第7次:Rank #9 对于第6次考试,个人比较满意,因为T1只是差了一个卡常. 因为在考试前两天刚讲了矩阵,满脑子都是矩阵,还想到了循环矩阵优化. 整个 ...

  4. csp-s模拟测试112 & csp-s模拟测试113

    考前两天模拟. Day1直接炸飞,T1浪费的时间太长,对拍+调试了一个多小时但复杂度还不能过,最后5分钟想出来了解决方案但是已经打不出来了.T2读入出了事故RE0.T3打了假贪心. Day2心态几乎也 ...

  5. [CSP-S模拟测试]:666(模拟)

    题目描述 不忘初心. 小$\pi$假期在家无聊,打开了某弹幕直播网站. 突然,有一个精彩的镜头. 小$\pi$看到了满屏的$6$,其中,有$666$.也有$666666$.也有$6666666666. ...

  6. [CSP-S模拟测试]:砖块(模拟)

    题目描述 在一个二维网格平面上,一个网格的坐标由其左下角的点的坐标定义$(x,y)$.在一个二维网格平面上,一个网格的坐标由其左下角的个点的坐标定义$(0,0)$的区域中,此时存在高度为$k$的初始砖 ...

  7. [CSP-S模拟测试]:五子棋(模拟)

    题目传送门(内部题122) 输入格式 输入文件第一行为一个正整数$n$,表示双方总共下了多少步棋. 接下来$n$行,输入文件每行两个正整数.第$i$行的两个数$x,y$表示第$i$步的棋子下在了第$x ...

  8. [CSP-S模拟测试]:线性代数(模拟)

    题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...

  9. [CSP-S模拟测试]:集合论(模拟)

    题目传送门(内部题73) 输入格式 输入文件$jihe.in$ 第一行一个整数$m$,表示操作的次数. 接下来$m$行,每行描述一个操作. 每行的开始都是一个数字,$1,2,3,4$依次代表$unio ...

随机推荐

  1. 微信企业号 发送信息 shell

    微信企业号发送信息shell #可作为shell函数模块调用,用于微信通知.jenkins发版微信通知等等 # 微信API官方文档 https://work.weixin.qq.com/api/doc ...

  2. Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型

    本节重点思维导图 Date对象创建 两个构造函数: Date() ----使用当前日期和时间来初始化对象 Date(long millisec) -----接收一个参数,该参数是从1970年1月1日起 ...

  3. 应用安全-Web安全-SSRF攻防

    原理 服务器: IP:.XX.191.14 nc -l -p 客户端: http://xx.map.xx.com/maps/services/thumbnails?width=215&heig ...

  4. 前端项目中使用jsencrypt进行字段加密

    前端项目中使用jsencrypt进行字段加密. 使用步骤:①获取公钥②实例化对象③设置公钥④将所需数据进行加密然后返回. 进行一个简单的封装如下 /** * npm install jsencrypt ...

  5. oracle--登陆用户机制

    操作系统验证 密码文件验证 数据库验证 1.操作系统验证 sqlplus / as sysdba; 未使用用户和密码登陆 这是操作系统验证,由这个操作系统的组用户创建的,所以这个操作系统可以直接登陆, ...

  6. 剑指Offer编程题(Java实现)——替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路1 在字符串尾部填充任 ...

  7. Can you answer these queries? HDU 4027 线段树

    Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...

  8. poj_3179 Corral the Cows (二分+二维前缀和+离散化)

    [题目链接] http://poj.org/problem?id=3179 [参考] http://www.cnblogs.com/evenbao/p/9243183.html [算法] 二分答案+判 ...

  9. LLVM思想与功能综述

    llvm似乎还有一个奇怪的优化方法:llvm(low level virtual machine)本身就是一种抽象的.虚拟的计算机架构,其特性介于RISC和CISC之间,llvm会先将代码编译为llv ...

  10. CSS-子盒子撑开父盒子,让父盒子的高随内容自适应

    方法一: height:auto!important; height:200px; min-height:200px; ie6并不支持min-height.ie7,opera,火狐没有问题. 方法二: ...