답안 #997222

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
997222 2024-06-11T21:06:05 Z TsotneSV Zoltan (COCI16_zoltan) C++17
21 / 140
174 ms 20172 KB
#pragma gcc diagnostic "-std=c++1z"
#include <bits/stdc++.h>
using namespace std;
/* /\_/\
  (= ._.)
  / >  \>
*/
//#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // codeforces

// #define int long long
#define fi first
#define se second
#define pb push_back
#define ins insert
#define mp make_pair
#define send {ios_base::sync_with_stdio(false);}
#define help {cin.tie(0);}
#define endl '\n'
#define sz(x) ((long long) (x).size())
#define all(x) (x).begin(),(x).end()
#define print(x) cout<<(x)<<" ";
#define printl(x) cout<<(x)<<endl
#define dbg(x) cerr<<#x<<" "<<x<<endl

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpi;
typedef vector<pll> vpl;

void fileIO(string filename) {
    freopen((filename + ".in").c_str(), "r", stdin);
    freopen((filename + ".out").c_str(), "w", stdout);
}

 const ll MOD = 1e9+7;
// const ll mod = 998244353;
// ll mod;

const int inf=1e9,MAXN=2e5+1; 
const ll INF=1e18; 
const ld pi = 3.14159265358979323846;

// typedef long long ll;
template<typename Node,typename Update>
struct Segtr {

    int s;
    vector<Node> tree;

    void build(int v,int tl,int tr) {
        if(tl == tr) {
            tree[v] = Node(0);
        }else {
            int tm = (tl + tr)/2;
            build(2*v,tl,tm); build(2*v+1,tm+1,tr);
            tree[v].merge(tree[2*v],tree[2*v+1]);
        }
    }

    void update(int v,int idx,int tl,int tr,Update addend) {
        if(tl == tr) {
            addend.apply(tree[v]);
        }else {
            int tm = (tl + tr)/2;
            if(idx <= tm) update(2*v,idx,tl,tm,addend); 
            else update(2*v+1,idx,tm+1,tr,addend);
            tree[v].merge(tree[2*v],tree[2*v+1]);
         //   dbg(tree[2*v].mx); dbg(tree[2*v+1].mx);
           // dbg(tree[v].cnt);
        }
    }

    Node query(int v,int l,int r,int tl,int tr) {
        if(l > r) return Node(0); // *
        else if(tl == l && tr == r) return tree[v];
        int tm = (tl + tr)/2;
        Node L,R,ans;
        L = query(2*v,l,min(r,tm),tl,tm); R = query(2*v+1,max(l,tm+1),r,tm+1,tr);
        ans.merge(L,R);
        return ans;
    }

    Segtr(int n) {
        s = n;
        tree.resize(4*n);
        build(1,0,n-1);
    }

};

struct Node1 {
    ll mx,cnt; // * shecvla sheidzleba

    void merge(Node1 &a,Node1 &b) {

        if(a.mx == 0) {
            mx = b.mx;
            cnt = b.cnt;
            return;
        }else if(b.mx == 0) {
            mx = a.mx;
            cnt = a.cnt;
            return;
        }

        if(a.mx > b.mx) {
            mx = a.mx;
            cnt = a.cnt;
        }else if(a.mx < b.mx) {
            mx = b.mx;
            cnt = b.cnt;
        }else {
            mx = a.mx;
            cnt = (a.cnt % MOD + b.cnt % MOD) % MOD;
        }
    }

    Node1() {}

    Node1(int a) {
        mx = a; 
        cnt = 1;
    }

};

struct Update1 {
    int val; ll cnt;

    Update1(int val,ll cnt) {
        this->val = val;
        this->cnt = cnt;
    }

    void apply(Node1 &a) {

        if(val < a.mx) return;
        else if(val > a.mx) {
            a.mx = val;
            a.cnt = cnt;
        }else {
            a.cnt = (a.cnt % MOD + cnt % MOD) % MOD;
        }
    }


};

int n;

ll binpow(int a,ll b) {

    ll res = 1;

    while(b) {
        if(b&1) res = res * a % MOD;
        a = a * a % MOD;
        b/=2;
    } return res;

}

void solve(int tc = 0){
    cin>>n; vi A,v;

    for(int i=0;i<n;i++) {
        int tmp;
        cin>>tmp;
        A.pb(tmp);
        v.pb(tmp);
    } sort(all(v)); v.resize(unique(all(v)) - v.begin());

    for(int &i : A) {
        i = lower_bound(all(v),i) - v.begin();
    }

    Segtr<Node1,Update1> T1(sz(v)),T2(sz(v));

    int len = 0; ll cnt = 1;


    for(int i=sz(A)-1;i>=0;i--) {
        Node1 x1 = T1.query(1,0,A[i]-1,0,sz(v)-1);
        Node1 x2 = T2.query(1,A[i]+1,sz(v)-1,0,sz(v)-1);

        int tLen = x1.mx + x2.mx + 1; ll tCnt = x1.cnt * x2.cnt % MOD;

        if(tLen > len) {
            len = tLen;
            cnt = tCnt;
        }else if(tLen == len) {
            cnt = (cnt + tCnt) % MOD;
        }

        T1.update(1,A[i],0,sz(v)-1,Update1(x1.mx + 1,1));
        T2.update(1,A[i],0,sz(v)-1,Update1(x2.mx + 1,1));

    } cout<<len<<" "<<cnt * binpow(2,n - len) % MOD<<endl;

}

signed main(){

  
    send help
  
    int tc=1;
    // cin>>tc;
    for(int t = 0; t < tc; t++) solve(t);
}

Compilation message

zoltan.cpp:1: warning: ignoring '#pragma gcc diagnostic' [-Wunknown-pragmas]
    1 | #pragma gcc diagnostic "-std=c++1z"
      | 
zoltan.cpp: In function 'void fileIO(std::string)':
zoltan.cpp:39:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   39 |     freopen((filename + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zoltan.cpp:40:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |     freopen((filename + ".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 107 ms 18364 KB Output isn't correct
12 Incorrect 89 ms 18376 KB Output isn't correct
13 Incorrect 85 ms 13008 KB Output isn't correct
14 Incorrect 119 ms 18576 KB Output isn't correct
15 Incorrect 157 ms 19640 KB Output isn't correct
16 Incorrect 174 ms 18876 KB Output isn't correct
17 Incorrect 125 ms 20172 KB Output isn't correct
18 Incorrect 125 ms 19400 KB Output isn't correct
19 Incorrect 130 ms 18888 KB Output isn't correct
20 Incorrect 127 ms 18864 KB Output isn't correct