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,一个 ...
随机推荐
- 数据结构——栈的实现(数组、Java)
巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...
- R 连接DB2数据库,并制作词图
#写在前面的话:此教程主要是用R连接了DB2数据库,并进行文本分析,制作了词图 #教程为markdown编写 ---title: "网站留言分析"output: html_docu ...
- mysql数据库索引原理及其常用引擎对比
索引原理 树数据结构及其算法简介 B+/-树: - 多路搜索树; - 时间复杂度O(logdN);h为节点出度,d为深度 红黑树: - 节点带有颜色的平衡二叉树 - 时间复杂度O(log2N);h节点 ...
- Arduino UNO R3
Arduino 常见型号 当然还有 LilyPad,附图: 最常见的自然是UNO,最新版是第三版R3: 国内也有一些改进的板子.我用的是一般的板子,拿到货也只能默默了. 简介 The Uno is a ...
- 如何像Uber一样给工程师派单 解放外包落后的生产力
2014年,陈柯好的第一个创业项目失败,半年之内,陈柯好以技术合伙人的方式游走于旅游.电商.团购.票务等各种领域.正当他对职业方向感到迷茫时,“大众创业.万众创新”的口号被提了出来 一时间,技术需求被 ...
- TF从文件中读取数据
从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...
- Mysql重复数据查询置为空
前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空. 需求并不难,用程序代码循环处理就可以了.但是后面涉及到打印 ...
- Java中Scanner类的使用
一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 System.in 中读取一个数: public class ApiScanner { public static void ...
- Java导出Excel文件的两种方法
将数据以Excel表格的形式导出:首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:<dependency> <groupId>org. ...
- bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...