4527: K-D-Sequence

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 145  Solved: 59

Description

我们称一个数列为一个好的k-d数列,当且仅当我们在其中加上最多k个
数之后,数列排序后为一个公差为d的等差数列。
你手上有一个由n个整数组成的数列a。你的任务是找到它的最长连续子
串,使得满足子串为好的k-d数列。

Input

第一行包含三个用空格隔开的整数n,k,d(1<=n<=2*10^5;0<=k<=
2*10^5;0<=d<=10^9)。第二行包含n个空格隔开的整数:a1,a2,...,an(-10^9<=ai<=10^9)表示数列a。

Output

输出两个用空格隔开的整数L,r(1<=L<=r<=n),表示数列a_L,a_L+1,...,
ar是好k-d数列的子串中最长的。
如果有多个最优答案,输出那个L值最小的。

Sample Input

6 1 2
4 3 2 8 6 2

Sample Output

3 5
//第一个测试样例的答案为包括数字 2,8,6 的子串——在加入数字 4 并且
排序之后,它变成了数列 2,4,6,8——公差为 2 的等差数列。

HINT

Source

【分析】

  我应该还是too young吧。。看到题目被吓到了。

  首先,d=0,直接特判啦,for一遍。

  除此之外,各个数都要不相等,然后他们mod d必须相等,所以我们把他们分成mod d相等的一段段。

  然后a全部除以d,那么就变成d=1的情况的。因为有一个限制,最多加k个数,即这一段[j,i]的 max-min+j-i<=k

  即max-min+j<=i+k,枚举右端点i之后,找最左边的j满足这个,线段树维护一个max-min+j的最小值,然后线段树上二分就能询问。

  对于每个数都不相等,别人用的都是map,我离散之后搞了个链表。。

  max和min用单调栈维护。

  我WA了很久是因为mod d那里有些是负数,你最好把所有数弄正再算。。【搞到我大数据调试真是心酸。。

  你也可以膜男神:http://blog.csdn.net/u010600261/article/details/53761943

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define Maxn 400010
#define INF 0x7fffffff int mymax(int x,int y) {return x>y?x:y;}
int mymin(int x,int y) {return x<y?x:y;} int a[Maxn];
int n,k,d; void solve1()
{
int mx=,id,st=;
for(int i=;i<=n;i++)
{
if(a[i]!=a[i+]||i==n)
{
if(mx<i-st+) mx=i-st+,id=st;
st=i+;
}
}
printf("%d %d\n",id,id+mx-);
}
int nt[Maxn],cc[Maxn]; struct node
{
int l,r,lc,rc,mn,lazy;
}tr[Maxn*]; int tot;
int build(int l,int r)
{
int x=++tot;
tr[x].l=l;tr[x].r=r;tr[x].mn=;tr[x].lazy=;
if(l!=r)
{
int mid=(l+r)>>;
tr[x].lc=build(l,mid);
tr[x].rc=build(mid+,r);
}
else tr[x].lc=tr[x].rc=,tr[x].mn=l;
return x;
} void upd(int x)
{
tr[x].mn+=tr[x].lazy;
if(tr[x].lazy==||(tr[x].l==tr[x].r)) {tr[x].lazy=;return;}
int lc=tr[x].lc,rc=tr[x].rc;
tr[lc].lazy+=tr[x].lazy;
tr[rc].lazy+=tr[x].lazy;
tr[x].lazy=;
} void change(int x,int l,int r,int z)
{
if(tr[x].l==l&&tr[x].r==r)
{
tr[x].lazy+=z;
upd(x);
return;
}upd(x);
int mid=(tr[x].l+tr[x].r)>>;
if(r<=mid) change(tr[x].lc,l,r,z);
else if(l>mid) change(tr[x].rc,l,r,z);
else
{
change(tr[x].lc,l,mid,z);
change(tr[x].rc,mid+,r,z);
}
tr[x].mn=mymin(tr[tr[x].lc].mn,tr[tr[x].rc].mn);
} int query(int x,int l,int r,int y)
{
upd(x);
if(tr[x].mn>y) return -;
if(tr[x].l==tr[x].r) return tr[x].l;
int mid=(tr[x].l+tr[x].r)>>;
if(r<=mid) return query(tr[x].lc,l,r,y);
else if(l>mid) return query(tr[x].rc,l,r,y);
else
{
int nw=query(tr[x].lc,l,mid,y);
if(nw!=-) return nw;
else return query(tr[x].rc,mid+,r,y);
}
} int mx=-,id;
struct hp{int x,id;};
stack<hp > q1,q2;
void solve(int st,int ed)
{
int fr=st;
// while(!q1.empty()) q1.pop();
// while(!q2.empty()) q2.pop();
// printf("%d %d\n",st,ed);
for(int i=st;i<=ed;i++)
{
fr=mymax(fr,nt[i]+);
int edd=i-;
while(!q1.empty())
{
hp x=q1.top();
if(x.x<=a[i]) {q1.pop();change(,x.id,edd,a[i]-x.x);edd=x.id-;}
else break;
}change(,i,i,a[i]);
hp nw;nw.x=a[i];nw.id=edd+;q1.push(nw);
edd=i-;
while(!q2.empty())
{
hp x=q2.top();
if(x.x>=a[i]) {q2.pop();change(,x.id,edd,x.x-a[i]);edd=x.id-;}
else break;
}change(,i,i,-a[i]);
nw.x=a[i];nw.id=edd+;q2.push(nw);
int nj=query(,fr,i,i+k);
if(nj!=-&&mx<i-nj+) mx=i-nj+,id=nj;
}
} void solve2()
{
build(,n);
int st=;
for(int i=;i<=n;i++)
{
if(cc[i]!=cc[i+]||i==n)
{
solve(st,i);
st=i+;
}
}
printf("%d %d\n",id,id+mx-);
} struct col{int x,id;}c[Maxn];int ft[Maxn];
bool cmp(col x,col y) {return x.x<y.x;} void init()
{
int mn=INF;
for(int i=;i<=n;i++) mn=mymin(mn,a[i]);
mn=-mn;if(mn<) mn=;
for(int i=;i<=n;i++) a[i]+=mn;
for(int i=;i<=n;i++) c[i].x=a[i],c[i].id=i;
sort(c+,c++n,cmp);
int p=;cc[c[].id]=;
for(int i=;i<=n;i++)
{
if(c[i].x!=c[i-].x) p++;
cc[c[i].id]=p;
}
for(int i=;i<=p;i++) ft[i]=;
for(int i=;i<=n;i++)
{
nt[i]=ft[cc[i]];
ft[cc[i]]=i;
}
for(int i=;i<=n;i++) cc[i]=a[i]%d,a[i]/=d;
// printf("%d %d %d\n",cc[99989],cc[99996],d);
// for(int i=1;i<=n;i++) printf("%d\n",nt[i]);
} int main()
{
scanf("%d%d%d",&n,&k,&d);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
if(d==) solve1();
else
{
init();
solve2();
}
return ;
}

2017-03-28 11:02:49

【BZOJ 4527】 4527: K-D-Sequence (线段树)的更多相关文章

  1. bzoj 3110 [Zjoi2013]K大数查询——线段树套线段树(标记永久化)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 第一道线段树套线段树! 第一道标记永久化! 为什么为什么写了两个半小时啊…… 本想线段 ...

  2. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  3. BZOJ.4355.Play with sequence(线段树)

    题目链接 问题在于操作二.操作二可以拆分成:区间加\(C\).区间(对\(0\))取\(\max\). 注意到操作一的\(C\)都是非负数,即数列中不会出现负数,所以我们直接维护最小值和最小值出现的次 ...

  4. Wow! Such Sequence!(线段树4893)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  5. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  6. [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】

    题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...

  7. hdu4893Wow! Such Sequence! (线段树)

    Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...

  8. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

  9. BZOJ.1805.[IOI2007]sail船帆(贪心 线段树)

    BZOJ 洛谷 首先旗杆的顺序没有影响,答案之和在某一高度帆的总数有关.所以先把旗杆按高度排序. 设高度为\(i\)的帆有\(s_i\)个,那么答案是\(\sum\frac{s_i(s_i-1)}{2 ...

  10. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)

    BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...

随机推荐

  1. Codeforces Round #420 (Div. 2) A-E

    本来打算划划水洗洗睡了,突然听到这次的主人公是冈部伦太郎 石头门(<steins;gate>)主题的比赛,岂有不打之理! 石头门真的很棒啊!人设也好剧情也赞曲子也特别好听. 推荐http: ...

  2. 【BZOJ】4764: 弹飞大爷 LCT

    [题意]给定n个数字ai,表示大爷落到i处会被弹飞到i+ai处,弹飞到>n或<1处则落地.m次操作,修改一个ai,或询问大爷落到x处经过几次落地(或-1).n,m<=10^5,|ai ...

  3. json格式的一些常用操作方法

    package com.liveyc.restfull.until; import java.util.HashMap; import java.util.Iterator; import java. ...

  4. Spring Cloud全家桶主要组件及简要介绍

    一.微服务简介 微服务是最近的一两年的时间里是很火的一个概念.感觉不学习一下都快跟不上时代的步伐了,下边做一下简单的总结和介绍. 何为微服务?简而言之,微服务架构风格这种开发方法,是以开发一组小型服务 ...

  5. 【洛谷 P3338】 [ZJOI2014]力(FFT)

    题目链接 \[\Huge{E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^{n}\frac{q_j}{(i-j)^2}}\] 设\(A[i]= ...

  6. 【leetcode 简单】第四题 罗马数字转整数

    罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列 ...

  7. Jsoup爬取带登录验证码的网站

    今天学完爬虫之后想的爬一下我们学校的教务系统,可是发现登录的时候有验证码.因此研究了Jsoup爬取带验证码的网站: 大体的思路是:(需要注意的是__VIEWSTATE一直变化,所以我们每个页面都需要重 ...

  8. Skip List(跳跃表)原理详解与实现【转】

    转自:http://dsqiu.iteye.com/blog/1705530 Skip List(跳跃表)原理详解与实现 本文内容框架: §1 Skip List 介绍 §2 Skip List 定义 ...

  9. Ubuntu命令设置ip网关dns

    本文系转载,介绍Ubuntu如何设置IP和网络来连接网络 如果是在虚拟机中使用Ubuntu,那么设置之前请先参照我的上一遍文章虚拟机Net方式设置连接外网中的网络设置部分,先设置好主机的网络,然后配置 ...

  10. 保护眼睛(改变窗口颜色和Pdf背景颜色)

    保护眼睛(改变窗口颜色和Pdf背景颜色) 昨天用了一个好朋友告诉我的保护眼睛的方法,效果很不错哦-- 今天告诉大家,一起爱护偶们明亮的眼睛吧!!!       首先需要改一下设置,如果常常用电脑很容易 ...