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 ...
随机推荐
- c语言乐曲演奏——《千本樱》
这个程序着实花费了我好长的时间,我本身对音乐一窍不通,先是跟着girl friend学习了简谱,根据c调44拍的<千本樱>写下了下面的程序. #include<stdio.h> ...
- 20145214 《Java程序设计》第5周学习总结
20145214 <Java程序设计>第5周学习总结 教材学习内容总结 try和catch Java中所有错误都会被包装为对象,可以尝试try执行程序并捕捉catch代表错误的对象后做一些 ...
- Java内存区域划分和GC机制
Java 内存区域和GC机制 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Ga ...
- TCP系列26—重传—16、重组包
一.介绍 在TCP重传的时候,并没有限制TCP只能重传与初传完全相同的报文段大小,TCP允许执行重组包(repacketization),发送一个更大的TCP报文段,进而增加性能.TCP在重传时候允许 ...
- c++:error2019,无法解析的外部命令blabla~
出现这个原因的问题汇总: 1,相应的附加库没有包含进去,注意附加库的目录是 / 2,函数没有与之对应的类,却在main中以某一类的对象调用了该方法. 其实,当错误中显示fun()成为无法解析的外部命令 ...
- 探讨C++实现一个不可被继承的类
C#和Java都提供了一种机制让一个类不能被继承,如C#中的sealed关键字和Java的final关键字,然而C++程序员就没这么好命了.不过C++也可以模拟出这种效果,原理基于:子类的构造函数会自 ...
- VBA 实现学校上课教员一学期中所有上课时间,在一页中通过背景底色反应出来
需求:学校一学期的所有课程表,每个教员都有可能上好几门课,但给一个教员调课时需要查找所调课时间位置有没有此教员上其它的课 相冲突,手动查找很不方便,这里想通过一个表中位置显示出同一教员在所有课表中出现 ...
- 【Python】python-内置常量
引言 Python的内置常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__ 一.True 1.True是bool类型用来表示的 ...
- 域对象 pageContext request session servletContext
pageContext 当前页面之内有效 request 当前的请求内有效 session 当前的会话内有效 servletContext 当前这次服务器生命周期内有效
- Properties 的list方法 直接将内容放到文本中
Properties 的list方法 直接将内容放到文本中