BZOJ 3295 动态逆序对
调了好久。。。。
转化成三维偏序,cdq处理。
好像比较快?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 300500
using namespace std;
long long n,m,x,a[maxn],pos[maxn],f1[maxn],f2[maxn],t[maxn],ans=;
struct pnt
{
long long a,b,c,ans;
}p[maxn];
bool cmp1(pnt x,pnt y) {return x.b<y.b;}
bool cmp2(pnt x,pnt y) {return x.b>y.b;}
bool cmp3(pnt x,pnt y) {return x.a<y.a;}
long long lowbit(long long x) {return (x&(-x));}
void add(long long x,long long val)
{
for (long long i=x;i<=n;i+=lowbit(i))
t[i]+=val;
}
long long ask(long long x)
{
long long ret=;
for (long long i=x;i>=;i-=lowbit(i))
ret+=t[i];
return ret;
}
void cdq1(long long left,long long right)
{
long long mid=left+right>>;
sort(p+left,p+mid+,cmp1);sort(p+mid+,p+right+,cmp1);
long long i=left,j=mid+;
while (j<=right)
{
while ((i<=mid) && (p[i].b<p[j].b))
{
add(p[i].c,);
i++;
}
p[j].ans+=ask(n)-ask(p[j].c);
j++;
}
for (long long j=left;j<i;j++) add(p[j].c,-);
}
void cdq2(long long left,long long right)
{
long long mid=left+right>>;
sort(p+left,p+mid+,cmp2);sort(p+mid+,p+right+,cmp2);
long long i=left,j=mid+;
while (j<=right)
{
while ((i<=mid) && (p[i].b>p[j].b))
{
add(p[i].c,);
i++;
}
p[j].ans+=ask(p[j].c-);
j++;
}
for (long long j=left;j<i;j++) add(p[j].c,-);
}
void cdq(long long left,long long right)
{
if (left==right) return;
long long mid=left+right>>;
cdq(left,mid);cdq(mid+,right);
cdq1(left,right);
cdq2(left,right);
}
int main()
{
scanf("%lld%lld",&n,&m);
for (long long i=;i<=n;i++)
{
scanf("%lld",&a[i]);
pos[a[i]]=i;
}
for (long long i=;i<=n;i++)
{
f1[pos[i]]=(pos[i]-)-ask(pos[i]-);
ans+=f1[pos[i]];
f2[pos[i]]=ask(n)-ask(pos[i]);
add(pos[i],);
}
memset(t,,sizeof(t));
for (long long i=;i<=m;i++)
{
scanf("%lld",&x);
p[i].a=i;p[i].b=pos[x];p[i].c=x;
}
cdq(,m);
sort(p+,p+m+,cmp3);
for (long long i=;i<=m;i++)
{
printf("%lld\n",ans);
x=p[i].c;
ans-=(f1[pos[x]]+f2[pos[x]]);
ans+=(p[i].ans);
}
return ;
}
BZOJ 3295 动态逆序对的更多相关文章
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- bzoj 3295 动态逆序对 (三维偏序,CDQ+树状数组)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 思路: 可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用 ...
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...
- BZOJ - 3295 动态逆序对 (树状数组套treap)
题目链接 思路和bzoj2141差不多,不过这道题的数据更强一些,线段树套treapT了,树状数组套treap卡过~~ #include<bits/stdc++.h> using name ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
随机推荐
- POJ 2464 Brownie Points II (树状数组,难题)
题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个sta ...
- jQuery学习记录1
jquery 和 js css里面都是坑呀 this.style.backgroundColor 和 css {background:#8df;} 是冲突的,用了前者,再$(this).addClas ...
- C# Task的使用---Task的启动
.NET 4.0包含的新名称空间System.Threading.Tasks,它包含的类抽象出了线程功能.任务表示应完成的某个单元的工作.这个单元的工作可以在单独的线程中运行,也可以以同步的方式启动一 ...
- BFS+贪心 HDOJ 5335 Walk Out
题目传送门 /* 题意:求从(1, 1)走到(n, m)的二进制路径值最小 BFS+贪心:按照标程的作法,首先BFS搜索所有相邻0的位置,直到1出现.接下去从最靠近终点的1开始, 每一次走一步,不走回 ...
- lintcode: 生成括号
生成括号 给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果. 样例 给定 n = 3, 可生成的组合如下: "((()))", "(()())&q ...
- WPA/WAP2wifi 密码破解笔记
前言: 相对于前一段时间脆弱的WEP路由器而言,当今的路由器加密方式也大都改变为WPA/WPA2,使得无线路由器的破解难度增加.虽然如此,但还是有很多漏洞层出不穷,如WPS.退一步来说,即使加密算法无 ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
- Qt源代码分析
记下好文章,慢慢看,然后加上自己心得: http://www.cnblogs.com/hicjiajia/archive/2011/08/27/2155512.html Qt源码分析之信号和槽机制ht ...
- 改变dijit的长度的心得
改变dijit的长度要进入到里面改 如dijit/form/Select (以table的方式来组合控件) 改变的时候,先找到dijitButtonContent 然后在后面样式文件里写就可以了 ...
- DB2行转列、列转行等操作
DB2 行转列 ----start 在网上看到这样一个问题:(问题地址:http://www.mydb2.cn/bbs/read.php?tid=1297&page=e&#a) 班级 ...