zoukankan      html  css  js  c++  java
  • CF1536D

    题目

    source

    题解

    对于数组B,每增加1个数,相当于数组A增加2个数。设B中上一个数为x,新加的数为y,如果y>x,那么A增加的两个均大于等于x;如果y<x,那么两个均小于等于x;如果y=x,那么一个大于等于x一个小于等于x。在链表上维护一个指针cur,它始终指向每一步的x。如果y>x,y位于x的右侧,cur右移;如果y<x,cur左移;如果相等,cur不动。期间始终保持cur指向x的性质,有一步cur不指向x,说明不可能。
    详见代码

    #include <bits/stdc++.h>
     
    #define endl '
    '
    #define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
    #define mp make_pair
    #define seteps(N) fixed << setprecision(N) 
    typedef long long ll;
     
    using namespace std;
    /*-----------------------------------------------------------------*/
     
    ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
    #define INF 0x3f3f3f3f
     
    const int N = 3e5 + 10;
    const double eps = 1e-5;
    int arr[N];
     
    int main() {
        IOS;
        int t;
        cin >> t;
        while(t--) {
            int n;
            cin >> n;
            for(int i = 1; i <= n; i++) {
                cin >> arr[i];
            }
            list<int> l;
            l.push_back(arr[1]);
            auto cur = l.begin();
            bool ok = true;
            for(int i = 2; i <= n; i++) {
                if(arr[i] > arr[i - 1]) {
                    if(*cur > arr[i]) {
                        ok = false;
                        break;
                    }
                    if(*cur == arr[i]) continue;
                    ++cur;
                    if(cur == l.end()) {
                        cur = l.insert(cur, arr[i]);
                    } else {
                        if(*cur < arr[i]) {
                            ok = false;
                            break;
                        } else if(*cur > arr[i]) {
                            cur = l.insert(cur, arr[i]);
                        }
                    }
     
                } else if(arr[i] < arr[i - 1]) {
                    if(*cur < arr[i]) {
                        ok = false;
                        break;
                    }
                    if(*cur == arr[i]) continue;
     
                    if(cur == l.begin()) {
                        cur = l.insert(cur, arr[i]);
                    } else {
                        --cur;
                        if(*cur > arr[i]) {
                            ok = false;
                            break;
                        } else if(*cur < arr[i]){
                            ++cur;
                            cur = l.insert(cur, arr[i]);
                        }
                    }
                }
            }
            if(ok) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
    
  • 相关阅读:
    uwsgi 的启动停止重启
    项目部署(Python3 + ubuntu 16.04(ali server) + Nginx + uWSGI + Django 1.11)
    阿里云连接上Mysql数据库(10061 errors)
    本地数据库上传到阿里云Mysql
    Django 用户的修改密码接口
    django 的忘记密码接口
    Git光速入门
    缓存问题:一致性、穿击、穿透、雪崩、污染
    redis进阶-高可用:主从复制详解
    Redis分片技术(Redis Cluster)
  • 原文地址:https://www.cnblogs.com/limil/p/15022725.html
Copyright © 2011-2022 走看看