[CSP-S模拟测试]:Median(暴力+模拟)
题目描述
定义两个数列:
$$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(暴力+模拟)的更多相关文章
- [CSP-S模拟测试]:跳房子(模拟)
题目描述 跳房子,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一.跳房子是在$N$个格子上进行的,$CYJ$对游戏进行了改进,该成了跳棋盘,改进后的游戏是在一个$N$行$M$列的棋盘上进行,并 ...
- [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)
题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...
- [考试反思]0719NOIP模拟测试6 + 0722NOIP模拟测试7
连续爆炸,颇为愉快. 第6次:Rank #4 第7次:Rank #9 对于第6次考试,个人比较满意,因为T1只是差了一个卡常. 因为在考试前两天刚讲了矩阵,满脑子都是矩阵,还想到了循环矩阵优化. 整个 ...
- csp-s模拟测试112 & csp-s模拟测试113
考前两天模拟. Day1直接炸飞,T1浪费的时间太长,对拍+调试了一个多小时但复杂度还不能过,最后5分钟想出来了解决方案但是已经打不出来了.T2读入出了事故RE0.T3打了假贪心. Day2心态几乎也 ...
- [CSP-S模拟测试]:666(模拟)
题目描述 不忘初心. 小$\pi$假期在家无聊,打开了某弹幕直播网站. 突然,有一个精彩的镜头. 小$\pi$看到了满屏的$6$,其中,有$666$.也有$666666$.也有$6666666666. ...
- [CSP-S模拟测试]:砖块(模拟)
题目描述 在一个二维网格平面上,一个网格的坐标由其左下角的点的坐标定义$(x,y)$.在一个二维网格平面上,一个网格的坐标由其左下角的个点的坐标定义$(0,0)$的区域中,此时存在高度为$k$的初始砖 ...
- [CSP-S模拟测试]:五子棋(模拟)
题目传送门(内部题122) 输入格式 输入文件第一行为一个正整数$n$,表示双方总共下了多少步棋. 接下来$n$行,输入文件每行两个正整数.第$i$行的两个数$x,y$表示第$i$步的棋子下在了第$x ...
- [CSP-S模拟测试]:线性代数(模拟)
题目传送门(内部题113) 输入格式 第一行一个正整数$n$. 接下来$n$行,每行$n$个整数,描述$C$矩阵.保证输入的是一个林先森矩阵. 输出格式 若不可能实现,则输出一行$Impossible ...
- [CSP-S模拟测试]:集合论(模拟)
题目传送门(内部题73) 输入格式 输入文件$jihe.in$ 第一行一个整数$m$,表示操作的次数. 接下来$m$行,每行描述一个操作. 每行的开始都是一个数字,$1,2,3,4$依次代表$unio ...
随机推荐
- 【MM系列】SAP MM模块-移动类型全部列表
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-移动类型全部列表 ...
- 【EWM系列】SAP 关于EWM的WT增强简介
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 关于EWM的WT增强简介 ...
- mooc-IDEA postfix--007
十三.IntelliJ IDEA -postfix 代码中输入: 总结常用的postfix: 1.for (<=>100.fori) 2.sout (<=>System.ou ...
- python+selenium链接对象操作
对于链接对象常见的操作有:单击.获取链接文字.获取链接地址等: from selenium import webdriverfrom time import sleep driver = webdri ...
- C++学习笔记(六)--结构体
1.一种自定义的类型--结构体定义: struct 结构体名称 { //成员表列也称作域 还可以包括函数,即函数成员,不过一般结构体类型中不包含,而是放在类中. 类型名 成员名; };这种结构体类型类 ...
- Oracle数据库SQL语句的分类
1986年10月,美国国家标准协会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言,1987年在国际标准组织的支持下成为国际标准.不过各种通行的数据库系统其实在实践过程中都对SQL规范的作了 ...
- Kubeadm安装Kubernetes 1.15.1
一.实验环境准备 服务器虚拟机准备 IP CPU 内存 hostname 192.168.198.200 >=2c >=2G master 192.168.198.201 >=2c ...
- OSI模型——传输层
OSI模型——传输层 运输层 运输层概述 运输层提供应用层端到端通信服务,通俗的讲,两个主机通讯,也就是应用层上的进程之间的通信,也就是转换为进程和进程之间的通信了,我们之前学到网络层,IP协议能将分 ...
- 所有的数据处理都是map-reduce
用reduce求和 const sum = [1,2,3,4,5,6].reduce((v,t)=>{ return v+t; //第一次v=0,t=1 //第二次v= 0+1,t=2 //第三 ...
- python学习笔记(10):面向对象
一.类和实例 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 2.对象:通过类定义的数据结构实例.对象包括两个数据成员( ...