codeforces 653C C. Bear and Up-Down(乱搞题)

题目链接:

C. Bear and Up-Down

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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.

Examples

input

52 8 4 7 7

output

2

input

4200 150 100 50

output

1

input

103 2 1 4 1 4 1 4 1 4

output

8

input

91 2 3 4 5 6 7 8 9

output

0

Note

In the first sample, there are two ways to get a nice sequence with one swap:

  1. Swap t2 = 8 with t4 = 7.
  2. Swap t1 = 2 with t5 = 7.

In the second sample, there is only one way — Limak should swap t1 = 200 with t4 = 50.

题意:问有多少种交换方法使序列满足nice的条件;

思路:把不合理的位置找出来,然后暴力交换看有多少种方式,乱搞就能搞出来,然而我乱搞了一夜晚一直wa,后来好好想了不同的情况才过;

AC代码:

//代码写的跟翔一样,自己看了就想吐;

#include <bits/stdc++.h>
using namespace std;
const int N=15e4+3;
int a[N],flag[N],pos[N],cnt,num,n;
int sap(int x,int y)
{
    int t=a[y];
    a[y]=a[x];
    a[x]=t;
}
int check(int v)
{
   /* if(x==3)
    {
        for(int j=0;j<x;j++)
        {
            cout<<pos[j]<<"&"<<endl;
        }
    }
    */
    int u=v;
   // cout<<v<<"@"<<pos[v-1]<<endl;
    for(int j=0;j<u;j++)
    {
        //cout<<a[1]<<"*"<<a[4]<<endl;
        //cout<<pos[j]<<"#"<<j<<endl;
        if(pos[j]==1)
        {
            if(a[pos[j]+1]<=a[pos[j]])return 0;
            continue;
        }
        if(pos[j]==n)
        {
            if(n%2)
            {
                if(a[n-1]<=a[n])return 0;
                continue;
            }
            else
            {
                if(a[n-1]>=a[n])return 0;
                continue;
            }
        }
        if(pos[j]%2)
        {
            if(a[pos[j]-1]<=a[pos[j]]||a[pos[j]+1]<=a[pos[j]])return 0;
        }
        else
        {
            if(a[pos[j]-1]>=a[pos[j]]||a[pos[j]+1]>=a[pos[j]])return 0;
        }
    }
    return 1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    a[0]=10000000;
    a[n+1]=0;
    cnt=0,num=0;
    for(int i=1;i<n;i++)
    {
        if(i%2)
        {
            if(a[i]>=a[i+1]){
                    if(!flag[i]){pos[num++]=i,flag[i]=1;}
                    if(!flag[i+1])pos[num++]=i+1,flag[i+1]=1;
            }
        }
        else
        {
            if(a[i]<=a[i+1])
            {
               if(!flag[i]) pos[num++]=i,flag[i]=1;
               if(!flag[i+1])pos[num++]=i+1,flag[i+1]=1;
            }
        }
    }
    if(num>=8){cout<<"0"<<endl;return 0;}
    int ans=0;
    for(int i=0;i<num;i++)
    {
        for(int j=i+1;j<num;j++)
        {
            sap(pos[i],pos[j]);
            ans+=check(num);
            sap(pos[j],pos[i]);
        }
    }
    for(int i=0;i<num;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(!flag[j])
            {
                sap(pos[i],j);
                pos[num]=j;
                ans+=check(num+1);
                sap(j,pos[i]);
            }
        }
    }
    cout<<ans<<"\n";
    return 0;
}
时间: 2024-10-10 02:33:25

codeforces 653C C. Bear and Up-Down(乱搞题)的相关文章

Codeforces 484(#276 Div 1) A Bits 乱搞

题意:给你一个非负整数范围,求其中二进制中 1 最多且数字最小的数 解题思路:乱搞,找到两个数第一个不匹配的位数,将后面的位都赋值为1(如果右端点这位本身就是1,则从这一位开始), 解题代码: 1 // Author: darkdream 2 // Created Time: 2014年11月06日 星期四 00时24分10秒 3 4 #include<vector> 5 #include<list> 6 #include<map> 7 #include<set&

一道乱搞题并不能ac.

题目描述 传销组织 传销组织 GPLT的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们最近在执行一项宏伟的 宗旨是"有志者事竟成",他们

codeforces 498D Unbearable Controversy of Being (暴力乱搞)

传送门:点击打开链接 题目大意: 定义下图为"damn rhombus",给定一个有向图,求出有多少个"damn rhombus". 解题思路1: 分析可以得出其实"damn rhombus"的意思就是求a->c通过2个节点中转的个数.也就是说 如果a->c中间中转了x个点,那么对于点对(a,c)来说"damn rhombus"就有C(x,2)个. 那么通过层数为2的bfs就可以得出答案. #include <

hdu-5676 ztr loves lucky numbers(乱搞题)

题目链接: ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4.7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少 输入描述 有TT(1≤T≤10?5??)组数据,

hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给定的学生成绩都异或上一次的答案 先将学生按每一门成绩都排一次序 这里将学生分块成sqrt(n)的块数,然后在当前块中用bitset容器来记录含有学生的状态 这里可以记录状态的前缀和,因为比后面成绩好的,必然比前面的学生的成绩也好 查询的时候只要查到正好比他高的学生属于哪一块,这样只要访问sqrt(n

HDU5764 After a Sleepless Night 树形乱搞题

分析(官方题解): 假设根已确定,可以发现新树若合法,需满足以下性质:根节点是n:儿子的值不大于父亲:具有相同值的节点形成一条链,并且链不会发生“分叉”(即有多个最低点).所以对于新树中有出现的值x,原树在新树x链的最低点应为x,而其他新值为x的点,原值应小于x.那么我们先将所有链的最低点放上对应值,而空着的点和还没用的值进行配对. 贪心使答案字典序最小:从大到小枚举未用的值,用大根堆维护该值可以填入的位置id,取最大id填入.(否则,若某一步的值a匹配了非最大id x,而最大id y在后面配了

CodeForces - 1228D (暴力+思维+乱搞)

题意 https://vjudge.net/problem/CodeForces-1228D 有一个n个顶点m条边的无向图,在一对顶点中最多有一条边. 设v1,v2是两个不相交的非空子集,当满足以下条件时f(v1,v2)为真 v1中的点之间不存在边 v2中的点之间不存在边 对于在v1v2中的每一对顶点,x在v1中,y在v2中,xy之间有边 所有点集不为空,且不相交,是否有v1,v2,v3使得f(v1,v2).f(v2,v3).f(v3,v1)均为真 如果有输出每个点所在的点集(1,2,3),否则

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

hdu 5246 乱搞

题意:题目太长直接看链接 链接:点我 乱搞题 显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看 这里直接拿例1解释,首先递减排个序 15,13,10,9,8 作差得2,3,1,1, 此时我们从10出发即可成功 同时也发现,战斗力逐渐递增和直接到某个值其实是等价的 于是我们假设战斗力是从15-13-10-9-8变化的,观察这种变化能否成功即可 由13到15,变化为2,则从13出发剩余战斗力至少得提高2 从10到13,战斗力要提高3,而k为3然后10小于m,即成功 看一下反例2