【CZY选讲·逆序对】
题目描述
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]; else
if (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》
【CZY选讲·逆序对】的更多相关文章
- 【CZY选讲·Hja的棋盘】
题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 【CZY选讲·最大子矩阵和】
题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解: ①如果没有p,那么二维矩阵和就是一维最长 ...
- 【CZY选讲·Yjq的棺材】
题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- 【CZY选讲·棋盘迷宫】
题目描述 一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”. 数据范围 N,M <=500,Q ...
- 【CZY选讲·扩展LCS】
题目描述 给出两个仅有小写字母组成的字符串str1 和str2,试求出两个串的最长公共子序列. 数据范围 |str1| ⩽ 1000; |str2| ⩽ 10^6 题解: ①直接进行LCS( ...
- 【CZY选讲·次大公因数】
题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...
随机推荐
- 灵光一现的trick
感觉平时会丢掉好多挺好的trick…… 图论 1.图G,固定S,T.可以将任意一条边加上权值$k(k>0)$,求最大化加权后最短路. 2.图G,固定S,T.可以将任意一条边乘以权值$k(k> ...
- IDEA搭建SSM出现的一些错误
下面是我这几天整合SpringMVC+Spring+MyBatis框架遇到的一些问题 ,在这里总结一下: 1:HTTP Status 500 - Request processing failed; ...
- tcl之文件操作
- PTA 7-12(图) 社交网络图中结点的“重要性”计算 最短路
7-12(图) 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的 ...
- pyhton,数据类型
标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) Tuple(元组) List(列表) Sets(集合) Dictionary(字典) 重点是: 类 ...
- Sql Server多种分页性能的比较
一.前言 因为工作关系,遇到了非常大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页能够解决的,需要从多多方面考虑,从分表.分库等等.但是这个也让我考虑到了分页性能的问题,在不同数据 ...
- 微信支付 h5
Android开发要点说明 商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID.由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付. ...
- latex排版系统
proTeXt - MiKTeX-based distribution for Windows proTeXt aims to be an easy-to-install TeX distributi ...
- 剑指Offer - 九度1515 - 打印1到最大的N位数
剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...
- 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。
写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...