题意:有一个无限行$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的更多相关文章

  1. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  2. 算法训练 Tricky and Clever Password

     算法训练 Tricky and Clever Password   时间限制:2.0s   内存限制:256.0MB      问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人 ...

  3. Codeforces 196 E. Tricky and Cleve Password

    \(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...

  4. Codeforces 30 E. Tricky and Cleve Password

    \(>Codeforces \space 30\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个串 \(S\),让你找出 \(A, B, C\ ...

  5. 问题: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 ...

  6. 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...

  7. [CF30E]Tricky and Clever Password(KMP+manacher)

    首先枚举回文中心,然后显然中心两边要尽量扩展作为middle,这个用manacher实现. 然后注意到suffix的结尾位置是固定的(串尾),那么预处理出以每个位置结尾的串与原串后缀至多能匹配多长,然 ...

  8. CF30E. Tricky and Clever Password

    被你谷翻译诈骗了兄弟. 不过下次可以拿去诈骗其他人. 考虑枚举B,显然结论有B作为回文串越长越好,这个可以使用manacher,或者直接二分hash. 然后考虑翻转末尾串,然后记录其匹配到第 \(i\ ...

  9. Using default security password

    不展示Using default security password的解决办法: import org.springframework.context.annotation.Bean; import ...

随机推荐

  1. Android中使用RadioButton代替ImageButton

    画外音————好久没上来发文章了,这几个月一直忙着一些跟编程不沾边的事,拖了好久,现在还在持续中,顺利的话7月份应该能解放了..今天偶尔上来写一段番外篇性质的心得发现. 之前搞的Android项目,作 ...

  2. codevs 1078 最小生成树 kruskal

    题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...

  3. Codeforces Round #523 (Div. 2) A. Coins

    A. Coins 题目链接:https://codeforc.es/contest/1061/problem/A 题意: 给出n和s,要在1-n中选数(可重复),问最少选多少数可以使其和为s. 题解: ...

  4. mmall项目之问题一(mavenplugin问题)

    在进行mybatis逆向工程到时候,报错,提示maven plugin 错误,提示missing..... 解决办法: 因为之前到pom中忘记了加版本信息,添加后错误消失:

  5. 转:nginx入门指南,快速搭建静态文件服务器和代理服务器

    本文介绍 Nginx 入门基础知识,让你迅速搭建 Nginx 服务器.主要内容包括 Nginx 安装和简单使用.Nginx的简单原理.Nginx 配置文件的结构.如何使用 Nginx 来提供静态文件服 ...

  6. JS向右弹出DIV,点击可向左隐藏。我用jquery可以从左下角像右上角隐藏,怎么从做向右隐藏呢?

    弹出的DIV如果是绝对定位,就用right固定位子,如果不是就用float:right:Jquery中有个函数animate是自定义动画效果,$("#shou").click(fu ...

  7. httpFS访问

    编辑文件httpfs-env.sh 执行sbin/httpfs.sh 执行命令curl -i "http://192.168.1.213:14000/webhdfs/v1?user.name ...

  8. 用户线程 (User Thread)、守护线程 (Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...

  9. 【Foreign】远行 [LCT]

    远行 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output Sample Input 0 5 10 1 4 5 2 3 2 ...

  10. C++ 迭代器容器学习

    set的一个用法 . difference找差集 union合并set intersection找到交集 #include<iostream> #include<string> ...