C. Bear and Up-Down

题目连接:

http://www.codeforces.com/contest/653/problem/C

Description

The life goes up and down, just like nice sequences. Sequence t1, t2, ..., tn is called nice if the following two conditions are satisfied:

ti < ti + 1 for each odd i < n;

ti > ti + 1 for each even i < n.

For example, sequences (2, 8), (1, 5, 1) and (2, 5, 1, 100, 99, 120) are nice, while (1, 1), (1, 2, 3) and (2, 5, 3, 2) are not.

Bear Limak has a sequence of positive integers t1, t2, ..., tn. This sequence is not nice now and Limak wants to fix it by a single swap. He is going to choose two indices i < j and swap elements ti and tj in order to get a nice sequence. Count the number of ways to do so. Two ways are considered different if indices of elements chosen for a swap are different.

Input

The first line of the input contains one integer n (2 ≤ n ≤ 150 000) — the length of the sequence.

The second line contains n integers t1, t2, ..., tn (1 ≤ ti ≤ 150 000) — the initial sequence. It's guaranteed that the given sequence is not nice.

Output

Print the number of ways to swap two elements exactly once in order to get a nice sequence.

Sample Input

5

2 8 4 7 7

Sample Output

2

Hint

题意

一个序列定义为nice的话,就是这个序列满足阶梯状。

就是如果i是偶数,那么ai>ai-1,ai>ai+1

如果i是奇数,那么ai<ai+1,ai<ai-1

现在允许你交换两个数的位置,问你一共有多少种交换方式,使得这个序列变成nice

保证一开始的序列不是nice的。

题解:

我们定义不nice的数就是不满足条件的位置。

我们可以大胆猜测一发,不nice的数一定不会有很多,因为一次交换最多影响6个数,所以我们把这些不nice的数直接扔到一个数组里面。

然后暴力去和整个序列去交换就好了。

然后check也是只用check那些不nice的位置和你交换的那个位置的数。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int n;
int a[maxn];
vector<int>tmp;
long long ans = 0;
set<pair<int,int> >S;
bool check()
{
for(int i=0;i<tmp.size();i++)
{
for(int j=-1;j<=1;j++)
{
if(tmp[i]+j==0)continue;
if(tmp[i]+j==n+1)continue;
int pos = (tmp[i]+j);
if(pos%2==1)
{
if(a[pos]>=a[pos+1])return false;
if(a[pos]>=a[pos-1])return false;
}
else
{
if(a[pos]<=a[pos+1])return false;
if(a[pos]<=a[pos-1])return false;
}
}
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=1e9;
if(n%2==1)a[n+1]=1e9;
else a[n+1]=-1;
for(int i=1;i<=n;i++)
{
if( i & 1 ){
bool ok = true;
if( i + 1 <= n && a[i] >= a[i+1] ) ok = false;
if( i - 1 >= 1 && a[i] >= a[i-1] ) ok = false;
if( ok == false ) tmp.push_back( i );
}else{
bool ok = true;
if( i + 1 <= n && a[i] <= a[i+1] ) ok = false;
if( i - 1 >= 1 && a[i] <= a[i-1] ) ok = false;
if( ok == false ) tmp.push_back( i );
}
} if(tmp.size()>30)
return puts("0"),0; for(int i=0;i<tmp.size();i++)
{
for(int j=1;j<=n;j++)
{
if(tmp[i]==j)continue;
swap(a[tmp[i]],a[j]);
bool ok = check();
if(j%2==1)
{
if(a[j]>=a[j+1]||a[j]>=a[j-1])ok=false;
}
if(j%2==0)
{
if(a[j]<=a[j+1]||a[j]<=a[j-1])ok=false;
}
if(ok)
{
pair < int , int > SS = make_pair( min( tmp[i] , j ) , max( tmp[i] , j ) );
if(!S.count(SS)){
S.insert( SS );
ans++;
}
}
swap(a[tmp[i]],a[j]);
}
}
cout<<ans<<endl;
}

IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力的更多相关文章

  1. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing

    B. Bear and Compressing 题目链接  Problem - B - Codeforces   Limak is a little polar bear. Polar bears h ...

  2. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E - Bear and Forgotten Tree 2 链表

    E - Bear and Forgotten Tree 2 思路:先不考虑1这个点,求有多少个连通块,每个连通块里有多少个点能和1连,这样就能确定1的度数的上下界. 求连通块用链表维护. #inclu ...

  3. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) E. Bear and Forgotten Tree 2 bfs set 反图的生成树

    E. Bear and Forgotten Tree 2 题目连接: http://www.codeforces.com/contest/653/problem/E Description A tre ...

  4. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流

    D. Delivery Bears 题目连接: http://www.codeforces.com/contest/653/problem/D Description Niwel is a littl ...

  5. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) B. Bear and Compressing 暴力

    B. Bear and Compressing 题目连接: http://www.codeforces.com/contest/653/problem/B Description Limak is a ...

  6. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题

    A. Bear and Three Balls 题目连接: http://www.codeforces.com/contest/653/problem/A Description Limak is a ...

  7. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2)——A - Bear and Three Balls(unique函数的使用)

    A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. CodeForces 653 A. Bear and Three Balls——(IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2))

    传送门 A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input ...

  9. IndiaHacks 2016 - Online Edition (CF) . D

    这题思路很简单,二分m,求最大流是否大于等于x. 但是比赛过程中大部分的代码都被hack了... 精度问题,和流量可能超int 关于精度问题,这题真是提醒的到位,如果是先用二分将精度控制在10^-8左 ...

随机推荐

  1. EasyUi组合条件分页查询

    1.引入css与js文件 <link rel="stylesheet" type="text/css" href="themes/default ...

  2. PHP中的 get_magic_quotes_runtime

    get_magic_quotes_runtime() 获得外部文件及数据库资料时是否进行转义 set_magic_quotes_runtime(1); 临时设置获得外部文件及数据库资料时是否进行转义 ...

  3. Thinkphp的CURD

    CURD即(Create Update Read Delete)其实也就是等同于增删改查. C:Create 创建数据  对数据的添加 Create$m=new Model('User');$m=M( ...

  4. supervisor之启动rabbitmq报错原因

    前言 今天重启了服务器,发现supervisor管理的rabbitmq的进程居然启动失败了,查看日志发现老是报错,记录一下解决的办法. 报错:erlexec:HOME must be set 找了网上 ...

  5. think php模板的使用

    {include file="../application/public/header.html"}<!-- Jumbotron --><div class=&q ...

  6. elk系列1之入门安装与基本操作【转】

    preface 我们每天都要查看服务器的日志,一方面是为了开发的同事翻找日志,另一方面是巡检服务器查看日志,而随着服务器数量以及越来越多的业务上线,日志越来越多,人肉运维相当痛苦了,此时,参考现在非常 ...

  7. MySQL数据库设置为只读及测试【转】

    转自 mysql只读模式的设置方法与实验 - yumushui的专栏 - CSDN博客http://blog.csdn.net/yumushui/article/details/41645469 在M ...

  8. Machine Learning系列--归一化方法总结

    一.数据的标准化(normalization)和归一化 数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.在某些比较和评价的指标处理中经常会用到,去除数据的单位限 ...

  9. 《深入理解Java虚拟机》笔记--第三章 、垃圾收集器与内存分配策略

    1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. Java的垃圾收集(Garbage Collection)主要关注堆和方法区的内存回收. 在GC堆进行回收前,第一件 ...

  10. Oracle数据库,基础知识

    1.Oracle的五大约束条件: 1 主键  primary key2 外键  foreign key,3 唯一  unique,4 检测  check5 非空  not null 实例运用: -- ...