BZOJ 3289 莫队 树状数组

BZOJ 3289
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=3289
题意:
问[L,R]区间最少交换几次相邻数字使得整个序列有序。
思路:
统计逆序对,用树状数组。然后跑一遍莫队。
离散化部分容易超时,所以直接修改了数组。
源码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#define LL unsigned int
const int MAXN = 50000 + 5;
int tr[MAXN * 2];       ///tree array
int cnt;
int lowbit(int u){return u & -u;}
void update(int u, int v)
{
    for(; u <= cnt ; u += lowbit(u)){
        tr[u] += v;
    }
}
LL query(int u)
{
    LL ans = 0;
    for(; u; u -= lowbit(u)) {
        ans += tr[u];
    }
    return ans;
}
int data[MAXN];
int pos[MAXN];
int blocksize;
int n, m;
struct Q
{
    int l, r, id;
}q[MAXN];
bool cmp(Q a, Q b)
{
    if(pos[a.l] == pos[b.l]) return a.r < b.r;
    return a.l < b.l;
}
int tt[MAXN];
LL res[MAXN];
map<int,int>mm;
int main()
{
//    freopen("BZOJ 3289.in", "r", stdin);
    while(scanf("%d", &n) != EOF){
        blocksize = sqrt(1.0 * n);
        for(int i = 1 ; i <= n ; i++) scanf("%d", &data[i]), tt[i] = data[i], pos[i] = (i - 1) / blocksize;
        sort(tt + 1 , tt + 1 + n);
        mm.clear();
        cnt = 0;
        for(int i = 1 ; i <= n ; i++){  ///离散化
            if(mm[tt[i]] == 0) mm[tt[i]] = ++cnt;
        }
        for(int i = 1 ; i <= n ; i++) data[i] = mm[data[i]];
//        for(int i = 1 ; i <= n ; i++) printf("data[i] = %d, mm = %d\n", data[i], mm[data[i]]);
//        printf("cnt = %d\n", cnt);
//        system("pause");
        scanf("%d", &m);
        for(int i = 0 ; i < m ; i++) scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
        sort(q, q + m, cmp);
        int curr = 0;
        int curl = 1;
        memset(tr, 0, sizeof(tr));
        LL ans = 0;
        for(int i = 0 ; i < m ; i++){
            for(int j = curr + 1 ; j <= q[i].r ; j++) update(data[j], 1), ans += j - curl + 1 - query(data[j]);
//            printf("ans = %I64d\n", ans);
            for(int j = curr ; j > q[i].r ; j--) update(data[j], -1), ans -= j - curl - query(data[j]);
//            printf("ans = %I64d\n", ans);
            curr = q[i].r;
            for(int j = curl ; j < q[i].l ; j++) update(data[j], -1), ans -= query(data[j] - 1);
//            printf("ans = %I64d\n", ans);
            for(int j = curl - 1 ; j >= q[i].l ; j--) update(data[j], 1), ans += query(data[j] - 1);
//            printf("ans = %I64d\n", ans);
            curl = q[i].l;
            res[q[i].id] = ans;
//            printf("l = %d, r = %d, ans = %I64d\n", q[i].l, q[i].r, ans);
        }
        for(int i = 0 ; i < m ; i++) printf("%d\n", res[i]);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值