bzoj 4900 [CTSC2017]密钥 模拟+乱搞
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4900
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector> #define N 40000007
#define FOR(a,b,c) for(int a=(b),a##_end__=(c);a<a##_end__;a++)
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int seed,n,k,S;
bool p[N];
int cnt[N],A[N];
int ans1,ans2,ans3;
void generateData(){
scanf("%d%d%d",&k,&seed,&S);
int t=;
n=k<<|;
FOR(i,,n+){
p[i]=(seed=((seed*)^)&)>>&;
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 main(){
generateData();
int T=;
FOR(i,,n+){
if(p[i]) cnt[A[i]=A[i-]+]++,T+=A[i]>A[];
else A[i]=A[i-]-;
}
FOR(i,,n+){
if(p[i]){
T-=cnt[A[i]];
cnt[A[i]-]++;
cnt[A[i]]--;
}
else{
T+=cnt[A[i]+];
if(T==) ans1=i;
if(T==S) ans2=i;
if(T==k-S) ans3=i;
}
}
printf("%d\n%d\n%d\n",ans1,ans2,ans3);
}
【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。
现在你需要解决以下三个问题:
- 给定密钥中所有 A 的位置,当密钥的特征值为 00 时,请问 X 在哪个位置。
- 给定密钥中所有 A 的位置,当密钥的特征值为 SS 时,请问 X 在哪个位置。
- 给定密钥中所有 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。
输出格式
输出三行,每行一个数,依次对应问题描述中的三个子问题的答案。
即:
- 第一个数表示当 kk 元集合 PP 代表 A 的位置且特征值为 00 时 X 的位置。
- 第二个数表示当 kk 元集合 PP 代表 A 的位置且特征值为 SS 时 X 的位置。
- 第三个数表示当 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。
对于每个测试点,得分为以下三部分得分之和:
- 如果第一问回答正确,你将获得 33 分。
- 如果第二问回答正确,你将获得 44 分。
- 如果第三问回答正确,你将获得 33 分。
如果你仅仅知道部分答案,请也务必按此格式要求输出三个数。否则你可能会因格式错误无法得分。
时间限制:1s1s
空间限制:512MB512MB
下载
bzoj 4900 [CTSC2017]密钥 模拟+乱搞的更多相关文章
- Codeforces 1186F - Vus the Cossack and a Graph 模拟乱搞/欧拉回路
题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= ceil((n + m) / 2), 每个点的度数 >= ceil(deg[i] / 2).(deg[i]是 ...
- HDU 5929 Basic Data Structure(模拟 + 乱搞)题解
题意:给定一种二进制操作nand,为 0 nand 0 = 10 nand 1 = 1 1 nand 0 = 1 1 nand 1 = 0 现在要你模拟一个队列,实现PUSH x 往队头塞入x,POP ...
- 【BZOJ】2456 mode(乱搞)
Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n.第2行n个正整数用空格隔开. Output 一行一个正整数表 ...
- ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)
在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵 , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...
- BZOJ 4032 trie树+各种乱搞
思路 : 先对b 的所有后缀建立trie树 第一问 暴力枚举a串的起点 在trie树上跑 找到最短的 第二问 也是暴力枚举a串的起点 a和b顺着暴力匹配就好 第三问 求出来a在第i个位置 加一个字母j ...
- bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞
没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...
- BZOJ 1011--[HNOI2008]遥远的行星(乱搞)
1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 5684 Solved ...
- 【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)
4148: [AMPPZ2014]Pillars Time Limit: 5 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 100 Solve ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
随机推荐
- * 197. Permutation Index【LintCode by java】
Description Given a permutation which contains no repeated number, find its index in all the permuta ...
- [Clr via C#读书笔记]Cp16数组
Cp16数组 一维数组,多维数组,交错数组:引用类型:P338的图非常的清楚地描述了值类型和引用类型在托管堆中的关系:越界检查: 数组初始化 数组初始化器: 四种写法 string[] names = ...
- 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别
AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高. 系统在技术上的三个贡献: 1.用简单的Haa ...
- 【转载】OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较
原文作者 : Satya Mallick 译者 : aleen42 原文 https://aleen42.gitbooks.io/personalwiki/content/translation/o ...
- scrapy(1)——scrapy介绍
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说 ...
- TCP系列27—窗口管理&流控—1、概述
在前面的内容中我们依次介绍了TCP的连接建立和终止过程和TCP的各种重传方式.接着我们在这部分首先关注交互式应用TCP连接相关内容如延迟ACK.Nagle算法.Cork算法等,接着我们引入流控机制(f ...
- 个人github blog环境设置
每个人都想拥有自己的网站,但是大部分比较屌丝,不想花钱租赁服务器,哈哈,屌丝有屌丝办法.github应该都听说过吧,github.io提供了此功能,而且使用github来管理自己的代码,如果你有域名, ...
- css那些事儿3 列表与浮动
一 列表 列表默认为行内块元素,具有宽高,当一个非块元素是无法应用宽高的,比如a 1 有序列表 有ol li组成,其中li为列表项,列表的ol子元素务必为li元素标签,li子内容支持列表任意嵌套,有 ...
- mysql 时区问题:The server time zone value '???ú±ê×??±??' is unrecognized
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.sql.SQLE ...
- oracle 时间段内的所有行时间
获取一段时间内所有的小时 SELECT to_date('2013-07-01 12', 'yyyy-mm-dd hh24') + (ROWNUM - 1) / 24 sdate FROM dualC ...