#297. 【CTSC2017】密钥

一个密钥是一个长度为 n=2k+1n=2k+1 的字符串,它包含 11 个字母X、kk 个字母 A 和 kk 个字母 B。例如 k=3k=3 时,BAXABAB 就是一个密钥。

如下图所示,可以按顺时针顺序把这 2k+12k+1 个字母排成一个圈:

在 kk 个字母 A 中,有一部分可以定义为"强的"。

具体来说,从 X 出发顺时针走到某个 A 时,如果途中 A 的数目严格多于 B 的数目,则称此字母 A 为强的。

对于上面的例子来说,顺时针方向从字母 X 数起第 11 个和第 22 个字母 A 是强的,而第 33 个字母 A 不是强的。

一个密钥的特征值就是其中包含的强的字母 A 的个数。

天才小朋友 KT 给出了一个结论:

假设 kk 个字母 A 所在的位置已经固定,但是剩下的 kk 个 B 和 11 个 X 的位置是未知的。 (注意,满足这样要求的密钥一共有 k+1k+1 个,因为字母 X 还剩下 k+1k+1 个可能的位置。)

可以证明:所有这k+1k+1个可能的密钥的特征值是各不相同的,它们恰好为0,1,2,…,k0,1,2,…,k。

下页的图是一个具体的示例,从左到右的四个子图中分别有3个,2个,1个,0个字母A是强的。

类似地,如果固定 kk 个字母 B 的位置,那满足条件的所有 k+1k+1 个密钥的特征值也各不相同,恰好为 0,1,⋯,k0,1,⋯,k。

现在你需要解决以下三个问题:

  1. 给定密钥中所有 A 的位置,当密钥的特征值为 00 时,请问 X 在哪个位置。
  2. 给定密钥中所有 A 的位置,当密钥的特征值为 SS 时,请问 X 在哪个位置。
  3. 给定密钥中所有 B 的位置,当密钥的特征值为 SS 时,请问 X 在哪个位置。

注意:字符串的 2k+12k+1 个字母的位置由 11 到 2k+12k+1 编号。

例子一

假定 k=3,S=2k=3,S=2。那么:

当 A 的位置是 {2,4,6}{2,4,6} 且特征值为 00 时,X 的位置在 77;

当 A 的位置是 {2,4,6}{2,4,6} 且特征值为 22 时,X 的位置在 33;

当 B 的位置是 {2,4,6}{2,4,6} 且特征值为 22 时,X 的位置在 55。

例子二

假定 k=9,S=7k=9,S=7。那么:

当 A 的位置是 {3,4,5,9,10,12,13,16,19}{3,4,5,9,10,12,13,16,19} 且特征值为 00 时,X 的位置在 1414;

当 A 的位置是 {3,4,5,9,10,12,13,16,19}{3,4,5,9,10,12,13,16,19} 且特征值为 77 时,X 的位置在 1818;

当 B 的位置是 {3,4,5,9,10,12,13,16,19}{3,4,5,9,10,12,13,16,19} 且特征值为 77 时,X 的位置在 1717。

输入格式

只包含一组测试数据。

第一行包含一个整数kk,意义如题所述。

第二行包含一个整数seedseed,这个数将用于生成一个kk元集合P。

第三行包含一个整数SS,意义如题所述。

保证0≤S≤k≤1070≤S≤k≤107。1≤seed≤100001≤seed≤10000。

在下发文件中,包含三个用于生成输入数据的文件cipher.cpp/c/pas。其中读入部分已经完成,在数组 p[]p[] 中,若 p[i]=0p[i]=0,表示 ii 不属于集合PP,否则,ii 属于集合 PP。

输出格式

输出三行,每行一个数,依次对应问题描述中的三个子问题的答案。

即:

  1. 第一个数表示当 kk 元集合 PP 代表 A 的位置且特征值为 00 时 X 的位置。
  2. 第二个数表示当 kk 元集合 PP 代表 A 的位置且特征值为 SS 时 X 的位置。
  3. 第三个数表示当 kk 元集合 PP 代表 B 的位置且特征值为 SS 时 X 的位置。

样例一

input

5
3344
2

output

10
1
2

explanation

第一个样例中,PP 数组为 11 的元素的下标分别为 5,6,7,8,95,6,7,8,9。

样例二

input

500000
4545
234567

output

999992
246922
753067

限制与约定

对于 30%30% 的数据,k≤103k≤103。

对于 50%50% 的数据,k≤105k≤105。

对于 100%100% 的数据,k≤107k≤107。

对于每个测试点,得分为以下三部分得分之和:

  1. 如果第一问回答正确,你将获得 33 分。
  2. 如果第二问回答正确,你将获得 44 分。
  3. 如果第三问回答正确,你将获得 33 分。

如果你仅仅知道部分答案,请也务必按此格式要求输出三个数。否则你可能会因格式错误无法得分。

时间限制:1s1s

空间限制:512MB

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 20000005
using namespace std;
int p[maxn],b[maxn],cnt,ans[maxn];
int seed, n, k, S;
int getrand()
{
seed = ((seed * ) ^ ) % ;
return seed;
}
void generateData()
{
scanf("%d%d%d",&k,&seed,&S);
int t = ;
n = k * + ;
memset(p, , sizeof(p));
for (int i = ; i <= n; i++)
{
p[i] = (getrand() / ) % ;
t += p[i];
}
int i = ;
while (t > k)
{
while (p[i] == )
i++;
p[i] = ;
t--;
}
while (t < k)
{
while (p[i] == )
i++;
p[i] = ;
t++;
}
}
int count1(int s){
int sa=,sb=,res=;
for(int i=,j=s+;i<=n;i++,j++){
if(p[j]==)sb++;
else {
sa++;
if(sa>sb)res++;
}
}
return res;
}
void work1(){
for(int i=;i<=cnt;i++)//x的位置
ans[i]=count1(b[i]);
}
int count2(int s){
int sa=,sb=,res=;
for(int i=,j=s+;i<=n;i++,j++){
if(p[j]==)sb++;
else {
sa++;
if(sa>sb)res++;
}
}
return res;
}
void work2(){
for(int i=;i<=cnt;i++)
ans[i]=count2(b[i]);
}
int main(){
generateData();
for(int i=;i<=n;i++)p[i-]=p[i];
for(int i=;i<n;i++)p[i+n]=p[i];
for(int i=;i<n;i++)if(!p[i])b[++cnt]=i;
if(k<=){
work1();
int ans0,ans1;
for(int i=;i<=cnt;i++){
if(ans[i]==)ans0=b[i]+;
if(ans[i]==S)ans1=b[i]+;
}
printf("%d\n%d\n",ans0,ans1);
work2();
for(int i=;i<=cnt;i++)
if(ans[i]==S){
printf("%d\n",b[i]+);
return ;
}
}
return ;
}

30分 暴力

uoj #297. 【CTSC2017】密钥的更多相关文章

  1. bzoj 4900 [CTSC2017]密钥 模拟+乱搞

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4900 #include<cstring> #include<cmath&g ...

  2. [CTSC2017]密钥

    传送门:http://uoj.ac/problem/297 “无论哪场比赛,都要相信题目是水的” 这不仅是HNOI2018D2T3的教训,也是这题的教训,思维定势真的很可怕. 普及组水题,真是愧对CT ...

  3. uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划

    题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b ...

  4. CTSC2017密钥、吉夫特

    自己是有多么sb. 密钥 大家都说这是一道普及-的题,一年前我做不起,我可以说我太弱啦,我就普及组水平,今年我还是做不起…… 看大佬题解都是:开个桶就好啦! 我:你在说什么…… 首先把环拉成链,倍长. ...

  5. bzoj4900 [CTSC2017]密钥

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4900 [题解] 恭喜bzoj达到40页 考场由于傻逼基数排序写挂了而gg. 竟然忘了考试前一 ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. uoj #298. 【CTSC2017】网络

    #298. [CTSC2017]网络 一个一般的网络系统可以被描述成一张无向连通图.图上的每个节点为一个服务器,连接服务器与服务器的数据线则看作图上的一条边,边权为该数据线的长度.两个服务器之间的通讯 ...

  8. uoj#300.【CTSC2017】吉夫特

    题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...

  9. UOJ#299. 【CTSC2017】游戏 线段树 概率期望 矩阵

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ299.html 前言 不会概率题的菜鸡博主做了一道概率题. 写完发现运行效率榜上的人都没有用心卡常数——矩阵怎么可以用数组 ...

随机推荐

  1. python's eithteenth day for me 面向对象——命名空间

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些明细称为类的属性. 而类有两种属性:静态属性和动态属性:   1,静态属性就是直接在类中定义的变量. 2,动态属性就是定义在类中的方 ...

  2. 用Python语言设计GUI界面

    我们大家都编写过程序,但是如果能够设计一个GUI界面,会使程序增添一个很大的亮点!今天就让我们来用目前十分流行的python语言写出一个最基本的GUI,为日后设计更加漂亮的GUI打下基础. 工具/原料 ...

  3. 安装glibc-2.14

    下载glibc-2.14.tar.gz 解压: [root@jrgc130 software]# tar xf glibc-2.14.tar.gz [root@jrgc130 software]# c ...

  4. <%@ page import=""%>的用法

    转自:https://blog.csdn.net/huihui870311/article/details/455642111 <jsp:directive.page import=" ...

  5. java基础之多线程一:概述

    概述: 进程有多条执行路径, 合成为: 多线程. 进程和线程的描述: 进程: 可执行程序(文件), 例如: .exe//可以把进程理解为一辆车. 一台电脑上可以有多个进程, 这些进程之间的数据是相互隔 ...

  6. 【bzoj2705】[SDOI2012]Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2507  Solved: 1531[Submit][ ...

  7. Linux服务器防火墙白名单设置

    公司最近对网络安全抓的比较严,要求防火墙必须开启,但是项目的服务器有五六台,三台用于负载均衡,服务器之间必须要进行各种连接,那就只能通过添加白名单的方式. 登上服务器,编辑防火墙配置文件 vi /et ...

  8. cocos2d-x 在vs2010下的环境配置

    cocos2d-x编译完成之后生成了一堆动态库,在window下分别为.dll , .lib ,其中*lib是在编译的时候需要链接的,*.dll是在运行的时候依赖的.所以当我们创建一个cocos2d- ...

  9. SpringBoot25 gradle安装、利用gradle创建SrpingBoot项目

    1 gradle安装 技巧01:gradle依赖JDK或者JRE,而且版本至少时1.7 1.1 下载安装包 到gradle官网下载安装包[PS: 也可以利用命令的方式安装,本案例是利用安装包的方式] ...

  10. Opencv3 Mat对象构造函数与常用方法

    构造函数 Mat() Mat(int rows,int cols,int type) Mat(Size size,int type) Mat(int rows,int cols,int type,co ...