zoukankan      html  css  js  c++  java
  • Codeforces Round #332 (Div. 2) C. Day at the Beach 线段树

    C. Day at the Beach

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/contest/599/problem/C

    Description

    One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortunately, the weather was bad, so the friends were unable to ride waves. However, they decided to spent their time building sand castles.

    At the end of the day there were n castles built by friends. Castles are numbered from 1 to n, and the height of the i-th castle is equal tohi. When friends were about to leave, Squidward noticed, that castles are not ordered by their height, and this looks ugly. Now friends are going to reorder the castles in a way to obtain that condition hi ≤ hi + 1 holds for all i from 1 to n - 1.

    Squidward suggested the following process of sorting castles:

    • Castles are split into blocks — groups of consecutive castles. Therefore the block from i to j will include castles i, i + 1, ..., j. A block may consist of a single castle.
    • The partitioning is chosen in such a way that every castle is a part of exactly one block.
    • Each block is sorted independently from other blocks, that is the sequence hi, hi + 1, ..., hj becomes sorted.
    • The partitioning should satisfy the condition that after each block is sorted, the sequence hi becomes sorted too. This may always be achieved by saying that the whole sequence is a single block.

    Even Patrick understands that increasing the number of blocks in partitioning will ease the sorting process. Now friends ask you to count the maximum possible number of blocks in a partitioning that satisfies all the above requirements.

    Input

    The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of castles Spongebob, Patrick and Squidward made from sand during the day.

    The next line contains n integers hi (1 ≤ hi ≤ 109). The i-th of these integers corresponds to the height of the i-th castle.

    Output

    Print the maximum possible number of blocks in a valid partitioning.

    Sample Input

    3
    1 2 3

    Sample Output

    3

    HINT

    题意

    给你n个数,问你最多分成多少块,使得在块内单独排序之后,然后再组合起来的结果和最后排序的结果一样

    题解:

    对于每个数i,判断一下这个数到上一个划开的位置的最大值是否小于后面的最小值,如果是,就在这儿划开

    最大最小值可以On,也可以偷懒像我一样用线段树。。。

    代码

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    #define maxn 500000
    const int inf = 1e9+5;
    struct node
    {
        int l,r,ma,mi;
    }a[maxn];
    int d[maxn];
    void build(int x,int l,int r)
    {
        a[x].l=l,a[x].r=r;
        a[x].ma=-inf,a[x].mi=inf;
        if(l==r)
        {
            a[x].ma=d[l];
            a[x].mi=d[l];
            return;
        }
        else
        {
            int mid=(l+r)>>1;
            build(x<<1,l,mid);
            build(x<<1|1,mid+1,r);
            a[x].ma=max(a[x<<1].ma,a[x<<1|1].ma);
            a[x].mi=min(a[x<<1].mi,a[x<<1|1].mi);
        }
    }
    int query1(int x,int st,int ed)
    {
        int l=a[x].l,r=a[x].r;
        if(st<=l&&r<=ed)
            return a[x].mi;
        else
        {
            int mid=(l+r)>>1;
            int mi1=inf,mi2=inf;
            if(st<=mid)
                mi1=query1(x<<1,st,ed);
            if(ed>mid)
                mi2=query1(x<<1|1,st,ed);
            return min(mi1,mi2);
        }
    }
    
    int query2(int x,int st,int ed)
    {
        int l=a[x].l,r=a[x].r;
        if(st<=l&&r<=ed)
            return a[x].ma;
        else
        {
            int mid=(l+r)>>1;
            int mi1=-inf,mi2=-inf;
            if(st<=mid)
                mi1=query2(x<<1,st,ed);
            if(ed>mid)
                mi2=query2(x<<1|1,st,ed);
            return max(mi1,mi2);
        }
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        int dd,ee;
        for(int i=1;i<=n;i++)
            scanf("%d",&d[i]);
        build(1,1,n);
        int ans = 1;
        int tmp = 1;
        for(int i=1;i<n;i++)
        {
            if(query2(1,tmp,i)<=query1(1,i+1,n))
            {
                ans++;
                tmp = i+1;
            }
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    HashMap深度解析:一文让你彻底了解HashMap
    阿里十年技术大咖,教你如何分析1.7中HashMap死循环
    HashMap 底层实现、加载因子、容量值及死循环
    HashMap为什么是线程不安全的
    一文搞定HashMap的实现原理和面试
    @面试中常问的List去重问题,你都答对了吗?
    不按套路出牌,HashMap负载因子超过1会怎样?
    HashMap是如何工作的
    Jdk7与Jdk8 中的 HashMap 和 ConcurrentHashMap 全解析
    深入理解HashMap+ConcurrentHashMap的扩容策略
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4982851.html
Copyright © 2011-2022 走看看