BZOJ3295动态逆序对
一道比较傻的CDQ分治
CDQ: 主要用于解决三位偏序的问题
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
inline long long read()
{
long long x = 0, flag = 1;
char c;
while(! isgraph(c = getchar()))
if(c == '-')
flag *= - 1;
while(isgraph(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
}
void println(long long x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
long long ans[10 + (1 << 4)], top = 0;
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
}
const long long MAXN = (long long)1e5 + (1 << 5);
struct spot
{
long long t, pos, w;
spot(){}
spot(long long t, long long pos, long long w): t(t), pos(pos), w(w){}
}a[MAXN], b[MAXN];
long long pos[MAXN];
long long operator <(spot x, spot y)
{
if(x.t != y.t)
return x.t < y.t;
return x.pos < y.pos;
}
long long n;
long long ans[MAXN];
long long tree[MAXN];
void modify(long long u, long long delta)
{
while(u <= n)
tree[u] += delta, u += (u & (-u));
}
long long query(long long u)
{
long long ret = 0;
while(u)
ret += tree[u], u -= (u & (- u));
return ret;
}
long long cmp(spot x, spot y)
{
return x.pos < y.pos;
}
void CDQ(long long L, long long R)
{
if(L + 1 >= R)
return;
long long top = 0;
long long mid = (L + R) >> 1;
for(long long i = L; i < mid; i ++)
b[top] = a[i], b[top ++].t = - 1;
for(long long i = mid; i < R; i ++)
b[top ++] = a[i];
sort(b, b + top, cmp);
long long cnt = 0;
for(long long i = 0; i < top; i ++)
{
if(b[i].t == - 1)
modify(b[i].w, 1), cnt ++;
else
ans[b[i].t] += query(n) - query(b[i].w);
}
for(long long i = 0; i < top; i ++)
if(b[i].t == - 1)
modify(b[i].w, - 1);
CDQ(L, mid);
CDQ(mid, R);
}
long long cmp2(spot x, spot y)
{
if(x.t != y.t)
return x.t < y.t;
return x.pos > y.pos;
}
long long cmp1(spot x, spot y)
{
return x.pos > y.pos;
}
void CDQ1(long long L, long long R)
{
if(L + 1 >= R)
return;
long long top = 0;
long long mid = (L + R) >> 1;
for(long long i = L; i < mid; i ++)
b[top] = a[i], b[top ++].t = - 1;
for(long long i = mid; i < R; i ++)
b[top ++] = a[i];
sort(b, b + top, cmp1);
long long cnt = 0;
for(long long i = 0; i < top; i ++)
{
if(b[i].t == - 1)
modify(b[i].w, 1), cnt ++;
else
ans[b[i].t] += query(b[i].w);
}
for(long long i = 0; i < top; i ++)
if(b[i].t == - 1)
modify(b[i].w, - 1);
CDQ1(L, mid);
CDQ1(mid, R);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ3295.in", "r", stdin);
freopen("BZOJ3295.out", "w", stdout);
#endif
n = read();
long long m = read();
for(long long i = 0; i < n; i ++)
a[i].pos = i, a[i].w = read(), a[i].t = n - m, pos[a[i].w] = i;
for(long long i = 0; i < m; i ++)
a[pos[read()]].t = n - i;
sort(a, a + n);
memset(ans, 0, sizeof(ans));
memset(tree, 0, sizeof(tree));
CDQ(0, n);
sort(a, a + n, cmp2);
CDQ1(0, n);
for(long long i = n - m + 2; i <= n; i ++)
ans[i] += ans[i - 1];
for(long long i = n; i > n - m; i --)
println(ans[i]);
}
顺便, 承蒙YAY大神的指导, 学会了一个可以用来出数据的函数random_shuffle(int&, int&), 用于随机打乱区间中的元素. 附上对拍代码
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<algorithm>
using namespace std;
inline int read()
{
int x = 0, flag = 1;
char c;
while(! isgraph(c = getchar()))
if(c == '-')
flag *= - 1;
while(isgraph(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
}
void println(int x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
int ans[10 + (1 << 4)], top = 0;
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
}
const int maxn=1e5+10;
int a[maxn];
int main() {
freopen("bzoj3295.in","w",stdout);
srand(time(0));
int n=100000;
printf("%d %d\n",n,n);
for (int i=1;i<=n;++i) a[i]=i;
random_shuffle(a+1,a+n+1);
for (int i=1;i<=n;++i) printf("%d ",a[i]);
puts("");
random_shuffle(a+1,a+n+1);
for (int i=1;i<=n;++i) printf("%d ",a[i]);
puts("");
}
对拍用的BAT
@echo off
:loop
mkd
BZOJ3295
ni
fc BZOJ3295.out ni.out
if not errorlevel 1 goto loop
pause
BZOJ3295动态逆序对的更多相关文章
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- bzoj3295 动态逆序对
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- 【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的一个排列,按照某种顺序依 ...
- 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 ...
- 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]
[题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
随机推荐
- apicloud入门学习笔记1:简单介绍
官网地址:https://www.apicloud.com/ 新手开发指南:https://docs.apicloud.com/APICloud/junior-develop-guide 开发语言:H ...
- 使用fio测试磁盘I/O性能
简介: fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, nu ...
- WPF触控程序开发(三)——类似IPhone相册的反弹效果
用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐.自然.精确,那么WPF能否做到呢,答案是肯定 ...
- html-body相关标签
一 字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub& ...
- 关于dispatch_sync死锁问题
首先,我们来看下下面一个例子: 代码:(串行队列里同步线程嵌套) NSLog(@"haha"); dispatch_queue_t queue = dispatch ...
- Selenium WebDriver- 操作JavaScript的confirm弹窗
#encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...
- wordpress 获取站点的所有链接
<?php include "wp-load.php"; $posts = new WP_Query('post_type=any&posts_per_page=-1 ...
- 如何解决border的重叠问题
我现在在做一个ul列表,然后给每个li加上边框,但是加完了之后,相邻列表的边框就会变成2px,比如第一个li的下边框和第二个li的上边框就会重叠在一起,请问这有什么办法解决一下么? 解决方法是: 试试 ...
- 第二章 jquery的dom操作
三个方面 dom核心,html-dom和css-dom 一. 1.dom core核心 document.getElementsByTagName("form") 获取表单 ...
- POJ 1145 Tree Summing
Tree Summing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7698 Accepted: 1737 Desc ...