【每日一题】4月30日换个角度思考

换个角度思考

https://ac.nowcoder.com/acm/problem/19427

Solution

直接模拟!!别问,问就是模拟,当然模拟的时间复杂度是O(m * n)居然没有超时。。算了先玄学A一发,贴代码。

Code

#include <bits/stdc++.h>
using namespace std;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
typedef long long ll;

inline int read() {
    int s = 0, w = 1; char ch = getchar();
    while (ch < 48 || ch > 57) { if (ch == &#39;-&#39;) w = -1; ch = getchar(); }
    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}

const int N = 1e5 + 7;
int a[N];

int main() {
    int n = read(), m = read();
    for (int i = 1; i <= n; ++i)    a[i] = read();
    while (m--) {
        int l = read(), r = read(), k = read();
        int ans = 0;
        for (int i = l; i <= r; ++i)
            if (a[i] <= k)    ++ans;
        printf("%d\n", ans);
    }
    return 0;
}

哎,别急

这题目不是换个角度思考么,那我们肯定要给题目一点面子,这样简单的模拟,而且极有可能给卡掉的模拟还是要想想正解。没错就是主席树,也就是叫做可持久化线段树的数据结构。
如果懂到这是应该主席树的题目,那么就很简单了,套板子的题目。

#include <bits/stdc++.h>
using namespace std;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
typedef long long ll;

inline int read() {
    int s = 0, w = 1; char ch = getchar();
    while (ch < 48 || ch > 57) { if (ch == &#39;-&#39;) w = -1; ch = getchar(); }
    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}

const int N = 1e5 + 7;
int n, m, rt[N], lc[N << 5], rc[N << 5], sum[N << 5], tot;
#define mid (l+r>>1)

void build(int l, int r, int& x, int y, int k) {
    x = ++tot;
    lc[x] = lc[y], rc[x] = rc[y], sum[x] = sum[y] + 1; //先继承父点,再把权值+1
    if (l == r)    return;
    if (k <= mid)    build(l, mid, lc[x], lc[y], k);
    else    build(mid + 1, r, rc[x], rc[y], k);
}

int ask(int l, int r, int x, int y, int ql, int qr) {
    if (l == ql && r == qr)    return sum[y] - sum[x];
    if (qr <= mid)    return ask(l, mid, lc[x], lc[y], ql, qr);
    else if (ql > mid)    return ask(mid + 1, r, rc[x], rc[y], mid + 1, qr);
    else    return ask(l, mid, lc[x], lc[y], ql, mid) + ask(mid + 1, r, rc[x], rc[y], mid + 1, qr);
}

int main() {
    n = read(), m = read();
    for (int i = 1; i <= n; ++i) {
        int x = read();
        build(1, 1e5, rt[i], rt[i - 1], x);
    }
    for (int i = 1; i <= m; ++i) {
        int l = read(), r = read(), k = read();
        printf("%d\n", ask(1, 1e5, rt[l - 1], rt[r], 1, k));
    }
    return 0;
}

要吐槽的是主席树200多MS,直接模拟500多MS那我还是模拟把(小声bb) = = !!

哎,还别……好吧你走吧,离线咱不会 +_+

每日一题 文章被收录于专栏

每日一题

全部评论

相关推荐

点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务