Day6 - M - 动态逆序对 HYSBZ - 3295
Input
Output
Sample Input5 4 1 5 3 4 2 5 1 4 2
Sample Output5 2 2 1 样例解释 (1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。
思路:逆序对删除可以看作是三维偏序问题,三元组<pos,val,time>,排序定一序,分治定一序,一维直接树状数组维护求和即可
满足逆序对有2种情况:
1.pos0>pos, val0<val, time0<time
2.pos0<pos, val0>val, time0<time
可以在读入时定pos的序,就是求每个点左边值大于这个点的和右边值小于这个点的关于时间的偏序,时间都要大于这个点
在分治时,保证两个区间的pos是有序的,但区间内不保证,因为他们是val序,所以左右区间一个查询一个修改,就能保证pos序了
这样,在分治时分别统计两次即可,注意每次都要清空影响,最后直接用sort排序即可,因为时间大于这个点,所以统计的数量是sum(m+1)-sum(time0)
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL; const int maxm = 1e5+; int C[maxm], n, m, ans[maxm], Cache[maxm]; void add(int x, int val) {
for(; x <= n+; x += lowbit(x))
C[x] += val;
} int getsum(int x) {
int ret = ;
for(; x; x -= lowbit(x))
ret += C[x];
return ret;
} struct Node {
int val, tim, ans;
} buf[maxm], res[maxm]; bool cmpval(Node a, Node b) {
return a.val < b.val;
} void CDQ(int L, int R) {
if(L == R) return;
int mid = (L+R) >> ;
CDQ(L, mid), CDQ(mid+, R);
int i = L, j = mid+;
// 计算右边小于他的
while(i <= mid && j <= R) {
if(res[i].val > res[j].val)
add(res[j++].tim, );
else
res[i].ans += getsum(m+)-getsum(res[i++].tim);
}
while(i <= mid)
res[i].ans += getsum(m+)-getsum(res[i++].tim);
// 清除数组
for(int l = mid+; l < j; ++l)
add(res[l].tim, -); i = mid, j = R;
//左边大于他的
while(j > mid && i >= L) {
if(res[j].val < res[i].val)
add(res[i--].tim, );
else
res[j].ans += getsum(m+)-getsum(res[j--].tim);
}
while(j > mid)
res[j].ans += getsum(m+)-getsum(res[j--].tim);
for(int r = mid; r > i; --r)
add(res[r].tim, -);
sort(res+L, res+R+, cmpval);
} bool cmp2(Node a, Node b) {
return a.tim < b.tim;
} int main() {
scanf("%d%d", &n, &m);
int t;
for(int i = ; i <= n; ++i) {
scanf("%d", &t);
res[i] = {t};
Cache[t] = i;
}
for(int i = ; i <= m; ++i) {
scanf("%d", &t);
res[Cache[t]].tim = i;
}
for(int i = ; i <= n; ++i)
if(res[i].tim == )
res[i].tim = m + ;
LL ans = ;
for(int i = ; i <= n; ++i) {
add(res[i].val, );
ans += i - getsum(res[i].val);
}
for(int i = ; i <= n; ++i)
add(res[i].val, -);
CDQ(, n);
sort(res+, res++n, cmp2);
for(int i = ; i <= m; ++i) printf("%lld\n", ans), ans -= res[i].ans;
return ;
}
Day6 - M - 动态逆序对 HYSBZ - 3295的更多相关文章
- 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 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 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 ...
随机推荐
- Spring boot 中发送邮件
参考:https://blog.csdn.net/qq_39241443/article/details/81293939 添加依赖: <dependency> <groupId&g ...
- android.view.WindowManager$BadTokenException 崩掉
问题: 以前的项目,今天打开运行,Activity刚打开的时候,点开一个弹窗是好的,但是再点到另一个界面的时候,返回,再点弹窗就崩了. 解决: 网上查了一下,发现出现这个问题的还特别多,大体如下: 1 ...
- Redis的安装配置及简单集群部署
最近针对中铁一局项目,跟事业部讨论之后需要我们的KF平台能够接入一些开源的数据库,于是这两天研究了一下Redis的原理. 1. Redis的数据存储原理及简述 1.1Redis简述 Redis是一个基 ...
- Go 开发者平均年薪 46 万?爬数据展示国内 Go 的市场行情到底如何
随着云原生时代的到来,拥有高并发性.语法易学等特点的 Golang 地位逐渐凸显,在云原生编程中占据了主导地位.在近期出炉的 TIOBE 10 月编程语言排行榜中,Golang 从前一个月的 16 位 ...
- python多线程采集图片
cmd中运行 >python untitled2.py 图片的网站 import requests import threading from bs4 import BeautifulSo ...
- vue 输入框数字、中文验证
vue项目是基于element框架做的,在做form表单时,要做些验证,element框架也提供了自定义验证 下面是一些常见的验证 只允许输入数字: 可以直接用框架的rule去验证,但必须在model ...
- 论文写作+gnuplot制图
一:论文写作 论文写作推荐使用LATEX+TEXStudio+TEXLive 1.CTeX官方网站:http://www.ctex.org/HomePage ,他类似于python环境 2.TeXst ...
- 绕过waf
WAF:有硬件和软件类型. 常见的软WAF,常见:安全狗.云锁.云盾.护卫神. SQL注入的绕过: WAF核心机制就是正则匹配. 通过正则匹配,如果符合规则,就拦截. 比如sql注入中and 1=1 ...
- KMP(模板)
kmp算法是解决单模匹配问题的算法,难点在于求next[]数组 求next[]数组:对于模板串的所有前缀子串的最长公共前后缀的长度,就是next[]数组的值 eg:主串为cbbbaababac 子串 ...
- Vue 路由组件
目录 组件数据局部化处理 路由逻辑跳转 组件传参 父传子 子传父 组件的生命周期钩子 路由传参 全家配置自定义 CSS 与 js 总结: 组件数据局部化处理 不管页面组件还是小组件,都可能会被多次复用 ...