传送门: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学习3——数组

    主要内容: 简介 常用的方法 循环遍历数组 PHP预定义数组 数组的处理函数 数组 PHP由于是弱类型的语言,他的变量类型是可以自由变换的,他的数组很自由,长度是可以动态增加的. 他的索引默认为数字0 ...

  2. spring-boot之简单定时任务

    首先是pom.xml依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  3. 【转】.NET 4.5 使用async和await关键字调用异步方法

    async和await关键字是.NET 4.5新增加的异步编程方式,通过使用这两个关键字可以轻松便捷的编写异步方法.使用async关键字声明异步方法,使用await关键字等待和获取异步方法返回的结果. ...

  4. redis(1)简介

    一.nosql简介 RDBMS(关系型数据库)提供的结构化编程,让数据建模以及应用程序编程变得非常简单,带来了非常高的经济效益,并且学习成本也比较低.但在当今数据大爆炸时代,每时每刻都会海量的数据产生 ...

  5. 初学zookeeper--自定义事件监听

    zk有四种节点类型: 持久节点,持久顺序节点,临时节点,临时顺序节点. 自定义监听事件时,在节点的创建,修改,删除的方法第一行都需要加入是否监听的一个方法: //开启监听的方法.第二个参数表示是否开启 ...

  6. Spring课程 Spring入门篇 5-7 advisors

    1 简析 1.1 advisor简析(这个不太明白,后续再看吧) 2 代码演练 2.1 环绕通知的综合应用(代码和视频对不上,慕课网讲的本身有问题)       1 简析 1.1 advisor简析( ...

  7. 小白学flask之hello,world

    from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "He ...

  8. js实现浏览器窗口缩放刷新

    两行代码 $(window).resize(function () { location.reload(); })

  9. ssh和scp详解

    一.SSH客户端使用 使用ssh客户端远程登陆到指定的计算机: $ ssh {user}@{remote} -o IdentityFile=/home/id_rsa -o StrictHostKeyC ...

  10. Angularjs ngTable使用备忘

    项目中用到angularjs的表格ng-table,功能相当强大,像搜索.排序.checkbox.分页.每页表格显示数目等都有.API,demo什么的也只能参考官网了.这里做个备忘,哪天肯定还会用到. ...