亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1747 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條評論
主站蜘蛛池模板: 日韩欧美高清一区 | 中文字幕在线观看第二页 | 久久久久久国产精品免费免费 | 国产无套乱子伦精彩是白视频 | 国产第九页 | 色综合久久夜色精品国产 | 操操操天天操 | 亚洲成人精品在线 | 欧美另类久久久精品 | 国内精品久久久久影院亚洲 | 九九亚洲精品自拍 | 99热最新网址 | 一区二区日韩欧美 | 国产香蕉视频 | 伊人网址| 国内自拍 在线播放 网红 | 天天夜夜爽 | 亚洲综合精品一二三区在线 | 日韩一区精品视频在线看 | 添人人躁日日躁夜夜躁夜夜揉 | 女人隐私秘视频黄www免费 | 久久人人爽人人爽人人片av不 | 成 人 黄 色 免费网 | 亚洲国产成人久久77 | 国产精品成人一区二区1 | 中文字幕在线免费播放 | 国产一级特黄全黄毛片 | 手机看片亚洲 | 欧美一级级a在线观看 | 国产精品第4页 | 狠狠色伊人亚洲综合第8页 狠狠色综合久久丁香婷婷 狠狠色综合久久婷婷 | 国产梦呦精品 | 玖玖成人网 | 色xxx| 67194老司机精品午夜 | 日本特黄特色aaa大片免费 | 精品哟啊呦v视频在线观看 精品哟哟国产在线观看 | 不卡一级毛片免费高清 | 奇米888888 | 99精品在线看 | 精品综合久久久久久88小说 |