답안 #1025640

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1025640 2024-07-17T08:23:31 Z _rain_ Zoltan (COCI16_zoltan) C++14
21 / 140
152 ms 8140 KB
#include<bits/stdc++.h>
using namespace std;

mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
namespace Random
{
    #define int long long
    int Rand(int l , int r)
    {
        return uniform_int_distribution<int>(l , r)(rng);
    }
    #undef int 
}

using i64 = long long;
using ui64 = unsigned long long;

#define MASK(x) ((i64)(1) << (x))
#define BIT(mask , x) (((mask) >> (x)) & (1))
#define sz(x) (x).size()
#define all(x) (x).begin() , (x).end()

#define FOR(i ,a , b) for (int i = (a); i <= (b); ++i)
#define FORD(i , a , b) for (int i = (b); i >= (a); --i)
#define REP(i , a , b) for (int i = (a); i < (b); ++i)
#define REPD(i , a , b) for (int i = (b) - 1 ; i >= (a); --i)

template <class T> 
    void compress(vector<T> &a)
    {
        sort(a.begin() , a.end());
        a.resize(unique(a.begin() , a.end()) - a.begin());
        return;
    }
template<class T>
    void printArr(T& container , string separator = "" , string finish = "\n")
    {
        for (auto& item : container) cout << item << separator;
        cout << finish;
    }

template<class T>
    bool maximize(T &a , T b) {if (a < b) return a = b , true; else return false;}
template<class T>
    bool minimize(T &a , T b) {if (a > b) return a = b , true; else return false;}
template<class T>
    T gcd(T x , T y) {while (y) swap(y , x %= y); return x;}
template<class T>
    T lcm(T x , T y) {return (x * y) / gcd(x , y);}

//... INPUT
    void INPUT(string name)
    {
        iostream::sync_with_stdio(false); cin.tie(0);
        if (!fopen((name + ".inp").c_str() , "r")) return;
        freopen((name + ".inp").c_str() , "r" , stdin);
        freopen((name + ".out").c_str() , "w+" , stdout);
    }

const int maxn = 2e5;
//... MOD OPERATOR
    const int MOD = 1e9 + 7;
    int add(int a , int b)
    {
        return (a + b >= MOD ? a + b - MOD : a + b);
    }
    int mul(int a , int b)
    {
        return (i64)a * b % MOD;
    }
    int binpow(int a , int b)
    {
        int res = 1;
        for (; b; b >>= 1 , a = mul(a,a))
            if (b&1) res = mul(res , a);
        return res;
    }
//... FEN
    class segment
    {
    public:
        vector<int> st;
        void init(int n)
        {
            st.assign(n*4+2,{0});
            return;
        }
        void update(int node , int l , int r , int pos , int val)
        {
            if (l > pos || r < pos) return;
            if (l == r) st[node] = val;
            else 
            {
                int m = l + r >> 1;
                update(node*2,l,m,pos,val);
                update(node*2+1,m+1,r,pos,val);
                st[node] = st[node*2] + st[node*2+1];
            }
            return;
        }
        int get(int node , int l , int r , int u , int v)
        {
            if (l > v || r < u) return 0;
            if (u <= l && r <= v) return st[node];
            int m = l + r >> 1;
            return get(node*2,l,m,u,v) + get(node*2+1,m+1,r,u,v);
        }
    };

segment st1 , st2;
int n , a[maxn + 2];

int32_t main()
{
    INPUT("main");
        cin >> n;
        vector<int> value;
        FOR(i,1,n) 
            {
                cin >> a[i];
                value.push_back(a[i]);
            }
        compress(value);
        int length = sz(value); 
        st1.init(length); st2.init(length);
        FOR(i,1,n) a[i] = upper_bound(all(value),a[i]) - value.begin();
        int mxlength = 0 , cnt = 0;
        FORD(i,1,n)
        {
            int inc = st1.get(1,1,length,1,a[i] - 1);
            int dec = st2.get(1,1,length,a[i]+1,length);
            if (maximize(mxlength , dec + inc + 1)) cnt = 1;
                else if (mxlength == dec + inc + 1) ++cnt;
            st1.update(1,1,length,a[i],1);
            st2.update(1,1,length,a[i],1);
        }
        cout << mxlength << ' ' << mul(cnt , binpow(2 , n - mxlength));
    cerr << "\nTIME RUN : " << 1000 * clock()/CLOCKS_PER_SEC << " MS \n";

}
/** lockheed martin build me - Red Bull boost me **/

Compilation message

zoltan.cpp: In member function 'void segment::update(int, int, int, int, int)':
zoltan.cpp:94:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   94 |                 int m = l + r >> 1;
      |                         ~~^~~
zoltan.cpp: In member function 'int segment::get(int, int, int, int, int)':
zoltan.cpp:105:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  105 |             int m = l + r >> 1;
      |                     ~~^~~
zoltan.cpp: In function 'void INPUT(std::string)':
zoltan.cpp:56:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |         freopen((name + ".inp").c_str() , "r" , stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zoltan.cpp:57:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |         freopen((name + ".out").c_str() , "w+" , stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Incorrect 0 ms 348 KB Output isn't correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 1 ms 348 KB Output isn't correct
8 Incorrect 1 ms 348 KB Output isn't correct
9 Incorrect 1 ms 348 KB Output isn't correct
10 Incorrect 1 ms 348 KB Output isn't correct
11 Incorrect 79 ms 6700 KB Output isn't correct
12 Incorrect 71 ms 5848 KB Output isn't correct
13 Incorrect 63 ms 5592 KB Output isn't correct
14 Incorrect 96 ms 5848 KB Output isn't correct
15 Incorrect 124 ms 7300 KB Output isn't correct
16 Incorrect 152 ms 8140 KB Output isn't correct
17 Incorrect 100 ms 7376 KB Output isn't correct
18 Incorrect 103 ms 7384 KB Output isn't correct
19 Incorrect 97 ms 7392 KB Output isn't correct
20 Incorrect 103 ms 7288 KB Output isn't correct