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 ...
随机推荐
- 【关于迭代器的for-each遍历集合现象。。。。。】
foreahc迭代集合元素的同时修改集合元素抛异常..ConcurrentModificationException异常 只要使用迭代器遍历,其他集合遍历时进行增删操作都需要留意是否会触发Concur ...
- Firebird hash join
Firebird 现可支持哈希连接(hash join),各中大型数据库,哈希连接已成为平常,相对于循环嵌套连接(Nested Loop Join),在数据量较大的情况下,哈希连接性能较好. 由于 F ...
- JAVA异常与异常处理详解
一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...
- Azure Java Libraries 入门
本指南演示了以下 Azure Java Libraries 的用法,包括设置认证.创建并使用 Azure 存储.创建并使用 Azure SQL 数据库.部署虚拟机.从 GitHub 部署 Azure ...
- 一些在线开发手册api文档收藏
java JavaSE8 api:https://docs.oracle.com/javase/8/docs/api/ JavaSE7 api:http://docs.oracle.com/javas ...
- hdu Anniversary party 树形DP,点带有值。求MAX
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 小任务之使用SVG画柱状图~
function drawBar(data) { var barGraph = document.querySelector("#bar-graph"); var graphWid ...
- javascript检查数据中是否存在相同的元素
这里是两个用于数组中查找重复元素的demo,可以看看啦 <!DOCTYPE html><html lang="en"><head> <me ...
- var a =10 与 a = 10的区别
学习文章------汤姆大叔-变量对象 总结笔记 变量特点: ①变量声明可以存储在变量对象中.②变量不能直接用delete删除. var a =10 与 a = 10的区别: ①a = 10只是为全局 ...
- 52张扑克牌快速生成js
function* generatePoker() { const points = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']; yield* ...