欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

HDU 4638 Group 【樹狀數組,分塊亂搞(莫隊算

系統 1807 0

根據題目意思,很容易得出,一個區間里面連續的段數即為最少的group數。

題解上面給的是用樹狀數組維護的。

詢問一個區間的時候,可以一個一個的向里面添加,只需要判斷a[i]-1 和 a[i]+1是否已經添加在內,如果兩個都在,則總段數減1,如果兩個都不在,總段數加1,其他情況總段數不變了。這里有一個需要深入理解的就是其實無論是按順序添加還是隨便添加,統計結果是不變的,但是要看怎么維護了。

每加入一個點,都會有一個改變量v[i],那么此時總段數就是sum{ v[i] } (1 <= i <= x) ,因此用樹狀數組維護前綴和即可。


樹狀數組實現:

?

    #include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

#define N 101000

bool vis[N];

int n, s[N], m, ans[N], a[N], p[N];

struct node {

    int l, r, id;

    bool operator<(const node &x) const {

        return r > x.r;

    }

} q[N];

inline int lowbit(int x) {

    return x&(-x);

}

void add(int x, int v) {

    while (x <= n) {

        s[x] += v;

        x += lowbit(x);

    }

}

int sum(int x) {

    int ret = 0;

    while (x) {

        ret += s[x];

        x -= lowbit(x);

    }

    return ret;

}

int main() {

    int T;

    scanf("%d", &T);

    while (T--) {

        scanf("%d%d", &n, &m);

        for (int i=1; i<=n; i++) {

            scanf("%d", &a[i]);

            p[a[i]] = i;

        }

        memset(s, 0, sizeof(s));

        memset(vis, false, sizeof(vis));

        for (int i=n; i>0; i--) {

            if (vis[a[i]-1] && vis[a[i]+1]) add(i, -1);

            if (!vis[a[i]-1] && !vis[a[i]+1]) add(i, 1);

            vis[a[i]] = true;

        }



        for (int i=0; i<m; i++) {

            scanf("%d%d", &q[i].l, &q[i].r);

            q[i].id = i;

        }



        sort(q, q+m);

        int j = n;

        for (int i=0; i<m; i++) {

            while (j > q[i].r) {

                if (a[j]>1 && p[a[j]-1] < j) add(p[a[j]-1], 1);

                if (a[j]<n && p[a[j]+1] < j) add(p[a[j]+1], 1);

                j--;

            }

            ans[q[i].id] = sum(q[i].r) - sum(q[i].l-1);

        }



        for (int i=0; i<m; i++) printf("%d\n", ans[i]);

    }



    return 0;

}


  


?


比賽時候,我用的分塊的思想,想到復雜度是O(n*sqrt(n))的,可能有點懸,結果TLE了,以為真的是卡時間了,其實是自己的代碼寫殘了(一個小細節害死人啊),調試了很長時間,直接用原題的大數據debug是要命啊??偹阏业絙ug了。其實也是可以過的么……呵呵……數據水?

種解法和 CF 86D Powerful array ?的解法是一樣的。


?

    #include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

using namespace std;

#define N 100100

bool vis[N];

int a[N], n, m, all, L, R, ans[N];



struct node {

    int l, r, b, id;

    bool operator<(const node &x)const{

        if (b == x.b) return r < x.r;

        return b < x.b;

    }

} q[N];



void query(int x, int y, int flag) {

    if (flag != 0) {

        for (int i=x; i<L; i++) {

            vis[a[i]] = true;

            if (vis[a[i]-1] && vis[a[i]+1]) all--;

            else if (!vis[a[i]-1] && !vis[a[i]+1]) all++;

        }

        for (int i=R+1; i<=y; i++) {

            vis[a[i]] = true;

            if (vis[a[i]-1] && vis[a[i]+1]) all--;

            else if (!vis[a[i]-1] && !vis[a[i]+1]) all++;

        }

        for (int i=L; i<x; i++) {

            vis[a[i]] = false;

            if (vis[a[i]-1] && vis[a[i]+1]) all++;

            else if (!vis[a[i]-1] && !vis[a[i]+1]) all--;

        }

        for (int i=y+1; i<=R; i++) {

            vis[a[i]] = false;

            if (vis[a[i]-1] && vis[a[i]+1]) all++;

            else if (!vis[a[i]-1] && !vis[a[i]+1]) all--;

        }

    } else {

        all = 0;

        for (int i=x; i<=y; i++) {

            vis[a[i]] = true;

            if (vis[a[i]-1] && vis[a[i]+1]) all--;

            else if (!vis[a[i]-1] && !vis[a[i]+1]) all++;

        }

    }

    L = x, R = y;

}

int main() {

    int T;

    scanf("%d", &T);



    while (T--) {

        scanf("%d%d", &n, &m);

        int block_size = sqrt(n);



        for (int i=1; i<=n; i++)  scanf("%d", &a[i]);

        for (int i=0; i<m; i++) {

            scanf("%d%d", &q[i].l, &q[i].r);

            q[i].b = q[i].l / block_size;

            q[i].id = i;

        }

        sort(q, q+m);

        memset(vis, false, sizeof(vis));



        for (int i=0; i<m; i++) {

            query(q[i].l, q[i].r, i);

            ans[q[i].id] = all;

        }

        for (int i=0; i<m; i++)  printf("%d\n", ans[i]);

    }



    return 0;

}


  


?


?

HDU 4638 Group 【樹狀數組,分塊亂搞(莫隊算法?)】


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久精品免费观看 | 亚洲欧美日韩在线观看播放 | 久久999视频 | 国产精品国产三级国产aⅴ原创 | 日韩国产一区二区 | 亚洲福利视频网 | 亚洲精品久久久久一区二区 | 国产欧美精品一区二区三区 | 日本在线视频一区二区 | 富二代精品视频 | 亚洲精品三级 | 精品小视频在线 | 久在线 | 免费黄色大片在线观看 | 国产一区二区不卡 | 国内精品免费一区二区观看 | 久久久99精品免费观看 | 亚洲精品乱码久久久久久蜜桃91 | 99精品视频在线 | 亚洲成av | 欧美一级一级 | 国产精品99爱免费视频 | 中国人xxxxx18 | 成人网页 | 成人欧美一区二区三区视频xxx | 人人九九精品 | 999在线| 免费黄色大全 | 超碰在线影院 | 免费一二区 | 一级黄色片在线 | 人人九九| 国产se| 国产精品久久久久久久久久 | 国产目拍亚洲精品99久久精品 | 成人国产精品视频 | 精品国产午夜福利在线观看 | 91免费视频网站 | 夜夜摸天天操 | 精品国产欧美 | 亚洲精品视频免费观看 |