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 ...
随机推荐
- 4.ORM框架的查询
创建表对应关系代码如下: from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy app=Fl ...
- LIBRA查询
SELECT COUNT(1)FROM rawdata_vehiclepassing xWHERE x.passingtime >= to_date('2019-11-24,00:00:00', ...
- 了解 C++
C++的历史 C++由C语言发展演变而来,最初被称为"带类的C" 1983年正式取名为C++ 1998年11月被国籍标准化组织(ISO)批准为国际标准 2003年10月15日发布了 ...
- 什么是 SDK?
通俗而言: 1.其实很简单,SDK 就是 Software Development Kit 的缩写,中问意思是: 软件开发工具包. 2.这是一个覆盖面相当广泛的名词,可以这么说: 辅助开发某一类软件的 ...
- ZOJ4103 Traveler(2019浙江省赛)
构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:列排序
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- shell脚本中执行shell脚本(2)
(a.sh)读取用户输入参数,并在脚本(b.sh)中使用 1.a.sh #!/bin/sh read -p "please input name value: " name ./b ...
- frp 配置
前言 对于没有公网 IP 的内网用户来说,远程管理或在外网访问内网机器上的服务是一个问题. 今天给大家介绍一款好用内网穿透工具 FRP,FRP 全名:Fast Reverse Proxy.FRP 是一 ...
- Atcoder Grand Contest 037B(DP,组合数学,思维)
#include<bits/stdc++.h>using namespace std;const long long mod = 998244353;string s;int a[3000 ...
- 【PAT甲级】1017 Queueing at Bank (25 分)
题意: 输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行 ...