zoukankan      html  css  js  c++  java
  • 【习题 8-16 UVA

    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    枚举N[q]和N[r]的位置 因为N[q]是最大值,且N[r]是最小值。 且它们是中间的两个。 枚举这两个可以做到不重复枚举。

    然后假设我们枚举了q和r的位置分别为i和j
    (a[i]>a[j]
    那么我们接下来需要得到两个东西。
    1.在j的右边找到一个尽可能大的且小于a[i]的数字dp[0][i][j];
    2.在i的左边找到一个尽可能小且大于a[j]的数字dp[1][i][j]。
    然后判断一下dp[0][i][j]> a[j] && dp[1][i][j]< a[i] && dp[0][i][j] > dp[1][i][j]
    是否成立就好

    还要考虑a[i]<a[j]的情况(有两种情况之一成立都是弱键。
    方便起见。
    直接把原数组翻转一下。
    就会发现用上面说的思路重新做一遍就可以了。

    dp[0..1][i][j]这两个数组可以用一个set.在(O(N^2*log_2N))的复杂度下得到。

    【代码】

    /*
        dp1[i][j] 表示 j右边 大于a[j]且小于a[i]的
        最大数字
            ->小于a[i]的最大数字
    
        dp2[i][j] 表示i左边 大于a[j]且最小的数字
    
        for (int j = n;j >= 1;j--){
    
        }
    */
    #include <bits/stdc++.h>
    #define ll long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define all(x) x.begin(),x.end()
    #define pb push_back
    #define ls l,mid,rt<<1
    #define rs mid+1,r,rt<<1
    using namespace std;
    
    const double pi = acos(-1);
    const int dx[4] = {0,0,1,-1};
    const int dy[4] = {1,-1,0,0};
    const int N = 5e3;
    
    set<int> myset;
    int n,a[N+10],dp[2][N+10][N+10];
    
    bool solve(){
        myset.clear();
        rep2(j,n,1){
            rep2(i,j-1,1)
                if (a[i]>a[j]){
                    auto temp = myset.upper_bound(a[i]);
                    if (temp==myset.begin()) {
                        dp[0][i][j] = 0;
                        continue;
                    }
                    temp--;
                    dp[0][i][j] = (*temp);
                }
            myset.insert(a[j]);
        }
        myset.clear();
        rep1(i,1,n){
            rep1(j,i+1,n)
                if (a[i]>a[j]){
                    auto temp = myset.upper_bound(a[j]);
                    if (temp==myset.end()) {
                        dp[1][i][j] = 0;
                        continue;
                    }
                    dp[1][i][j] = (*temp);
                }
            myset.insert(a[i]);
        }
        rep1(i,1,n)
            rep1(j,i+1,n)
                if (a[i]>a[j]){
                    if (dp[0][i][j]==0 || dp[1][i][j]==0) continue;
                    if (dp[0][i][j]>a[j] && dp[1][i][j]<a[i] &&
                        dp[0][i][j]>dp[1][i][j]){
                            return true;
                        }
                }
        return false;
    }
    
    int main(){
    	#ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
    	ios::sync_with_stdio(0),cin.tie(0);
        int T;
        cin >> T;
        while (T--){
            cin >> n;
            rep1(i,1,n) cin >> a[i];
            if (solve()){
                cout<<"YES"<<endl;
                continue;
            }
            reverse(a+1,a+1+n);
            if (solve()){
                cout<<"YES"<<endl;
                continue;
            }
            cout<<"NO"<<endl;
        }
    	return 0;
    }
    
    
  • 相关阅读:
    修改eclipse的背景色(转载)
    c#调用 windows api实现WinForm中嵌入EXE程序
    VS2008序列号
    Microsoft Visual Studio 2005 获取与升级
    Oracle数组一般可以分为固定数组和可变数组
    深圳香港之行杂记
    [难过]小明住院了
    青岛之行杂记
    喀纳斯之行杂记
    亲历北京721大雨
  • 原文地址:https://www.cnblogs.com/AWCXV/p/8455727.html
Copyright © 2011-2022 走看看