ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089
写这篇博客来证明自己的愚蠢 。。。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的更多相关文章
- ZOJ Monthly, January 2019
A: Little Sub and Pascal's Triangle Solved. 题意: 求杨辉三角第n行奇数个数 思路: 薛聚聚说找规律,16说Lucas 答案是 $2^p \;\;p 为 n ...
- 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 ...
- 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 ...
- ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)
在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵 , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...
- ZOJ Monthly, January 2018 训练部分解题报告
A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...
- matrix_2015_1 138 - ZOJ Monthly, January 2015
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844 第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相 ...
- ZOJ Monthly, January 2018
A 易知最优的方法是一次只拿一颗,石头数谁多谁赢,一样多后手赢 #include <map> #include <set> #include <ctime> #in ...
- ZOJ Monthly, January 2018 Solution
A - Candy Game 水. #include <bits/stdc++.h> using namespace std; #define N 1010 int t, n; int a ...
- ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle
这个题的话,它每行奇数的个数等于该行行号,如果是0开始的,就该数的二进制中的1的个数,设为k,以它作为次数,2k就是了. #include <stdio.h> int main() { i ...
随机推荐
- dpdk中kni模块
一,什么是kni,为什么要有kni Kni(Kernel NIC Interface)内核网卡接口,是DPDK允许用户态和内核态交换报文的解决方案,模拟了一个虚拟的网口,提供dpdk的应用程序和lin ...
- Django框架 之 跨域请求伪造
Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...
- [原创]编译CLANG时遇到问题的解决办法
CLANG备忘录: 1.编译时遇到 LINK1123 错误尝试使用其他版本的VS编译,可以有效解决这个问题 2.编译时遇到 Unexpectedfailure executing llvm-build ...
- 简单基础路径配置(单用JSP)EASYUI
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- bug记录:IE8,包含块min-height/height共存时的高度计算bug
问题的条件有: A元素是B元素的包含块. A元素设置overflow:hidden;,并同时设置了height和min-height,同时height计算值 < min-height 原生IE8 ...
- JPA注解解析
最近学习hibernate注解形式配置POJO类,将注解的解析记下来,以备以后使用. 例1. @Entity@Table(name="user") public class Fl ...
- Linq学习<二>
http://www.cnblogs.com/wyqlijin/archive/2011/02/25/1964934.html 这位仁兄写的比较高深,建议大家看看 一: 这一篇以一个数据类为例,操作数 ...
- 编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串
建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式 ...
- 策略与计费控制(PCC)流程与信令流程
该文为3GPP TS23.203-be0 条款6-7译文 策略与计费控制(PCC)流程[^4] IP-CAN 会话有三种显著的场景: 无网关控制会话需求,不会出现网关控制建立 需要网关控制会话支持:B ...
- [.net 多线程 ]ReaderWriterLock
ReaderWriterLock 用于同步对资源的访问.在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问.在资源不经常发生更改的情况下,ReaderWriterLock 所提供 ...