写这篇博客来证明自己的愚蠢 。。。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. c语言学习笔记 switch case语句为什么要加break

    先来看一个没有break的例子: int main() { int a = 1; switch (a) { case 1: printf("1"); case 2: printf( ...

  2. 前端基础 之 Bootstrap框架

    浏览目录 Bootstrap介绍 为什么要使用Bootstrap? Bootstrap环境搭建 布局容器 栅格系统 Bootstrap全局样式 一.Bootstrap介绍 Bootstrap是Twit ...

  3. linux蓝屏时间修改

    setterm -blank 2   #/etc/profile里添加这样一句话,可以让屏幕2分钟后没有信号(蓝屏) setterm -blank 0   #/etc/profile里添加这样一句话, ...

  4. hdu 2206 IP的计算(最全的注意事项)

    注意: 1.非法字符(包括空格) 如下都是错的 A.145.124.4 192.168.18 123(用scanf输入的话,则接收的是:192.168.18) 2.'.'有且仅有3个,且不能连续出现, ...

  5. session的应用----验证码

    昨天登录功能中叙述了密码 用户名的数据库验证以及转发 那么这篇文章在昨天的基础上 处理验证码的验证功能,今天需要用到session域,session用于一次会话. package cn.lijun.d ...

  6. HTML & CSS设计与构建网站 ([美]达科特) PDF原版​

    HTML & CSS 设计与构建网站采用有别于许多传统编程书籍的新颖编排方式,将使您收到事半功倍的学习效果.每一页都在短小精悍的示例代码的引导下,简明直观.直截了当地阐述一个新主题. < ...

  7. 微信小程序设计稿pt怎么转rpx

    什么是逻辑分辨率? 什么是物理分辨率? 什么是DPI?(Dots Per Inch) 最早的时候,这个单位是用来描述打印机的性能的,意思是每英寸能打多少个墨点,毫无疑问,DPI越高,打印出来的东西就会 ...

  8. 1235: 入学考试[DP]

    1235: 入学考试 [DP] 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 12 统计 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近 ...

  9. kali linux之拒绝服务

    Dos不是DOS(利用程序漏洞或一对一资源耗尽的denial of service拒绝服务) DDoS分布式拒绝服务(多对一的攻击汇聚资源能力,重点在于量大,属于资源耗尽型) 历史 以前:欠缺技术能力 ...

  10. rsync入门

    rsync是Linux/unix下一个用于远程文件(目录)同步的一个精巧的小工具程序,有很多文章讨论了其功能和实现原理,本文主要就不赘述了. 主要介绍下实践时使用的一些方法和细枝末节留作工作笔记以便日 ...