题目描述

LYK最近在研究逆序对。 这个问题是这样的。 一开始LYK有一个2^n长度的数组ai。 LYK有Q次操作,每次操作都有一个参数k。表示每连续2^k长度作为一个小组。假设 n=4,k=2,则a[1],a[2],a[3],a[4]为一个小组,a[5],a[6],a[7],a[8]为一个小组, a[9],a[10],a[11],a[12]为一个小组,a[13],a[14],a[15],a[16]也为一个小组。 然后LYK对于每个小组都翻转,也就是说原数组会变成 a[4],a[3],a[2],a[1],a[8],a[7],a[6],a[5],a[12],a[11],a[10],a[9],a[16],a[15],a[14],a[13 ]。之后它想求出这2^n个数的逆序对是多少。 因此你需要输出对于每次操作,操作完后这2^n个数的逆序对有多少对。两个数ai,aj被称为逆序对当且仅当iaj。

数据范围

n<=17,Q<=200000,1<=ai<=2^n。

题解:

         ①尝试将操作转化为可以记录翻转状态的形式

         ②找规律:

     对f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+f[7]+f[8]进行2^3操作

                             f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+f[7]+f[8] 

                           =f[2]+f[1]+f[4]+f[3]+f[6]+f[5]+f[8]+f[7] 

                           =f[4]+f[3]+f[2]+f[1]+f[8]+f[7]+f[6]+f[5] 

                           =f[8]+f[7]+f[6]+f[5]+f[4]+f[3]+f[2]+f[1]

           ③然后每次2k操作转化为按照上述方式(认真观察上述方式)交换长度为21,22…2k子区间

           ④使用down[i]表示按照上述规律的翻转的长度为2i单位区间每一对之间的逆序对数之和。

             ⑤使用up[i]表示按照上述规律的翻转的长度为2i单位区间每一对之间的顺序对数之和。

           ⑥使用f[i]表示当前区间是否被反转。

           ⑦每次询问处理:O(logn),小于k的区间就根据f[i]加,大于k的直接加

           ⑧初始化使用归并排序求出原先的总逆序对数同时初始化down,up,f

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
const int N=(1<<17)+5;
long long st[N][20],ST[N][20];
int p[N],i,sum,o,a[N],b[N],n,T,PP,now,j,A,RR[N];
void gb(int l,int r)
{if (l==r) return;int mid=(l+r)/2;gb(l,mid); gb(mid+1,r);int i=l,j=mid+1,o=l;for (i=l; i<=r; i++) b[i]=a[i];for (i=r; i>=mid; i--) {RR[i]=i; if (i!=r && b[i+1]==b[i]) RR[i]=RR[i+1];}i=l; j=mid+1;while (i<=mid && j<=r){if (b[i]<=b[j]) {a[o++]=b[i];if (b[i]==b[j]) ST[l][p[r-l+1]]+=RR[j]-j+1; i++;} else{a[o++]=b[j]; st[l][p[r-l+1]]+=mid-i+1;j++;}}if (i<=mid) for (j=i; j<=mid; j++) a[o++]=b[j]; elseif (j<=r) for (i=j; i<=r; i++) a[o++]=b[i];
}
long long t[105],TT[105];
int main()
{freopen("pair.in","r",stdin);freopen("pair.out","w",stdout);scanf("%d",&n);sum=(1<<n);for (i=1; i<=sum; i++) scanf("%d",&a[i]);for (i=1; i<=17; i++) p[1<<i]=i;gb(1,sum);scanf("%d",&T);for (i=1; i<=n; i++)for (j=1; j<=(1<<n); j+=(1<<i)){t[i]+=st[j][i];TT[i]+=ST[j][i];}long long ans=0;while (T--){int Q;scanf("%d",&Q);for (i=1; i<=Q; i++) t[i]=1ll*(1<<i-1)*(1<<i-1)*(1<<n-i)-TT[i]-t[i];for (i=1; i<=n; i++) ans+=t[i];printf("%I64d\n",ans); ans=0;}return 0;
}//czy020202

 

No need to doubt all my lost to faded glory,

My soul is small but longs to roam.——————汪峰《Song Of Redemption》

转载于:https://www.cnblogs.com/Damitu/p/7654576.html

【CZY选讲·逆序对】相关推荐

  1. 牛客网【每日一题】4月16日题目精讲 逆序对

    文章目录 题目描述 题解: 代码 传送 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format:%lld 题目描述 求所 ...

  2. 算法R2D3-复习快选归并逆序对数量

    第k个数 一遍ac,还是很不错的 n,k = map(int,input().split()) a = list(map(int,input().split()))def quick_sort(a,l ...

  3. 【CZY选讲·吃东西】

    题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...

  4. 【CZY选讲·Yjq的棺材】

    题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...

  5. 【CZY选讲·最大子矩阵和】

    题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解:    ①如果没有p,那么二维矩阵和就是一维最长 ...

  6. 【CZY选讲·Triangle】

    题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解:      ①相 ...

  7. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  8. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  9. 蓝桥杯-逆序对(java)

    算法训练 逆序对   时间限制:1.0s   内存限制:256.0MB 问题描述 Alice是一个让人非常愉跃的人!他总是去学习一些他不懂的问题,然后再想出许多稀奇古怪的题目.这几天,Alice又沉浸 ...

  10. 数据结构与算法--数组中的逆序对

    题目:在数组中的两个数字如果签名一个数字大于后面的数组,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 案例:输入数组{7,5,6,4}中一共有5个逆序对分别是{7,6},{ ...

最新文章

  1. Active MQ 双主 和 mysql双主 方案测试
  2. Win10系统下Visio安装失败问题
  3. 信息系统项目管理师-战略管理知识点
  4. mongodb数组更新操作符$addToSet
  5. mysql adduser_SQL创建登陆用户和赋予权限
  6. 【3】数据筛选3 - BeautifulSoup4
  7. formdata上传文件_封装一个多文件断点续传、分片上传、秒传、重试机制的组件...
  8. 调用iphone客户端进行授权发微博的方法--使用友盟组件
  9. 普华永道发表2012年全球信息安全状况调查报告
  10. 如何使用Wondershare DVD Creator将照片刻录到DVD中?
  11. 一维码和二维码相关知识
  12. excel导出动态表头以及二级三级表头,还有数据库动态的数据来源
  13. 《大秦帝国三:崛起》 剧情简介和最新进展
  14. An End-to-End Steel Surface Defect Detection Approach via Fusing Multiple Hierarchical Features-阅读笔记
  15. 微信的常用设备 只能看到android,安卓手机撤回的微信图片可以查看啦,赶紧学起来...
  16. 什么是数字化?企业如何实现数字化?
  17. java get和post请求参数设置,Get和Post两种方式向指定地址提交表单
  18. HackTools————3、简易Web端口扫描
  19. 安卓之Animator讲解
  20. 小米手机二手回收价格大全2022价格表

热门文章

  1. js 去除数组里的空值
  2. 蜘蛛会抓取html框架,百度蜘蛛抓取网站的UA汇总
  3. 磨刀不误砍柴工(四)-IDEA常用快捷键
  4. 《日内交易策略-谷物期货交易实战指南》笔记
  5. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 二
  6. 【论文笔记】Contextual Diversity for Active Learning(ECCV2020)
  7. 蒟蒻的noip2015滚粗记
  8. mysql 富文本 字段,富文本引起MYSQL出错
  9. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年11月份最新版)
  10. scrapy爬取网页数据