BZOJ 4358 坑 莫队+线段树 死T
这是一个坑
竟然卡nsqrt(n)logn
T死 等更
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define Max(x,y) x>y?x:y;
const int N=50050,T=50050*8;
int n,m,Block,a[N],block[N],sum[T],lmax[T],rmax[T],maxx[T],num[T];
struct Ask{int l,r,id,ans;}ask[N];
bool cmp(Ask a,Ask b){
if(block[a.l]!=block[b.l])return a.r<b.r;
return a.l<b.l;
}
bool cmpid(Ask a,Ask b){return a.id<b.id;}
void insert(int l,int r,int pos,int num,int wei){
if(l==r){
sum[pos]+=wei;
if(sum[pos])sum[pos]=lmax[pos]=rmax[pos]=maxx[pos]=1;
else sum[pos]=-40000,lmax[pos]=rmax[pos]=maxx[pos]=0;
return;
}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<num)insert(mid+1,r,rson,num,wei);
else insert(l,mid,lson,num,wei);
sum[pos]=sum[lson]+sum[rson];
lmax[pos]=Max(lmax[lson],sum[lson]+lmax[rson]);
rmax[pos]=Max(rmax[rson],sum[rson]+rmax[lson]);
maxx[pos]=Max(maxx[lson],maxx[rson]);
maxx[pos]=Max(lmax[rson]+rmax[lson],maxx[pos]);
}
inline int read(){
char p=getchar();int x=0;
while(p<'0'||p>'9')p=getchar();
while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();
return x;
}
int main(){
for(int i=1;i<T;i++)sum[i]=-40000;
n=read(),m=read();
for(int i=1;i<=n;i++)*(a+i)=read();
for(int i=1;i<=m;i++)ask[i].l=read(),ask[i].r=read(),ask[i].id=i;
Block=sqrt(n);
for(int i=1;i<=n;i++)block[i]=(i-1)/Block+1;
sort(ask+1,ask+1+m,cmp);
for(int i=1,l=1,r=0;i<=m;i++){
for(;l<ask[i].l;l++)insert(1,n,1,a[l],-1);
for(;l>ask[i].l;l--)insert(1,n,1,a[l-1],1);
for(;r<ask[i].r;r++)insert(1,n,1,a[r+1],1);
for(;r>ask[i].r;r--)insert(1,n,1,a[r],-1);
ask[i].ans=maxx[1];
}
sort(ask+1,ask+1+m,cmpid);
for(int i=1;i<=m;i++)printf("%d\n",ask[i].ans);
}
2017.4.27 Update
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n,m,col[N],Block,block[N],L[N],R[N],Ans[N],ans,ls[N],rs[N];
int stk1[N],stk2[N],rec1[N],rec2[N];
struct Node{int l,r,id;}node[N];
bool cmp(Node a,Node b){
if(block[a.l]!=block[b.l])return a.l<b.l;
return a.r<b.r;
}
int main(){
scanf("%d%d",&n,&m);Block=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&col[i]),block[i]=(i-)/Block+;
for(int i=;i<=m;i++)scanf("%d%d",&node[i].l,&node[i].r),node[i].id=i;
for(int i=;i<=n;i++)R[block[i]]=i;
for(int i=n;i;i--)L[block[i]]=i;
sort(node+,node++m,cmp);
for(int i=,l,r;i<=m;i++){
if(block[node[i].l]!=block[node[i-].l]){
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
l=r=R[block[node[i].l]],ans=;
}
while(r<node[i].r){
r++;
ls[col[r]]=ls[col[r]-]+,rs[col[r]]=rs[col[r]+]+;
int t=rs[col[r]]+ls[col[r]]-;
rs[col[r]-ls[col[r]]+]=t,ls[col[r]+rs[col[r]]-]=t;
ans=max(ans,t);
}int temp=ans,top=;
for(int j=node[i].l;j<=min(node[i].r,l);j++){
ls[col[j]]=ls[col[j]-]+,rs[col[j]]=rs[col[j]+]+;
int t=rs[col[j]]+ls[col[j]]-;
int tx=col[j]-ls[col[j]]+,ty=col[j]+rs[col[j]]-;
stk1[++top]=tx,rec1[top]=rs[tx];
stk2[top]=ty,rec2[top]=ls[ty];
rs[tx]=t,ls[ty]=t,temp=max(temp,t);
}Ans[node[i].id]=temp;
for(int j=top;j;j--)
rs[stk1[j]]=rec1[j],ls[stk2[j]]=rec2[j];
for(int j=node[i].l;j<=min(node[i].r,l);j++)ls[col[j]]=rs[col[j]]=;
}
for(int i=;i<=m;i++)printf("%d\n",Ans[i]);
}
BZOJ 4358 坑 莫队+线段树 死T的更多相关文章
- Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树
E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
- BZOJ 4129 树上带修莫队+线段树
思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...
- bzoj 4358 Permu - 莫队算法 - 链表
题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...
- 【CF633H】Fibonacci-ish II 莫队+线段树
[CF633H]Fibonacci-ish II 题意:给你一个长度为n的序列$a_i$.m个询问,每个询问形如l,r:将[l,r]中的所有$a_i$排序并去重,设得到的新数列为$b_i$,求$b_1 ...
- Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵
H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...
- [hdoj6483][莫队+线段树/ST]
A Sequence Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- [bzoj4358]permu:莫队+线段树/回滚莫队
这道题是几天前水过去的,现在快没印象了,水一发. 首先我们看到它让求解的是最长的值域 连续段长度,很好. 然后就想到了山海经,但但是我还没有做. 然后又想到了很久以前的一次考试的T3旅馆hotel(我 ...
- bzoj 4358: permu 莫队
第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...
随机推荐
- poj1111 Image Perimeters 广搜
题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...
- 避免关注底层硬件,Nvidia将机器学习与GPU绑定
Nvidia释放的一组cuDNN的库,有效的实现了其与多种深度学习框架的整合.基于cuDNN,加速了代码的运行,同时让研究员避免去关心底层硬件性能. 关键字: 编程语言语音识别Nvidia 原文链接: ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
http://www.cnblogs.com/wuhuacong/p/3284628.html 自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到 ...
- 谈谈网页中的ajax
一个页面上有很多的ajax请求,这样的页面右键查看源文件是没法看到全部的html.事实上,这种网页也是从正常的html页面改造过来的,常用的一个场景是,同一个区域大量循环,在动态页面里(比如jsp等) ...
- java操作Excel的poi的简介
一.POI概述 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 结构: HSSF - 提供读写Mi ...
- 什么是J2EE的集群?
1. 前言 现在有越来越多的关键应用和大型应用是基于J2EE 来创建的,像银行系统和帐单系统这些关键应用要求有很高的可用性,而Google 和Yahoo 这样的大型应用就需要很好的可扩 ...
- JavaScript JSON简单操作(增删改)
JavaScript 中对json处理: 声明;: var json={};或 json={"name":"asd","age":24}; ...
- ELK介绍及搭建 Elasticsearch 分布式集群
上:https://blog.51cto.com/zero01/2079879 下:https://blog.51cto.com/zero01/2082794
- Mybaitis-generator生成数据对象和时间的优化
1.本章涉及到知识点,Mybaitis-generator生成数据对象和时间,xml的引用*.properties 外部文件(在这之前必须导入了mybaitis的核心架包) A.在pom.xml的案例 ...
- ubuntu 下jrtplib编译
我本来想用最新的 jrtplib-3.9.1和jthread-1.3.1,可是最新的那两个版本中都是用cmake进行配置的,我搞了好久,查了好多资料也没有解决交叉编译的问题,无奈,只能选用比较老的两个 ...