zoukankan      html  css  js  c++  java
  • 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]也一定同构(使两边同时加上一个相同区间)

    所以这题可以简化为找到一个区间首尾元素相同,求最大区间长度;

    Accepted 4089 C++11 1200 23516
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1e5 + 5;
    map<int, set<int> > mp;
    multiset<int> ans;
    int arr[MAXN];
    int main() {
        int t, n, m;
        scanf("%d", &t);
        while (t--) {
            mp.clear();
            ans.clear();
            scanf("%d%d", &n, &m);
            for (int i = 1; i <= n; i++) {
                scanf("%d", &arr[i]);
                mp[arr[i]].insert(i);
            }
            for (auto i : mp) {
                ans.insert(*(--i.second.end()) - *i.second.begin());
            }
            int op, x, y;
            while (m--) {
                scanf("%d", &op);
                if (op == 2) {
                    if (*(--ans.end()) == 0) {
                        puts("-1");
                    } else {
                        printf("%d
    ", *(--ans.end()));
                    }
                } else {
                    scanf("%d%d", &x, &y);
                    auto it = ans.find(*(--mp[arr[x]].end()) - *mp[arr[x]].begin());
                    ans.erase(it);
                    mp[arr[x]].erase(x);
                    if (!mp[arr[x]].empty()) {
                        ans.insert(*(--mp[arr[x]].end()) - *mp[arr[x]].begin());
                    }
    
                    if (!mp[y].empty()) {
                        it = ans.find(*(--mp[y].end()) - *mp[y].begin());
                        ans.erase(it);
                    }
                    arr[x] = y;
                    mp[y].insert(x);
                    ans.insert(*(--mp[y].end()) - *mp[y].begin());
                }
            }
        }
        return 0;
    }

    可能表述不是很清楚,这题参考了一下https://www.cnblogs.com/hua-dong/p/10293407.html这位大佬的博客;

  • 相关阅读:
    JS防Yahoo的选项卡导航特效
    纯CSS制作简洁带提示的导航
    绿色简单的CSS下拉菜单
    JS+CSS防FLASH效果竖向可折叠的滑动菜单
    鼠标划过快速展开的JS下拉菜单
    ASP.NET页面生命周期(转载)
    JS Eval函数作用(转载)
    Html十个不常用的标签(转载)
    CSS定位学习
    FireBug调试器相关(转载)
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/10295711.html
Copyright © 2011-2022 走看看