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,一个 ...
随机推荐
- javascript 公历与农历相互转换工具类
/** * 公历[1900-1-31,2100-12-31]时间区间内的公历.农历互转 * @charset UTF-8 * @Author Jea杨(JJonline@JJonline.Cn) * ...
- Linux下打包、压缩和解压
命令使用:tar 主选项+辅选项 压缩后文件名 要压缩的文件 -c 建立压缩文件(常用) -x 解压(常用) -t 查看压缩文件(常用) -r 向压缩文件末尾追加文件 -u 更新一个压缩包中的文 ...
- javascript中对象属性的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android RecyclerView、ListView实现单选列表的优雅之路.
一 概述: 这篇文章需求来源还是比较简单的,但做的优雅仍有值得挖掘的地方. 需求来源:一个类似饿了么这种电商优惠券的选择界面: 其实就是 一个普通的列表,实现了单选功能, 效果如图: (不要怪图渣了 ...
- Android--XML页面的编写
五个页面 代码如下: 图片资源链接: https://pan.baidu.com/s/1jIoTDGE // 第一个 <RelativeLayout xmlns:andr ...
- 一个不错的学习android的网站
http://androiddoc.qiniudn.com/guide/topics/ui/overview.html,最近想学下android的开发,找了一下网上的资料,中文的说的觉得太概括,看不太 ...
- 01--Qt扫盲篇
Qt扫盲篇 1.What is Qt 一个跨平台应用程序和UI开发框架,主要偏向于UI框架方面,由诺基亚公司开发维护. 使用 Qt 只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操 ...
- Swfit4.0中JSON与模型原生互转(JSONEncoder/JSONDecoder的使用)
在Objective-C中,苹果并没有提供JSON转模型(模型转JSON)的接口,往往在开中需要添加第三库来处理JSON数据,比如:JsonModel.MJExtension.Mantle.JsonK ...
- Swift - what's the difference between metatype .Type and .self?
Declaration typealias AnyClass = AnyObject.Type .Type The metatype of a class, structure, or enumera ...
- C# 把对象序列化 JSON 字符串 和把JSON字符串还原为对象
/// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...