传送门: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:

  1. ;
  2. 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】的更多相关文章

  1. ZOJ Monthly, January 2019

    A: Little Sub and Pascal's Triangle Solved. 题意: 求杨辉三角第n行奇数个数 思路: 薛聚聚说找规律,16说Lucas 答案是 $2^p \;\;p 为 n ...

  2. ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089

    写这篇博客来证明自己的愚蠢 ...Orz  飞机 题意:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构 题解:经过一些奇思妙想后 ,你可以发现问题是传 ...

  3. 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 ...

  4. ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)

    在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵  , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...

  5. ZOJ Monthly, January 2018 训练部分解题报告

    A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...

  6. matrix_2015_1 138 - ZOJ Monthly, January 2015

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844 第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相 ...

  7. ZOJ Monthly, January 2018

    A 易知最优的方法是一次只拿一颗,石头数谁多谁赢,一样多后手赢 #include <map> #include <set> #include <ctime> #in ...

  8. ZOJ Monthly, January 2018 Solution

    A - Candy Game 水. #include <bits/stdc++.h> using namespace std; #define N 1010 int t, n; int a ...

  9. ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle

    这个题的话,它每行奇数的个数等于该行行号,如果是0开始的,就该数的二进制中的1的个数,设为k,以它作为次数,2k就是了. #include <stdio.h> int main() { i ...

随机推荐

  1. php中array_walk() 和 array_map()两个函数区别

    两个函数的共性和区别: 1.传入这两个函数的 $value,就是数组中的单一个元素. 2.array_walk() 仅返回true或者false,array_map() 返回处理后的数组: 3.要得到 ...

  2. log4j 简单用法

    maven添加必要库: <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <gro ...

  3. 修改django 后台admin用户的密码

    python manage.py shellfrom django.contrib.auth.models import User from django.contrib.auth.models im ...

  4. Oracle OCI操作UDT相关学习(二)

    沿用 Oracle OCI操作UDT相关学习 一文中定义的类型和表. 1.更改数据 在sqldeveloper 中更新数据, update dxl.cust set addr.street='a11' ...

  5. shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃

    这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...

  6. 十二 NIO和IO

    NIO和IO的区别,应用场景? NIO和IO的主要区别 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 面向流和面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的 ...

  7. LeetCode Find Peak Element [TBD]

    说要写成对数时间复杂度,算了想不出来,写个O(n)的水了 class Solution { public: int findPeakElement(const vector<int> &a ...

  8. sql: Compare Tables

    ---使用 UNION.INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式 select * from BookInfoList --存在不同的 selec ...

  9. 类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法

    解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDri ...

  10. TortoiseSvn 取消忽略的文件

    右键,TortoiseSvn->Properties,选择列表的一条(Property svn:Ignore),remove.