BZOJ4491: 我也不知道题目名字是什么
Description
给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串
Input
第一行n,表示A数组有多少元素
接下来一行为n个整数A[i]
接下来一个整数Q,表示询问数量
接下来Q行,每行2个整数l,r
Output
对于每个询问,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串
Sample Input
1 2 3 4 5 6 5 4 3
5
1 6
1 7
2 7
1 9
5 9
Sample Output
6
5
6
4
样例解释
五个询问分别对应
[1,6][1,6][2,6][1,6][6,9]
HINT
N,Q<=50000
Source
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=50010;
const int maxnode=6000010;
struct Query {int l,r,id,next;}Q[maxnode];
int n,cnt,ans[maxn],f[maxn],g[maxn],A[maxn],first[maxn*4],res[maxn*4];
void AddQuery(int o,int ql,int qr,int id) {
Q[++cnt]=(Query){ql,qr,id,first[o]};first[o]=cnt;
}
void solve(int o,int l,int r) {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
if(l==r) {
for(int i=first[o];i;i=Q[i].next) ans[Q[i].id]=max(ans[Q[i].id],1);
res[o]=1;
}
else {
for(int i=first[o];i;i=Q[i].next) {
Query& T=Q[i];
if(T.r<=mid) AddQuery(lc,T.l,T.r,T.id);
else if(T.l>mid) AddQuery(rc,T.l,T.r,T.id);
else if(T.l!=l||T.r!=r) AddQuery(lc,T.l,mid,T.id),AddQuery(rc,mid+1,T.r,T.id);
}
solve(lc,l,mid);solve(rc,mid+1,r);
res[o]=max(res[lc],res[rc]);
int ok;
ok=1;f[mid+1]=1;
rep(i,mid+2,r) {
if(A[i-1]<A[i]) ok=0;
f[i]=f[i-1]+ok;
}
ok=1;if(A[mid]<A[mid+1]) ok=0;f[mid]=ok;
dwn(i,mid-1,l) {
if(A[i+1]>A[i]) ok=0;
f[i]=f[i+1]+ok;
}
res[o]=max(res[o],f[l]+f[r]);
ok=1;g[mid+1]=1;
rep(i,mid+2,r) {
if(A[i-1]>A[i]) ok=0;
g[i]=g[i-1]+ok;
}
ok=1;if(A[mid]>A[mid+1]) ok=0;g[mid]=ok;
dwn(i,mid-1,l) {
if(A[i+1]<A[i]) ok=0;
g[i]=g[i+1]+ok;
}
res[o]=max(res[o],g[l]+g[r]);
for(int i=first[o];i;i=Q[i].next) {
Query& T=Q[i];
if(T.l<=mid&&T.r>mid) ans[T.id]=max(ans[T.id],max(f[T.l]+f[T.r],g[T.l]+g[T.r]));
if(T.l==l&&T.r==r) ans[T.id]=max(ans[T.id],res[o]);
}
}
}
int main() {
n=read();rep(i,1,n) A[i]=read();
int m=read();
rep(i,1,m) {
int l=read(),r=read();
AddQuery(1,l,r,i);
}
solve(1,1,n);
rep(i,1,m) printf("%d\n",ans[i]);
return 0;
}
BZOJ4491: 我也不知道题目名字是什么的更多相关文章
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...
- BZOJ 4491: 我也不知道题目名字是什么
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 278 Solved: 154[Submit][Status][ ...
- BZOJ 4491: 我也不知道题目名字是什么 RMQ
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 317 Solved: 174[Submit][Status][ ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code: #include <string> #include <cstring> #include <cstdio> #include <algorith ...
- [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)
本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...
- Linux shell 只删除目录下所有(不知道文件名字)文件,只删除文件夹
#!/bin/sh RM="rm -rf" function delete_all_dir() { for i in `ls` do if [ -d $i ];then $RM $ ...
随机推荐
- Shell编程基础教程5--文本过滤、正则表达式、相关命令
5.文本过滤.正则表达式.相关命令 5.1.正则表达式(什么是正则表达式?正则表达式怎么进行匹配?常用命令) 简介: 一种用来描述文本模式的特殊语法 ...
- 【转载】Pyqt QSplitter分割窗口
转载来自: http://blog.sina.com.cn/s/blog_4b5039210100h3ih.html 分割窗口在应用程序中经常用到,它可以灵活分布窗口布局,经常用于类似文件资源管理器的 ...
- attributeError:'module' object has no attribute ** 解决办法
写了一个小脚本,执行的时候报错: Traceback (most recent call last): File "F:/test/qrcode.py", line 109, in ...
- 在python中使用concurrent.futures实现进程池和线程池
#!/usr/bin/env python # -*- coding: utf-8 -*- import concurrent.futures import time number_list = [1 ...
- 为什么是 n(n+1)/2 ?
n(n+1)/2是一个数列的元素两两运算后的不重复结果数.如图: 假如数列a = 1,2,3....n.那么该数列内的元素两两相乘,则会构建出上图中的表格,这个表格应该有n x n 个元素. 用程序写 ...
- elasticsearch入门
到 https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.zip 下载最新包: 启动: ./elast ...
- Linux 6.5網卡配置
Linux 6.5 網卡配置 路徑:/etc/sysconfig/network-scripts 1.關閉NetworkManager服務 [root@rhcsasm2 network-scripts ...
- Python 遍历文件,字符串操作
写一个简单的脚本,循环遍历单层文件夹,检查源代码中是否有一些特殊的类. import os import codecs dirroot = "......" line_num = ...
- hdu 4010 动态树 @
kuangbin模板题,看起来十分高大上 /* *********************************************** Author :kuangbin Created Tim ...
- 配置ogg异构mysql-oracle 单向同步
从mysql到oracle和oracle到mysql差不多.大致步骤如下: 环境是:192.168.0.165 (Mysql ) —> 192.168.0.164 ( Oracle )想将mys ...