写这篇博客来证明自己的愚蠢 。。。Orz 

飞机

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

题解:经过一些奇思妙想后 ,你可以发现问题是传化为了查询一个最大的区间这个区间的开头和结尾是相同的 ;

所以如果我们知道了某个数的最小位置与最大位置 , 我们是不是就可以很快的知道这个答案了 , 那问题又会来了 , 我怎样得到这个最早和最晚呢 ? 这里相当的疯狂 , 开了20W的set , 没错就是set , 其本身也是排了序的 , 所以我们将某数的所有的位置都放入到对应的set , 我们是不是就可以很快的查找与删除了;

但是题目给出的数据有10^9 , 我们是不是需要离散化 , 可是又带有修改 , 那我们是不是参考离线的打法 , 先将所以需要用的的数字存下来 , 离散化呀 ;

那问题又来拉 , 我怎么可以很快的得到最大的区间 , 我看到网上是有用线段树的Orz , 我是不会拉 , 所以我用了set..  没有看错 ,就是set  , 不过这个set 是一个结构体set ,里面记录的是某个数与这个数字对应的区间长度 , 为什么没有想到优先队列呢 , 很显然修改是会改变对应数的对应区间最大值 ,所以我们得用利于修改的数据结构 ,于是。。。。这题就set。。。

然后!!!我DUG了一晚 , 原来set 的删除并不是单纯的删除某数 , 比如你要删除X , 你要这样打 ,G.erase(G.find(X)); 卧槽。。我直接G..erase(X)  被自己蠢哭。。。还要注意删除前要判断容器里面是否有这样数,没有就不可以删除,这些是血的教训,希望我以后可以记得。Orz

#include<bits/stdc++.h>
using namespace std ;
#define N 200001 set<int> ST[N];
int a[N],b[N],n,m;
int Len;
struct no
{
int op , x, y;
}q[N]; struct NO
{
int id;
int val;
bool operator < (const NO &a) const
{
return a.val<val;
}
}M,MM;
multiset<NO>G;
multiset<NO>::iterator it;
void Hash()
{
sort(b+,b++Len);
Len=unique(b+,b++Len)-b-; for(int i= ; i<=n ; i++)
a[i]=lower_bound(b+,b++Len,a[i])-b; for(int i= ; i<=m ; i++)
{
if(q[i].op==)
{
q[i].y=lower_bound(b+,b++Len,q[i].y)-b;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i= ; i<=n+m ; i++ )
ST[i].clear();
Len=;G.clear();
memset(q,,sizeof(q));
for(int i= ; i<=n ; i++)
{
scanf("%d",&a[i]);
b[++Len]=a[i];///离散化
}
for(int i= ; i<=m ; i++)
{
int op,x,y;
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&x,&y);
q[i].op=op ; q[i].x=x ; q[i].y=y;
b[++Len]=y;
}
}
Hash();
for(int i= ; i<=n ; i++)
ST[a[i]].insert(i); for(int i= ; i<=n+m ; i++)
{
if(ST[i].size()>=)
{
M.id=i; M.val=(*ST[i].rbegin())-(*ST[i].begin());
G.insert(M);
}
} for(int i= ; i<=m ; i++)
{
if(q[i].op==)
{ int v = a[q[i].x] , X=q[i].x , Y=q[i].y;
int LEN=(*ST[v].rbegin())-(*ST[v].begin());
M.id=v; M.val=LEN;
if(ST[v].find(X)!=ST[v].end())
ST[v].erase(ST[v].find(X)); if(G.find(M)!=G.end())
G.erase(G.find(M)); if(ST[v].size()>=)
{
M.val=(*ST[v].rbegin())-(*ST[v].begin());
G.insert(M);
}
a[X]=Y;
v=Y;
if(ST[v].size()>=)
{
M.id=v;
M.val=(*ST[v].rbegin())-(*ST[v].begin());
G.erase(G.find(M));
}
ST[v].insert(X);
if(ST[v].size()>=)
{
M.id=v ; M.val=(*ST[v].rbegin())-(*ST[v].begin());
G.insert(M);
}
}
else
{ if(G.empty())
puts("-1");
else
{
M=(*G.begin());
if((M.val)==)
puts("-1");
else
printf("%d\n",(M.val));
} }
/* printf("%d\n",i);
for(it=G.begin() ; it!=G.end() ; it++)
{
MM=*it;
printf("%d %d\n",MM.id,MM.val);
}*/ } }
return ;
}

ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089的更多相关文章

  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 Little Sub and his Geometry Problem 【推导 + 双指针】

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5861 Little Sub and his Geometry Prob ...

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

  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. Python04 range()方法的使用、turtle.textinput()方法和write()的使用、turtle.numinput()的使用

    1 range() 方法的使用 1.1 range方法介绍 range方法会返回一个range类型的对象,该对象会根据range方法的参数产生一些列整型数据 技巧01:range方法有三个参数,第一个 ...

  2. ubuntu 设置虚拟机和主机在同一网段

    一.在VMware中将网络连接方式设置为桥接 1.打开VM菜单栏->Settings 2.在弹出的Virtual Machine Setting对话框中点击Network Adapter,在右边 ...

  3. PHP删除目录

    function delDir($directory) { if(file_exists($directory)) { $dir_handle = @opendir($directory); if($ ...

  4. go语言 defer 你不知道的秘密!

    go 语言的defer功能强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.我们先来看几个例子. 例一: defer 是先进后出 这个很自然,后面的语句会依赖前面的资源,因此如果先前面的资源先 ...

  5. constexpr函数------c++ primer

    constexpr函数是指能用于常量表达式的函数.定义constexpr函数的方法有其他函数类似,不过要遵循几项约定:函数的返回值类型及所以形参的类型都是字面值类型,而且函数体中必须有且只有一条ret ...

  6. Centos7.5的定制化安装

    一.前言 关于定制化centos7.5的镜像真的是历经波折,前前后后.来来回回尝试了不少于20次,上网找了各种关于定制7系统的方法,都没有成功... 但最终功夫不负有心人终于解决了,O(∩_∩)O哈哈 ...

  7. c++11时间相关库(chrono)

    以下整理自:https://www.2cto.com/kf/201404/290706.html chrono 库主要包含了三种类型:时间间隔 Duration.时钟 Clocks 和时间点 Time ...

  8. HDU6301-2018ACM暑假多校联合训练1004-Distinct Values

    题意是一个长度为n的序列,给你m组区间(l,r),在这个区间里不能填入重复的数字,同时使整个序列字典序最小 同学用的优先队列,标程里使用的是贪心同时使用set维护答案序列 贪心是先采用pre数组来确定 ...

  9. 【Es】jest操作elasticsearch

    https://blog.csdn.net/niuchenliang524/article/details/82869319 操作es的客房端有多个,在此例出三种(具体区别自行百度),本文讲的是jes ...

  10. JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

    套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...