[CF418E]Tricky Password
题意:有一个无限行$n$列的数表$a_{i,j}$,对于第$i\geq2$行,$a_{i,j}$为$a_{i-1,j}$在$a_{i-1,1\cdots j}$中出现的次数,要维护这个数表,支持修改第一行,查询任意位置
这题挺神的...首先随机一些数据,打个表可以发现这个数表的第$2,4,6,\cdots$行都是一样的,并且$3,5,7,\cdots$行也是一样的,下面写一个来自zjt的证明(%%%)
假设对数列$a_{1\cdots n}$有变换$f(a)$:将每一个$a_i$替换成它在$a_{1\cdots i}$中出现的次数,要证$f(a)=f(f(f(a)))$
先考虑$f(a)$,因为是统计出现次数,所以它肯定是由一堆$1,2,3,\cdots$穿插而成,我们可以每次贪心地从前往后取出最长的$1,2,3,\cdots$,把每次取出来的数字分为一组
再考虑$f(f(a))$,可以看出$f(a)$的第$i$组在$f(f(a))$中全部变成了$i$
最后考虑$f(f(f(a)))$,对于所有数字$i$,它们变成了$1,2,3,\cdots$,刚好和$f(a)$一一对应
所以对于本题,我们只需要知道第$1,2,3$行分别是什么就可以了

考虑分块,$f_{i,j}$表示在$a_{1}$的前$i$块中,$j$出现的次数,$g_{i,j}$表示在$a_2$的前$i$块中,$j$出现的次数
先预处理,$f_{i,\cdots}$可以由$f_{i-1,\cdots}$和$a_{1,1\cdots n}$得到,$g_{i,\cdots}$可以由$g_{i-1,\cdots}$和$f_{i-1,\cdots}$得到
修改$a_{1,p}=v$就先在对应块中减去$a_{1,p}$,再加回$v$即可
询问$a_{x,y}$就找到最靠近$y$的块,把零散的信息加进去即可
然后就做完了,出题人真是太神啦orz
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
const int S=1000;
int a[100010],f[110][200010],g[110][200010],val[200010],M;
map<int,int>mp;
int num(int x){
if(mp.find(x)==mp.end()){
M++;
mp[x]=M;
val[M]=x;
}
return mp[x];
}
int main(){
int n,m,i,j,x,y,z;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&x);
a[i]=num(x);
}
x=0;
for(i=1;i<=n;i+=S){
z=min(i+S-1,n);
memcpy(f[(i-1)/S+1],f[(i-1)/S],sizeof(f[(i-1)/S]));
memcpy(g[(i-1)/S+1],g[(i-1)/S],sizeof(f[(i-1)/S]));
for(j=i;j<=z;j++){
f[(i-1)/S+1][a[j]]++;
g[(i-1)/S+1][f[(i-1)/S+1][a[j]]]++;
}
}
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&i,&x,&y);
if(i==1){
for(i=(y-1)/S+1;(i-1)*S+1<=n;i++){
g[i][f[i][a[y]]]--;
f[i][a[y]]--;
}
a[y]=num(x);
for(i=(y-1)/S+1;(i-1)*S+1<=n;i++){
f[i][a[y]]++;
g[i][f[i][a[y]]]++;
}
}else{
if(x==1){
printf("%d\n",val[a[y]]);
continue;
}
for(i=(y-1)/S*S+1;i<=y;i++){
f[(y-1)/S][a[i]]++;
g[(y-1)/S][f[(y-1)/S][a[i]]]++;
}
printf("%d\n",(x&1)?g[(y-1)/S][f[(y-1)/S][a[y]]]:f[(y-1)/S][a[y]]);
for(i=(y-1)/S*S+1;i<=y;i++){
g[(y-1)/S][f[(y-1)/S][a[i]]]--;
f[(y-1)/S][a[i]]--;
}
}
}
}
[CF418E]Tricky Password的更多相关文章
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- 算法训练 Tricky and Clever Password
算法训练 Tricky and Clever Password 时间限制:2.0s 内存限制:256.0MB 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人 ...
- Codeforces 196 E. Tricky and Cleve Password
\(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...
- Codeforces 30 E. Tricky and Cleve Password
\(>Codeforces \space 30\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个串 \(S\),让你找出 \(A, B, C\ ...
- 问题:docker pull 用户登陆tricky,Error response from daemon: unauthorized: incorrect username or password
问题描述: PS C:\WINDOWS\system32> docker pull rabbitmqUsing default tag: latest Please login prior to ...
- 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...
- [CF30E]Tricky and Clever Password(KMP+manacher)
首先枚举回文中心,然后显然中心两边要尽量扩展作为middle,这个用manacher实现. 然后注意到suffix的结尾位置是固定的(串尾),那么预处理出以每个位置结尾的串与原串后缀至多能匹配多长,然 ...
- CF30E. Tricky and Clever Password
被你谷翻译诈骗了兄弟. 不过下次可以拿去诈骗其他人. 考虑枚举B,显然结论有B作为回文串越长越好,这个可以使用manacher,或者直接二分hash. 然后考虑翻转末尾串,然后记录其匹配到第 \(i\ ...
- Using default security password
不展示Using default security password的解决办法: import org.springframework.context.annotation.Bean; import ...
随机推荐
- SCOI 股票交易 单调队列优化dp
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...
- 修改select样式,vue select
<style> .selectbox{ width: 200px; display: inline-block; overflow-x: hidden; height: 28px; lin ...
- domReady的兼容性实现方法
一.为何要实现domReay方法? 举例: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- 数据结构基础---Binary Search Tree
/// Binary Search Tree - Implemenation in C++ /// Simple program to create a BST of integers and sea ...
- 数据结构&图论:K短路-可持久化可并堆
本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 对于图G,建立一个以终点t为起点的最短路径构成的最短路径树 (就是反着跑一遍最短路,然后对于一个不为 ...
- bzoj3223 文艺平衡树 codevs3303 翻转区间
splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...
- [POJ2774]Long Long Message 解题报告
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A p ...
- Linux下安装mantis配置指南【转】
转自:http://blog.csdn.net/xabc3000/article/details/6858229 目录(?)[-] Linux下安装mantis配置指南 配置Linux下的Apache ...
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- 【bzoj3924&&luogu3345】幻想乡战略游戏
这题可以用线段树做,不过正解恐怕是动态点分治?(点分树) 简单介绍下动态点分治的概念:在点分治的过程中,一般我们面对的问题都是静态的.如果涉及到修改这类的操作,我们就希望找到我们是如何处理到当前的修改 ...