제출 #1048143

#제출 시각아이디문제언어결과실행 시간메모리
1048143vjudge1Selling RNA Strands (JOI16_selling_rna)C++17
60 / 100
93 ms65404 KiB
#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b)  for(int i = (a), _b = (b); i <= _b; ++i)
#define FORD(i, b, a) for(int i = (b), _a = (a); i >= _a; --i)
#define REP(i, a, b)  for(int i = (a), _b = (b); i < _b;  ++i)
#define REPD(i, b, a) for(int i = (b), _a = (a); i > _a;  --i)
#define MASK(i) (1LL << (i))
#define BIT(mask, i) (((mask) >> (i)) & 1)
#define __builtin_popcount __builtin_popcountll
#define all(val) val.begin(), val.end()
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define sz(v) (int)v.size()
#define fi first
#define se second

mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll Rand(ll l, ll r) {return l + rng() % (r - l + 1);}

template<class X, class Y>
    bool minimize(X &x, const Y &y) {
        if (x > y) {
            x = y;
            return true;
        } else return false;
    }
template<class X, class Y>
    bool maximize(X &x, const Y &y) {
        if (x < y) {
            x = y;
            return true;
        } else return false;
    }
template<class T>
    T Abs(const T &x) {
        return (x < 0 ? -x : x);
    }

const int mod = 1e9 + 7;
const int inf = 1e9;
const int N = 1e5 + 5;

struct node {
    int val, l, r;
    node() {
        val = l = r = 0;
    }
};

int n, q, nNodes, ver[N];
string s[N], rev[N];
vector<pair<string, int>> v;
node st[(1 << 20) + 5];

void upd(int id) {
    st[id].val = st[st[id].l].val + st[st[id].r].val;
}

int update(int pos, int val, int old, int l = 1, int r = n) {
    int cur = ++nNodes;
    if(l == r) {
        st[cur].val = st[old].val + val;
        return cur;
    }
    int m = l + r >> 1;
    if(pos <= m) {
        st[cur].l = update(pos, val, st[old].l, l, m);
        st[cur].r = st[old].r;
    }
    else {
        st[cur].l = st[old].l;
        st[cur].r = update(pos, val, st[old].r, m + 1, r);
    }
    upd(cur);
    return cur;
}

int get(int ver1, int ver2, int u, int v, int l = 1, int r = n) {
    if(u > r || v < l) return 0;
    if(u <= l && r <= v) {
        return st[ver2].val - st[ver1].val;
    }
    int m = l + r >> 1;
    return get(st[ver1].l, st[ver2].l, u, v, l, m) + get(st[ver1].r, st[ver2].r, u, v, m + 1, r);
}

pii Find(string x, string *S) {
    int l = lower_bound(S + 1, S + n + 1, x) - S;
    x.back()++;
    int r = lower_bound(S + 1, S + n + 1, x) - S - 1;
    return {l, r};
}

void process() {
    cin >> n >> q;
    FOR(i, 1, n) cin >> s[i];
    sort(s + 1, s + n + 1);
    FOR(i, 1, n) {
        rev[i] = s[i];
        reverse(all(rev[i]));
        v.emplace_back(rev[i], i);
    }
    sort(rev + 1, rev + n + 1);
    sort(all(v));
    FOR(i, 1, n) {
        ver[i] = update(v[i - 1].se, 1, ver[i - 1]);
    }
    while(q--) {
        string pref, suf; cin >> pref >> suf;
        reverse(all(suf));
        auto [l1, r1] = Find(pref, s);
        auto [l2, r2] = Find(suf, rev);
        cout << get(ver[l2 - 1], ver[r2], l1, r1) << '\n';
    }
}

signed main() {
    if(fopen("test.inp","r")) {
        freopen("test.inp","r",stdin);
        freopen("test.out","w",stdout);
    }
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    // clock_t start = clock();

    int ntests = 1;
    // cin >> ntests;
    while(ntests--) process();

    // cerr << "Time elapsed: " << clock() - start << " ms!\n";
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

selling_rna.cpp: In function 'int update(int, int, int, int, int)':
selling_rna.cpp:67:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   67 |     int m = l + r >> 1;
      |             ~~^~~
selling_rna.cpp: In function 'int get(int, int, int, int, int, int)':
selling_rna.cpp:85:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |     int m = l + r >> 1;
      |             ~~^~~
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:121:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |         freopen("test.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:122:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |         freopen("test.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...