写这篇博客来证明自己的愚蠢 。。。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. Docker学习笔记_安装和使用Redis

    一.准备 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04 3.操作账号:Docker 二.安装过程 1.搜索Redis                         su ...

  2. 执行CUnit测试出错

    est/test_fifo.test: error while loading shared libraries: libcunit.so.1: cannot open shared object f ...

  3. css属性position的运用

    随着web标准的规范化,网页的布局也随之千变万化.各种复杂漂亮有创意的页面布局冲 击这人们的视野,相比以前的table布局那就不是一等级的事儿.这个很大一部分功劳是css 样式的引入.而这个多样性布局 ...

  4. Matlab和Python用于深度学习应用研究哪个好?

    Matlab和Python都有一些关于深度学习的开源的解决方案(caffe\DeepMind\TensorFlow),基于哪个开展应用研究好?

  5. Linux:SSH免密码登录

    1.使用包管理器安装openssh: 本人的系统是Arch Linux,因此安装命令为:sudo pacman -S openssh 2.使用ssh-keygen命令创建公钥: #ssh-keygen ...

  6. poj1840 Eqs(hash+折半枚举)

    Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...

  7. Ubuntu的Unable to locate package无法更新源问题解决方案

    https://blog.csdn.net/long19910605/article/details/47017889/ 问题: 更新源时提示不能联网(does the network require ...

  8. android android studio

     android studio 一.安装及步骤: Android Studio安装: java jdk安装: jdk环境变量配置: 二.遇到的问题: 1.缺少jvm或java jdk路径不对,请指定正 ...

  9. eclipse操作

    1.手动添加组件源码 2.源码阅读技巧 选择类Ctrl+T(Quick Type Hierarchy),查看该类的继承关系: 选择方法Ctrl+Alt+H(Open Call Hierarchy),查 ...

  10. Eclipse下的Hadoop应用开发准备

    window下开发的准备: A.在windows的某个目录下解压一个hadoop的安装包 B.将安装包下的lib和bin目录用对应windows版本平台编译的本地库替换 C.在window系统中配置H ...