ZOJ Monthly, January 2019 Little Sub and Isomorphism Sequences 【离线离散化 + set + multiset】
传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5868
Little Sub and Isomorphism Sequences
Time Limit: 3 Seconds Memory Limit: 65536 KB
Little Sub has a sequence . Now he has a problem for you.
Two sequences of length and of length are considered isomorphic when they meet all the following two conditions:
- ;
- Define as the number of times integer occur in sequence . For each integer in , always holds.
Now we have operations for . and there are two kinds of operations:
- 1 x y: Change to (, );
- 2: Query for the greatest () that there exist two integers and () and is isomorphic with . Specially, if there is no such , please output "-1" (without quotes) instead.
Input
There are multiple test cases. The first line of the input contains an integer (), indicating the number of test cases. For each test case:
The first line ontains two integers .
The second line contains integers ().
In the following lines, each line contains one operation. The format is described above.
Output
For each operation 2, output one line containing the answer.
Sample Input
1
3 5
1 2 3
2
1 3 2
2
1 1 2
2
Sample Output
-1
1
2
题意概括:
给出 一个长度为 N 的序列, 和 M 次操作.
有两种操作:
1 id y : 把序列中第 id 个位置的值 修改成 y
2 : 查询这个序列中能满足两个子串“相同”的最大长度。
两个子串相同的条件:子串的数字种类和每种种类的数量相同,当然两个子串的起点不同(理所当然,否则这道题就没意义了)。
解题思路:
很明显就是维护每种 相同的值的 下标(位置)的 最大差值。
因为除了两端的值,中间公共部分 无论是数量还是种类肯定相同。
那么问题就转换成了如何维护每种值 value 的位置最大差值。
用 set 存每种 value 的下标,最多需要 20w个(最坏的情况就是每次操作都是插入新的值)
用 multiset 维护 最大差值。
值 val 的范围是 【1, 1e9】,需要离散化。
在线 map 离散化 RE。
离线 lower_bound() AC。
AC code:
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 2e5+;
const int MAXM = 2e5+;
int a[MAXN]; //存实际序列
int b[MAXN]; //存所有序列包括原序列的值和修改的值,用于离散化
int c[MAXN]; //存操作
int x[MAXN]; //存修改的下标
int y[MAXN]; //存修改的值
set<int>ss[MAXM]; ///维护每一种值的起点和终点
multiset<int>ans; ///维护两点距离差
//map<int, int>mmp;
int N, M; int main()
{
int cnt = ;
int T_case;
scanf("%d", &T_case);
while(T_case--){ int cnt = ;
ans.clear();
scanf("%d %d", &N, &M);
for(int i = ; i <= N; i++){
scanf("%d", &a[i]);
b[++cnt] = a[i];
} for(int i = ; i <= M; i++){
scanf("%d", &c[i]);
if(c[i] == ){
scanf("%d %d",&x[i], &y[i]);
b[++cnt] = y[i];
}
}
sort(b+, b++cnt);
cnt = unique(b+, b+cnt+)-(b+); ///离散化后的数据总量 for(int i = ; i <= cnt; i++){ ///初始化
ss[i].clear();
} for(int i = ; i <= N; i++){
a[i] = lower_bound(b+, b+cnt+, a[i])-b; ///对原序列的值进行离散化
ss[a[i]].insert(i);
} for(int i = ; i <= cnt; i++){
if(!ss[i].empty()) ans.insert(*--ss[i].end() - *ss[i].begin()); ///初始化两点距离差
} for(int i = ; i <= M; i++){
if(c[i] == ){ ///删除操作
int no = a[x[i]];
ans.erase(ans.find( *--ss[no].end()-*ss[no].begin()) );
ss[no].erase(ss[no].find(x[i]));
if(!ss[no].empty()) ans.insert(*--ss[no].end()-*ss[no].begin()); y[i] = lower_bound(b+, b+cnt+, y[i])-b; ///增加操作
a[x[i]] = y[i];
no = y[i];
if(!ss[no].empty()) ans.erase(ans.find( *--ss[no].end()-*ss[no].begin()) );
ss[no].insert(x[i]);
ans.insert(*--ss[no].end()-*ss[no].begin());
}
else{
int res = -;
if(!ans.empty()){
res = *--ans.end();
}
if(res == ) res = -;
printf("%d\n", res);
}
} }
return ;
}
ZOJ Monthly, January 2019 Little Sub and Isomorphism Sequences 【离线离散化 + set + multiset】的更多相关文章
- ZOJ Monthly, January 2019
A: Little Sub and Pascal's Triangle Solved. 题意: 求杨辉三角第n行奇数个数 思路: 薛聚聚说找规律,16说Lucas 答案是 $2^p \;\;p 为 n ...
- ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089
写这篇博客来证明自己的愚蠢 ...Orz 飞机 题意:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构 题解:经过一些奇思妙想后 ,你可以发现问题是传 ...
- ZOJ Monthly, January 2019 Little Sub and his Geometry Problem 【推导 + 双指针】
传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5861 Little Sub and his Geometry Prob ...
- ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)
在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵 , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...
- ZOJ Monthly, January 2018 训练部分解题报告
A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...
- matrix_2015_1 138 - ZOJ Monthly, January 2015
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844 第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相 ...
- ZOJ Monthly, January 2018
A 易知最优的方法是一次只拿一颗,石头数谁多谁赢,一样多后手赢 #include <map> #include <set> #include <ctime> #in ...
- ZOJ Monthly, January 2018 Solution
A - Candy Game 水. #include <bits/stdc++.h> using namespace std; #define N 1010 int t, n; int a ...
- ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle
这个题的话,它每行奇数的个数等于该行行号,如果是0开始的,就该数的二进制中的1的个数,设为k,以它作为次数,2k就是了. #include <stdio.h> int main() { i ...
随机推荐
- Centos 从零开始 (三)
8:连接阿里云. 需要用到 ssh指令进行远程登陆 [root@localhost ~]# service sshd start #如果没开启服务的话,需要开启服务. [root@localhost ...
- Silverlight & Blend动画设计系列三:缩放动画(ScaleTransform)
在Silverlight的动画框架中,ScaleTransform类提供了在二维空间中的坐标内进行缩放操作,通过ScaleTransform可以在水平或垂直方向的缩放和拉伸对象,以实现一个简单的缩放动 ...
- C#根据用户输入字符串,输出大写字母有几个,小写字母有几个
static void Main(string[] args) { // 根据用户输入字符串,输出大写字母有几个,小写字母有几个. Console.WriteLine("请输入一行英文代码& ...
- vue.js开发之开关(switch)组件
最近开发组件的时候,自定义开发了开关(switch)组件,现将代码整理如下,方便日后复用. toggle-switch.vue <template> <label role=&quo ...
- 六 Selector
选择器是java NIO中能够检测一到多个NIO通道(Channel),并能知晓是否为诸如读写时间做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接 为什么用Sele ...
- 把一个项目a生成后放在另一个项目b使用(b项目是例子中的ScreenWebPage_Tool)
a项目属性---生成事件---后期生成事件命令行 xcopy /r /y $(TargetDir)*.* $(SolutionDir)ScreenWebPage_Tool\bin\Debug\* ...
- 如何正确实现 IDisposable 接口
MSDN建议按照下面的模式实现IDisposable接口: public class Foo: IDisposable { public void Dispose() { Dispose(true); ...
- PAT 1061. Dating
题是别人出的,不按她的想法来也没办法,真心想k一顿 #include <cstdio> #include <cstdlib> using namespace std; cons ...
- 安装配置postgreSQL+pgcli+pgadmin3
记录了postgreSQL数据库的完整的安装配置过程,以及postgreSQL的pgcli命令行智能提醒扩展,pgadmin3图形化管理客户端的配置安装.此postgresql是bigsql版安装详情 ...
- 按键精灵Q语言基础
一.数据类型1.1数据类型可以表示一切的类型variant逻辑类型:boolean (true,false)数学类型: 整数:byte(0-255),integer(-32768-32767),lon ...