hdu2688 Rotate(树状数组)

题目链接:点击打开链接

题意描述:对一个长度为2<=n<=3000000的数组,求数组中有序对(i<j并且F[i]<F[j])的数量?其中数组元素F[i]范围(0<F[i]<=10000),现有m<10000个操作

操作一:R x y(其中y-x<=1000)将数组x~y之间的元素旋转

操作二:Q查询当前数组中含有的有序对的数量

解题思路:

1、先求的原始数组中有序对的总数量(如果直接求,则时间复杂度为O(n*10000);如果使用树状数组时间复杂度为O(nlgn))即O(n*14)

2、对于每次操作一,循环遍历F[x+1]~F[y]中元素与F[x]的关系,对总数量进行加减即可O(1000*m)

3、对于操作二,直接输出总数量即可(O(1))

代码:

#include <cstdio>
#include <cstring>
#define MAXN 3000010
using namespace std;
int d[MAXN];
int C[10010];
int n,m;
int lowbit(int x)
{
    return x&(-x);
}
int sum(int pos)
{
    int res=0;
    while(pos>0)
    {
        res+=C[pos];
        pos-=lowbit(pos);
    }
    return res;
}
void add(int pos,int v)
{
    while(pos<=10000)
    {
        C[pos]+=v;
        pos+=lowbit(pos);
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(C,0,sizeof(C));
        long long ans=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&d[i]);
            add(d[i],1);
            ans+=sum(d[i]-1);
        }
        scanf("%d",&m);
        char st[10];
        for(int i=1; i<=m; ++i)
        {
            scanf("%s",st);
            switch(st[0])
            {
            case 'Q':
                printf("%I64d\n",ans);
                break;
            case 'R':
                int l,r;
                scanf("%d%d",&l,&r);
                int v=d[l];
                for(int j=l+1; j<=r; j++)
                {
                    if(d[j]>v) ans--;
                    else if(d[j]<v) ans++;
                    d[j-1]=d[j];
                }
                d[r]=v;
                break;
            }
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 15:12:20

hdu2688 Rotate(树状数组)的相关文章

Poj 2182-Lost Cows(Treap||树状数组+二分答案)

题目链接:点击打开链接 题意:n个牛编号为1-n 现在编号顺序已经打乱,给出a[i] ,a[i] 代表i位置前面有几个小于它的编号,求编号顺序. 倒着推,对于最后一个a[i] , 最后位置编号肯定是 a[i]+1,然后在1-n个编号中删掉当前编号,继续往前推..即求第 a[i]+1小数,初始容器中有n个数(1-n) ,每求出来一个就删掉.先用平衡树水了一发..明天写树状数组解法. #include <algorithm> #include <iostream> #include &

【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,

BZOJ_1901_&amp;_ZJU_2112_Dynamic_Rankings(主席树+树状数组/线段树+(Treap/Splay))

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l,r]内的第k小的值. 分析 对于只有第一种询问的问题: POJ_2104_Kth(主席树) 现在要求动态.我们思考这样一个问题:把求区间第k小的问题变成求区间和值的问题,这个好解决吧?对于静态的问题,我们使用前缀和即可解决,那么对于动态的呢?使用树状数组维护前缀和.那么现在把问题变回求区间第k小值的

Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)

Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序,并将所有排列编号(从0开始),给出排列的编号得到对应排列)用到的式子.可以想到用逆康托展开的方法.但是需要一些变化: for(i=n;i>=1;i--) { s[i-1]+=s[i]/(n-i+1); s[i]%=(n-i+1); } 例如:n=3时,3=0*2!+0*1!+3*0!应该变为3=1

bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 RELEASE操作可以对应LCT的 access,RECENTER则是 makeroot: 考虑颜色数,把一条实边变成虚边,子树+1,虚变实子树-1: 但有换根操作,怎么维护子树? 也可以用 dfs 序线段树维护,其实换 rt 只是 splay 的根方向改变,对应的子树还是可以找到的: 注意虚边变实或实边变虚时要找子树,不是直接找那个儿子,而是找那个儿子所在 splay 的根: 然后

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

(POJ 3067) Japan (慢慢熟悉的树状数组)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29295   Accepted: 7902 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击