BZOJ3295: [Cqoi2011]动态逆序对 莫队
这个用莫队做会被卡,但是我还是......
收获在于树状数组维护后缀和以及双维排序......
莫队的时间复杂度比想象中的要好一些....
然而我还是被卡了......
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define MAXN 100005
using namespace std;
int pos[MAXN],len,a[MAXN],front[MAXN],back[MAXN],n,m,t[MAXN],p,now,b[MAXN],live[MAXN];
struct Q
{
int pos,time,ans;
}q[MAXN];
int comp(const Q x,const Q y)
{
return pos[x.pos]<pos[y.pos]||(pos[x.pos]==pos[y.pos]&&x.time<y.time);
}
int end_comp(const Q x,const Q y)
{
return x.time<y.time;
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void update_front(int x,int i)
{
if(x==)return;
while(x>)
{
front[x]+=i;
x-=lowbit(x);
}
}
inline void update_back(int x,int i)
{
if(x==)return;
while(x<=n)
{
back[x]+=i;
x+=lowbit(x);
}
}
inline int sum_front(int x)
{
int ret=;
while(x<=n)
{
ret+=front[x];
x+=lowbit(x);
}
return ret;
}
inline int sum_back(int x)
{
int ret=;
while(x>)
{
ret+=back[x];
x-=lowbit(x);
}
return ret;
}
long long ans;
void pre()
{
scanf("%d%d",&n,&m);
len=(int)(sqrt(n+0.5));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
live[a[i]]=i;
pos[i]=(i-)/len+;
}
for(int i=n;i>;i--)
{
ans+=sum_back(a[i]-);
update_back(a[i],);
}
update_back(a[],-);
p=;
now=;
for(int i=;i<=m;i++)
{
scanf("%d",&b[i]);
q[i].pos=live[b[i]];
q[i].time=i;
}
sort(q+,q+m+,comp);
}
inline void via(int pl,int i)
{
a[live[pl]]=(i==)?pl:;
if(live[pl]<p)update_front(pl,i);
if(live[pl]>p)update_back(pl,i);
}
inline void do_front(int pl)
{
update_front(a[pl],);
update_back(a[pl+],-);
}
inline void do_back(int pl)
{
update_back(a[pl],);
update_front(a[pl-],-);
}
void work()
{
for(int i=;i<=m;i++)
{
while(now<q[i].time)via(b[now++],-);
while(now>q[i].time)via(b[--now],);
while(p<q[i].pos)do_front(p++);
while(p>q[i].pos)do_back(p--);
q[i].ans=sum_front(a[q[i].pos]+)+sum_back(a[q[i].pos]-);
}
}
void print()
{
sort(q+,q+m+,end_comp);
for(int i=;i<=m;i++)
{
printf("%lld\n",ans);
ans-=q[i].ans;
}
}
int main()
{
//freopen("inverse.in","r",stdin);
//freopen("inverse.out","w",stdout);
pre();
work();
print();
return ;
}
BZOJ3295: [Cqoi2011]动态逆序对 莫队的更多相关文章
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
随机推荐
- PHP-提升PHP性能的几个扩展
下面介绍的几个扩展原理都是对OPCODE进行缓存(Opcode缓存原理查看http://www.cnblogs.com/JohnABC/p/4531029.html): Zend Opcache: 由 ...
- 网站如何防止sql注入攻击的解决办法
首先我们来了解下什么是SQL注入,SQL注入简单来讲就是将一些非法参数插入到网站数据库中去,执行一些sql命令,比如查询数据库的账号密码,数据库的版本,数据库服务器的IP等等的一些操作,sql注入是目 ...
- IO复用——poll系统调用
1.poll函数 #include<poll.h> int poll(struct pollfd* fds, nfds_t ndfs, int timeout) poll函数在一定的时间内 ...
- Kubernetes-深入分析集群安全机制(3.6)
集群的安全性主要考虑以下几个方面: 容器与所在宿主机的隔离: 限制容器给基础设施及其他容器带来消极影响的能力: 最小权限原则--合理限制所有组件的权限,确保组件只执行它被授权的行为,通过限制单个组件的 ...
- COURSES POJ1469(模板)
Description Consider a group of N students and P courses. Each student visits zero, one or more than ...
- ssrf小记
SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击 一.危害 1.对内网的端口和服务进行扫描,对主机本地 ...
- LeetCode:15. 3Sum(Medium)
1. 原题链接 https://leetcode.com/problems/3sum/description/ 2. 题目要求 数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整 ...
- itop-4412开发板使用第一篇-信号量的学习使用
1. 本次基于itop-4412研究下Linux信号量的使用方法. 2. 创建信号量的函数,信号量的头文件在那个路径?编译应用程序的话,头文件有3个路径,内核源码头文件,交叉编译器头文件,ubuntu ...
- 剁了xp,醉了win7
装完win7,安装各种软件完毕,重启,然并卵. cpu,内存飙升!! svchost.exe这个进程内存发疯了一样往上飙升 从 几十兆 到占用1个多G, 纳尼, 总共物理内存才2G. ╮(╯▽╰) ...
- PostgreSQL 数据库升级
PostgreSQL软件版本升级后,需要使用pg_upgrade迁移旧版本的数据库,具体的操作参数可以参考官方文档,在此记录一下操作过程中出现的细节问题: 新版本软件在initdb的时候要保证loca ...