ZOJ - 4089 :Little Sub and Isomorphism Sequences (同构 set)

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

题意:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构。

思路:最长同构子串对总是会重叠的,然后两个子串不重叠的部分必须是同构。 那么一定有,最优之一就是“x+公共”与“公共+x”这两个同构最长。

这个不难反证。 那么实现就是每种树建立set,然后保存每个set的最远距离即可。

#include<bits/stdc++.h>
#define rep(i,w,v) for(int i=w;i<=v;i++)
using namespace std;
const int maxn=200010;
int a[maxn],b[maxn],c[maxn],x[maxn],y[maxn],tot;
set<int>s[maxn];
multiset<int>S;
multiset<int>::iterator it;
int main()
{
    int T,N,M,ans;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&M); tot=0;
        rep(i,1,N) scanf("%d",&a[i]),b[++tot]=a[i];
        rep(i,1,M){
            scanf("%d",&c[i]);
            if(c[i]==1) {
                scanf("%d%d",&x[i],&y[i]);
                b[++tot]=y[i];
            }
        }
        sort(b+1,b+tot+1);
        tot=unique(b+1,b+tot+1)-(b+1);
        S.clear(); rep(i,1,tot) s[i].clear();
        rep(i,1,N) {
            a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
            s[a[i]].insert(i);
        }
        rep(i,1,tot) if(!s[i].empty())
          S.insert(*(--s[i].end())-*s[i].begin());
        rep(i,1,M){
            if(c[i]==2){
                ans=-1;
                if(!S.empty()) ans=*(--S.end());
                if(ans==0) ans=-1;
                printf("%d\n",ans);
            }
            else {
                it=S.find(*(--s[a[x[i]]].end())-*s[a[x[i]]].begin());
                s[a[x[i]]].erase(x[i]);
                S.erase(it);
                if(!s[a[x[i]]].empty()) S.insert(*(--s[a[x[i]]].end())-*s[a[x[i]]].begin());

                y[i]=lower_bound(b+1,b+tot+1,y[i])-b; a[x[i]]=y[i];
                if(!s[y[i]].empty())  S.erase(S.find(*(--s[y[i]].end())-*s[y[i]].begin()));
                s[y[i]].insert(x[i]);
                S.insert(*(--s[y[i]].end())-*s[y[i]].begin());
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/10293407.html

时间: 2024-10-17 03:43:21

ZOJ - 4089 :Little Sub and Isomorphism Sequences (同构 set)的相关文章

ZOJ-4089-Little Sub and Isomorphism Sequences

给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构. 当存在两个不相交的区间同构时,如: 1.2.…….n -1.n.n + 1.…….m.m + 1.m + 2. …….m + n - 1.m + n;(假设m > n&&[1, n]和[m + 1, m + n]同构) 那么 K = n 显然是存在的.但是这不是最大的K,因为[1, m]和[n + 1, n + m]也一定同构(使两边同时加上一个相同区间) 所以这题可以简化为找到一个区

ZOJ 3602 Count the Trees 树的同构 (哈希)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4705 题意:给出两棵二叉树A和B,问分别处于A中的子树a和处于B中的子树b结构相同的有多少对. 思路:哈希的想法,不同的数字对应的是不同的结构,比如1代表着单独的叶子结点,2代表着有左子树是叶子结点而没有右子树的子树...每出现一种新的子树情形就记录下来,记录的方式是用dfs回溯过程中判断左子树和右子树组成的子树是否出现过(用pair记录子树的情况,也就是左右子树,两个

ZOJ Monthly, January 2019

A: Little Sub and Pascal's Triangle Solved. 题意:求杨辉三角第n行奇数个数 思路:薛聚聚说找规律,16说Lucas 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 ll n; 8 9 int main() 10 { 11 int t; 12 scanf("%d", &t); 13 while(t--) 14 {

dir(),divmod(),eval(),exec() 2018-10-6

#内置函数源码 def dir(p_object=None): # real signature unknown; restored from __doc__ """ dir([object]) -> list of strings If called without an argument, return the names in the current scope. Else, return an alphabetized list of names compris

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

ZOJ 3233 Lucky Number

Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original ID: 323364-bit integer IO format: %lld      Java class name: Main Watashi loves M mm very much. One day, M mm gives Watashi a chance to choose a number

子图同构算法系列(1)

取自 1976 Ullmann Part2 Naive alogrithm for Subgraph Isomorphism. 1. 如何判定子图同构. 有个Gα和Gβ, Gα有pa个点,qa条边,Gβ有pb个点,qb条边.A是Gα的邻接矩阵,相应的B是Gβ的邻接矩阵.那么如何判断同构呢.设A是子图,B是原图.那么有一个A的点到B的点的映射.这个映射的模式叫做M.M是pa行,pb列的.M有一个性质就是每行只有一个1,每列至多一个1.这个就是一个A中的点到B中的点的一个映射.我们定义一个C = [

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

zoj Gao The Sequence

Gao The Sequence Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a sequence of integers, A1,A2,...,An. And you are allowed a manipulation on the sequence to transform the origin sequence into another sequence B1,B2,...,Bn(Maybe the tw