刷题总结——动态逆序对(bzoj3295)
题目:
Description
Input
Output
Sample Input
1
5
3
4
2
5
1
4
2
Sample Output
2
2
1
样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。
HINT
N<=100000 M<=50000
Source
题解:
同样的一道三维偏序题,将删除看成倒着插入,从而得出:<插入时间,位置,大小>(<t,a,b>),对于一个组数<t,a,b>,找寻(t>t1,a>a1且b<b1)的数量加到对应的ans[t]中,注意最后将ans叠加起来;
另外要注意在排完t后,a要正着排序求一遍ans然后倒着排序一遍ans,否则ans会少加(想想为什么单纯地求逆序对不用这样)
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=1e5+;
struct node
{
int t,a,b;
}q[N],temp[N];
int n,m,tree[N],to[N],tag[N],tim;
long long ans[N];
long long Ans;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline bool cmp(node a,node b)
{
return a.t<b.t;
}
inline bool comp(node a,node b)
{
return a.a<b.a;
}
inline void insert(int u,int v)
{
for(int i=u;i<=n;i+=(i&(-i)))
if(tag[i]!=tim) tag[i]=tim,tree[i]=v;
else tree[i]+=v;
}
inline bool comp2(node a,node b)
{
return a.a>b.a;
}
inline int query(int u)
{
int temp=;
for(int i=u;i;i-=(i&(-i)))
if(tag[i]!=tim) continue;
else temp+=tree[i];
return temp;
}
inline void solve1(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;
solve1(l,mid),solve1(mid+,r);
int i=l,j=mid+,k=l;tim++;
while(i<=mid&&j<=r)
{
if(comp(q[i],q[j]))
{
insert(q[i].b,);
temp[k++]=q[i++];
}
else
{
ans[q[j].t]+=query(n)-query(q[j].b);
temp[k++]=q[j++];
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r)
{
ans[q[j].t]+=query(n)-query(q[j].b);
temp[k++]=q[j++];
}
for(j=l;j<=r;j++) q[j]=temp[j]; }
inline void solve2(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;
solve2(l,mid),solve2(mid+,r);
int i=l,j=mid+,k=l;tim++;
while(i<=mid&&j<=r)
{
if(comp(q[j],q[i]))
{
insert(q[i].b,);
temp[k++]=q[i++];
}
else
{
ans[q[j].t]+=query(q[j].b);
temp[k++]=q[j++];
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r)
{
ans[q[j].t]+=query(q[j].b);
temp[k++]=q[j++];
}
for(j=l;j<=r;j++) q[j]=temp[j];
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("a.in","r",stdin);
#endif
n=R(),m=R();
for(int i=;i<=n;i++)
{
q[i].a=i,q[i].b=R();
to[q[i].b]=i;
}
int Time=n,a;
for(int i=;i<=m;i++)
{
a=R();q[to[a]].t=Time--;
}
for(int i=;i<=n;i++)
if(!q[i].t) q[i].t=Time--;
sort(q+,q+n+,cmp);
solve1(,n);
sort(q+,q+n+,cmp);
solve2(,n);
for(int i=;i<=n;i++)
Ans+=ans[i];
for(int i=n;i>n-m;i--)
printf("%lld\n",Ans),Ans-=ans[i];
return ;
}
刷题总结——动态逆序对(bzoj3295)的更多相关文章
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3295 洛谷P3157、1393 动态逆序对——树套树
题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...
随机推荐
- [Python]输出中文报错的解决方法
问题现象:在PyCharm工具编辑python语句输出中文时,程序报错. 解决方法(2种): 1.在代码开头加#coding=utf-8(注意要加#) 2.还是在代码开头加#-*- coding: u ...
- Yii2.0数据格式器
平时我们在写代码中,总是要写一个单独的文件来全局处理常用的数据格式.Yii2.0却很人性化,为我们内置了一套数据格式器. 1.格式化日期和时间 Yii::$app->formatter-> ...
- selenium的定位
id定位 find_element_by_id()方法通过id来定位元素 例如: find_element_by_id("kw") find_element_by_id(&quo ...
- webpack前端构建工具学习总结(四)之自动化生成项目中的html页面
接续上文:webpack前端构建工具学习总结(三)之webpack.config.js配置文件 插件的介绍文档:https://www.npmjs.com/package/html-webpack-p ...
- Session 机制和 Cookie 机制
Session 机制和 Cookie 机制 HTTP协议是无状态的, 而Cookie和Session都是在无状态的基础上希望实现有状态的效果, 两者是在客户端或者是服务端使用缓存等手段来实现状态的维护 ...
- 创建一个文件夹用于写入UTF-8编码的文件
实现效果: 知识运用: File类的CreateText方法 StreamWriter类的WriteLine方法 实现代码: private void button2_Click(object sen ...
- VC-基础:VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
- Noip2016 提高组 蚯蚓
刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...
- 计算机应用 office系列 常用术语英文
首先,Excel 办公室系列软件——Office series Software 微软——Microsoftware 电子表格 Excel 第一行称为标题栏——title bar 第二行称为菜单栏—— ...
- viewDidLoad、loadView
一.loadView永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数,且 ...