ACM训练二B题

这是比赛后打的题目,思路很清晰:申明一个结构体,将输入的数复制在这个结构体数组中,排序后比对下标,找到变动的首下标和尾下标,再看这段是否逆序了。

Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers.

Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you a bigger array, but only if you are able to answer the following question correctly: is it possible to sort the array a (in increasing order) by reversing exactly one segment of a? See definitions of segment and reversing in the notes.

Input

The first line of the input contains an integer n (1 ≤ n ≤ 105) — the size of array a.

The second line contains n distinct space-separated integers: a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ 109).

Output

Print "yes" or "no" (without quotes), depending on the answer.

If your answer is "yes", then also print two space-separated integers denoting start and end (start must not be greater than end) indices of the segment to be reversed. If there are multiple ways of selecting these indices, print any of them.

Sample Input

Input

33 2 1

Output

yes1 3

Input

42 1 3 4

Output

yes1 2

Input

43 1 2 4

Output

no

Input

21 2

Output

yes1 1
#include <iostream>
#include<algorithm>
using namespace std;

int a[100017];

struct NUM{
 int x,id;
}b[100017];

bool cmp(NUM x,NUM y)
{

    return x.x < y.x;
}

int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++)
    {

        cin >> a[i];
        b[i].x = a[i];
        b[i].id = i;
    }

    sort(b+1,b+n+1,cmp);

    int i,j;
    for(i = 1;i <= n;i++)
    {

        if(b[i].id != i)
        {
            break;
        }
    }

    if(i == n+1)
    {

        cout << "yes" << endl << "1  1" << endl;
        return 0;
    }
    for(j = n;j > 0;j--)
    {

        if(b[j].id != j)
        {

            break;
        }
    }

    int tt = i;int t = j;
    while(i<=j)
    {

        if(a[i] != b[t--].x)
        {

            break;

        }
        i++;
    }

    if(i == j+1)
    {

        cout << "yes" << endl << tt << "  " << j << endl;
    }
    else
    {

        cout << "no" << endl;
    }
    return 0;
}

ACM训练二B题

时间: 2024-10-07 16:24:33

ACM训练二B题的相关文章

ACM训练二A题

这个题目很简单,虽然看上去高大上,只要找规律就行了,多看看,找找例子.-不过我花了蛮久才看出来,惭愧啊,其实就是看n.m中最小的数是奇数还是偶数. After winning gold and silver in IOI 2014, Akshat and Malvika want to have some fun. Now they are playing a game on a grid made of nhorizontal and m vertical sticks. An interse

ACM训练二C题

kmp对我真无奈,我对kmp真苦恼.就是个算法嘛,我以为凭我脖子上的东西可以搞定,现在好了--搞得我头都大了.要我写个啥next的值,五个字:那都不是事.一到啥实际应用吧,我意识不行了,搞不清next到底有什么作用,能干什么.就好比见到了二分啊-- 此题的意思呢,我弄了很久,其实是找相同串,比如ACMACMACMACMACMA,从后往前看next就行了,比如最后一个next[15] = 13,代表前13个字符串和后13位相同,直接用总长16 - 13 = 3,为一个解,接下来看next[13]了

ACM训练二D题

比赛看到这个题目时候,心花怒放啊,朋友这个题和how many tables这个题目一样嘛,并查集,直接就把自己代码交了,后来一看,傻眼了,得输出的是集合中个数最多的数目.后来直接在合并的代码中小小的改动就行了.其实也可以在每次查后把什么孙子,曾孙全变为儿子.再来一个遍历,把不同门派的弟子统计一下,每次选规模大的数就行了. There is a town with N citizens. It is known that some pairs of people are friends. Acc

ACM训练二E题

题意:给你一个闭区间[a,b],求一个最小的L,使得在区间[a,b-L+1]内任取一个数x,可以满足在x,x+1,x+2,……,x+L-2,x+L-1内至少包含k个素数.(1<=a,b,k<=10^6) • •考察内容:筛素数.二分 • •一边筛素数,一边处理出一个前缀和sum •sum(i)表示[1,i]中有多少素数 •那么我们每次查询区间[l,r]中有多少素数,直接查sum[r]-sum[l-1]就可以了 •接下去我们按照题意,对答案L进行二分就可以了 这是陶叔的解释 我的解释全在注释里头

ACM训练和应用开发的体验,大二学生可以并行开展

[来信] 老师 我现在是大二的一名学生 我们专业虽然是计算机专业但是这届大一才真是和其他计算机专业一样开始大一上C语言 C 我们这级仍然是大二开的C语言和数据结构 我在学校做过一段时间ACM 70道题 但是最近我又开始去学windows的程序设计 不知道为什么总感觉学起来力不从心 我现在学完了C C 和数据结构 我接下来到底做什么好呢 [回复:(原回复找不到了,CSDN的私信功能应该出问题了,不按时间排序.我指出他的行文中没有标点,我读得很费劲.另外,他的具体情况,需要给我说明.)] [再来信]

acm集训训练赛A题【签到题】

一.题目 Description After winning gold and silver in IOI 2014, Akshat and Malvika want to have some fun. Now they are playing a game on a grid made of nhorizontal and m vertical sticks. An intersection point is any point on the grid which is formed by t

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

ACM训练联盟周赛 C题 Alice和Bob的Nim游戏

题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个),拿到所有石子中最后一个石子的人获胜.这是一个只有3堆石子的Nim游戏. Bob错误的认为,三堆石子的Nim游戏只需要少的两堆的石子数量加起来等于多的那一堆,后手就一定会胜利.所以,Bob把三堆石子的数量分别设为 {k,4k,5k}(k>0). 现在Alice想要知道,在k 小于 2^n 的时候,有多

2014暑假ACM训练总结

2014暑假ACM训练总结报告 匆匆之中,一个暑假又过去了,在学校训练的这段日子真的是感觉日子过得好快啊! 时光如箭,日月如梭! 匆忙的学习之中一个暑假就这样结束了,现在就来写一些总结吧,供自己以后阅读和回忆吧! 2014年7月14我们即可1303考完了最后一科模拟电路,也宣告了暑假的到来!本来有刚好两 星期的时间可以回家或是去做其他的事,然后我在学校呆了几天,无聊之余便回家了.在家呆了大概 7天,便正式回校了,准备学校的ACM的训练去了. 先亮一下暑假的训练计划吧! 集训详情: 第一周回顾知识