防线问题

UVA1471

Defense Lines

Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu

Submit Status

Description

After the last war devastated your country, you - as the king of the land of Ardenia - decided it was high time to improve the defense of your capital city. A part of your fortification is a line of mage towers, starting near the city and continuing to the northern woods. Your advisors determined that the quality of the defense depended only on one factor: the length of a longest contiguous tower sequence of increasing heights. (They gave you a lengthy explanation, but the only thing you understood was that it had something to do with firing energy bolts at enemy forces).

After some hard negotiations, it appeared that building new towers is out of question. Mages of Ardenia have agreed to demolish some of their towers, though. You may demolish arbitrary number of towers, but the mages enforced one condition: these towers have to be consecutive.

For example, if the heights of towers were, respectively, 5, 3, 4, 9, 2, 8, 6, 7, 1, then by demolishing towers of heights 9, 2, and 8, the longest increasing sequence of consecutive towers is 3, 4, 6, 7.

Input

The input contains several test cases. The first line of the input contains a positive integer Z25, denoting the number of test cases. Then Z test cases follow, each conforming to the format described below.

The input instance consists of two lines. The first one contains one positive integer n2 . 105 denoting the number of towers. The second line containsn positive integers not larger than 109 separated by single spaces being the heights of the towers.

Output

For each test case, your program has to write an output conforming to the format described below.

You should output one line containing the length of a longest increasing sequence of consecutive towers, achievable by demolishing some consecutive towers or no tower at all.

Sample Input

2
9
5 3 4 9 2 8 6 7 1
7
1 2 3 10 4 5 6

Output

4
6

#include"iostream"
#include"algorithm"
#include"cstring"
#include"cstdio"
using namespace std;

const int maxn=200000+10;
const int Max=1000000000;

int a[maxn],righ[maxn],lef[maxn],d[maxn],g[maxn];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;

for(int i=0;i<n;i++) cin>>a[i];

memset(righ,0,sizeof(righ));
memset(lef,0,sizeof(lef));

lef[0]=1;righ[n-1]=1;
for(int i=n-2;i>=0;i--)
{
if(a[i]>=a[i+1]) righ[i]=1;
else righ[i]=righ[i+1]+1;
}
for(int j=1;j<n;j++)
{
if(a[j]>a[j-1]) lef[j]=lef[j-1]+1;
else lef[j]=1;
}

//为节省数一数所耗时间而做好的预处理表格,时间复杂度从O(n^3)可降到O(n^2),因为每次得到长度的时间从O(n)降到O(1)
/*for(int j=0;j<n;j++) cout<<righ[j]<<" ";
cout<<endl;
for(int j=0;j<n;j++) cout<<lef[j]<<" ";
cout<<endl;*/

int ans=-1;

//方法一:超时,耗时O(n^2)
/*for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(min(lef[j]+righ[i]-1,j-i)>ans) ans=min(lef[j]+righ[i]-1,j-i);*/

//方法二:只遍历一次i,j完全靠二分查找,耗时O(nlogn)
for(int i=1;i<=n;i++) g[i]=Max;

for(int i=0;i<n;i++)
{
int k=lower_bound(g+1,g+n+1,a[i])-g; //找出的k肯定大于i,且k-i大于k+j-1.
d[i]=k+righ[i]-1; //k即为从i开始的最大递增序列长度
if(a[i]<g[lef[i]]) g[lef[i]]=a[i]; //维护左值有序表
ans=max(ans,d[i]);
}

cout<<ans<<endl;
}
return 0;
}

时间: 2024-10-12 11:02:52

防线问题的相关文章

古罗马帝国莱茵河-多瑙河防线之谜

本周生病,静心安养,所得之处,作文以记之.屋大维.奥古斯都听闻瓦鲁斯在条顿堡森林全局覆没,哀鸣:"瓦鲁斯,还我军团!"很多人搞不明白,其实他本应该喊的是:"阿米尼乌斯,还我瓦鲁斯!日耳曼蛮夷,还我军团!" 1.迷局 大 部分的史书记载,奥古斯都把帝国边界线确定为莱茵河而不是易北河,这是一个迷.之所以是个迷,是因为他曾经真的努力过将边界推进到易北河,因为看看地图就 会明白,同样作为天然屏障,易北河-多瑙河防线要比莱茵河-多瑙河防线短得多,这就意味着奥古斯都可以节省大约

第一道防线__SpringMVC配置拦截器

这几天在公司自己开发一个小系统,但是系统的安全性也得考虑,起初没注意,赶急就光关心业务逻辑和实现效果.最后老大一出手,就把最严重的问题指出来了,他说你这根本没安全性可言,于是我试着将公司使用的spring security框架拿过来,但是在这之前我又尝试配置一下springmvc的拦截器,也可以说是网站的第一道防线. 这里我就拿用户登录问题来说吧. 1.首先自己手动编写一个拦截器类(自定义拦截器类),伪代码如下: 1 public class LoginInterceptor implement

防线修建 bzoj 2300

防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务: 1.给出你所有的A国城市坐标 2.A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不需要在防线内了 3.A国上层询问对于剩下要保护的城市,修建防线的总经费最少是多少 你需要对

存款保险制度给百姓存款再加一道安全防线

景美理财网11月30日电(记者 李春) <存款保险条例(征求意见稿)>今日面向社会公开征求意见.央行[微博]表示,存款保险制度的核心是充分保障存款人权益,这是制定政策的出发点和立足点. 存款保险是指存款银行交纳保费形成存款保险基金,当个别存款银行经营出现问题时,使用存款保险基金依照规定对存款人进行及时偿付. 作为一项金融业基础性制度安排,存款保险在国际上已发展多年,其在保护存款人权益.防范和化解金融风险方面起到重要作用.目前,世界上已有110多个国家和地区建立了存款保险制度. 我国早在1993

cogs 547:[HAOI2011] 防线修建

★★★☆   输入文件:defense.in   输出文件:defense.out   简单对比 时间限制:1 s   内存限制:128 MB 题目描述: 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务: 给出你所有的A国城市坐标 A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不

BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) ----------------------------------------------------------------------- #include<cmath> #include<cstdio> #include<cctype> #include<cstring> #include<cstdlib> #include<algori

【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)

2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务: 1.给出你所有的A国城市坐标 2.A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不需要在防线内了 3.A国上层询问对于剩下要保护的城市,修建防线的总经费最少是多少

BZOJ 2300 HAOI 2011 防线修建 动态维护凸包

题目大意:一些成熟分布在第一象限中,现在要建造一个防线来保护他们,但是随着时间的推移,必须要舍弃一些城市,但是不会舍弃首都.问最短的防线需要多长. 思路:在每一个时刻求一个上凸包就是答案了.当然这样做时间复杂度就呵呵了.考虑一下动态维护凸包.因为只有上凸包,所以处理起来会相对方便.我们只需把在凸包中的点按照x坐标排序,然后二分一下把点插入凸包,然后左右用斜率维护一下,这样每次插点的时间复杂度大概是O(logn).但是这样只能插点不能删点,所以离线处理一下,把删点转化为插点,最后倒着输出. (我比

【BZOJ2300】[HAOI2011]防线修建 set维护凸包

[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务: 1.给出你所有的A国城市坐标 2.A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不需要在防线内了 3.A国上层询问对于剩下要保护的城市,修建防线的总经费最少

bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> #include<cmath> #include<cstdio> #include<iostream> using namespace std; #define N 100001 struct node { int x,y; node(int x_=0,int y_=0):