Couleur(启发式 + 主席树)(终于补坑了)
ZOJ Problem Set - 4053
Time Limit: 6 Seconds Memory Limit: 131072 KB
DreamGrid has an array of integers. On this array he can perform the following operation: choose an element that was not previously chosen and mark it as unavailable. DreamGrid would like to perform exactly operations until all the elements are marked.
DreamGrid defines the cost of a subarray as the number of inversions in the subarray. Before performing an operation, DreamGrid would like to know the maximum cost of a subarray that doesn't contain any unavailable elements.
Recall that a subarray is a contiguous subpart of the original array where . An inversion in a subarray is a pair of indices such that the inequality holds.
Input
There are multiple test cases. The first line of input contains an integer , indicating the number of test cases. For each test case:
The first line contains a single integer -- the length of the array.
The second line contains the values of the array .
The third line contains a permutation , representing the indices of the elements chosen for the operations in order.
Note that the permutation is encrypted and you can get the real permutation using the following method: Let be the answer before the -th operation. The actual index of the -th operation is where is bitwise exclusive or operator.
It is guaranteed that the sum of all does not exceed .
Output
For each test case, output integers in a single line seperated by one space, where is the answer before the -th operation.
Please, DO NOT output extra spaces at the end of each line, or your answer may be considered incorrect!
Sample Input
354 3 1 1 15 4 5 3 1109 7 1 4 7 8 5 7 4 821 8 15 5 9 2 4 5 10 6154 8 8 1 12 1 10 14 7 14 2 9 13 10 337 19 23 15 7 2 10 15 2 13 4 5 8 7 10
Sample Output
7 0 0 0 020 11 7 2 0 0 0 0 0 042 31 21 14 14 4 1 1 1 0 0 0 0 0 0
Hint
The decoded permutation of each test case is , and
Author: LIN, Xi
Source: The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online
题目大意 给一个序列 然后按照一定顺序 删掉一些数字 使得序列不连续 要让我们去找出 逆序数最大的连续序列 输出这个连续序列的逆序对数
QAQ 一直都不对 这个题目要用muliset 维护啊 qaq qaq qaq qaq qaq
有关这个逆序数的关系传递 值得思考
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
const int maxn = 1e5+;
#define ll long long
struct tree{int l,r,sum;}T[maxn*];
int a[maxn],p[maxn],root[maxn],N;ll z[maxn],big[maxn],cnt;
void update(int &x,int y,int l,int r,int pos)
{
T[++cnt]=T[y],x=cnt,T[x].sum++;
if(l==r)return;
int m=(l+r)>>;
if(pos<=m)update(T[x].l,T[y].l,l,m,pos);
else update(T[x].r,T[y].r,m+,r,pos);
}
ll findbig(int x,int y,int l,int r,int pos)
{
if(l==r)return ;
int m=(l+r)>>;
if(pos<=m)return findbig(T[x].l,T[y].l,l,m,pos)+T[T[y].r].sum-T[T[x].r].sum;
return findbig(T[x].r,T[y].r,m+,r,pos);
}
ll findsmall(int x,int y,int l,int r,int pos)
{
if(l==r)return ;
int m=(l+r)>>;
if(pos<=m)return findsmall(T[x].l,T[y].l,l,m,pos);
return findsmall(T[x].r,T[y].r,m+,r,pos)+T[T[y].l].sum-T[T[x].l].sum;
}
set<int>se;
multiset<ll>Maxinv;
set<int>::iterator it;
ll delet(int x)
{ se.insert(x);it=se.find(x);
int l=*(--it) +;++it;int r=*(++it) -;
if(big[r])Maxinv.erase(Maxinv.find(big[r]));
ll invl=,invr=,t=;
if(x-l<r-x)
{
for(int i=l;i<x;i++)
{
invl+=findbig(root[l-],root[i],,N,a[i]);
t+=findsmall(root[i],root[r],,N,a[i]);
}
invr=big[r]-t-findsmall(root[x],root[r],,N,a[x]);
}else{
for(int i=x+;i<=r;i++)
{
invr+=findsmall(root[i],root[r],,N,a[i]);
t+=findbig(root[l-],root[i],,N,a[i]);
}
invl=big[r]-t-findbig(root[l-],root[x],,N,a[x]);
}
big[x-]=invl;big[r]=invr;
if(invl)Maxinv.insert(invl);if(invr)Maxinv.insert(invr);
multiset<ll>::iterator its=Maxinv.end();
return *(--its);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
se.clear();cnt=;Maxinv.clear();Maxinv.insert();
scanf("%d",&N);se.insert(),se.insert(N+);
for(int i=;i<=N;i++)scanf("%d",a+i);
for(int i=;i<=N;i++)scanf("%d",p+i);
for(int i=;i<=N;i++)update(root[i],root[i-],,N,a[i]);
for(int i=;i<=N;i++)big[i]=big[i-]+findbig(root[],root[i],,N,a[i]);
z[]=big[N];Maxinv.insert(z[]);
for(int i=;i<N;i++)z[i+]=delet(z[i]^p[i]);
for(int i=;i<N;i++)printf("%lld ",z[i]);
printf("%lld\n",z[N]);
}
return ;
}
Couleur(启发式 + 主席树)(终于补坑了)的更多相关文章
- 【ZOJ4053】Couleur(主席树,set,启发式)
题意: 有n个位置,每个位置上的数字是a[i],现在有强制在线的若干个单点删除操作,每次删除的位置都不同,要求每次删除之后求出最大的连续区间逆序对个数 n<=1e5,1<=a[i]< ...
- 集训队8月1日(拓扑排序+DFS+主席树入门)
上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- bzoj3123 [Sdoi2013]森林 树上主席树+启发式合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3123 题解 如果是静态的查询操作,那么就是直接树上主席树的板子. 但是我们现在有了一个连接两棵 ...
- 【BZOJ3123】森林(主席树,启发式合并)
题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵 ...
- bzoj 3123 [Sdoi2013]森林(主席树,lca,启发式合并)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]
3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...
- [SDOI2013]森林 主席树+启发式合并
这题的想法真的很妙啊. 看到题的第一眼,我先想到树链剖分,并把\(DFS\)序当成一段区间上主席树.但是会发现在询问的时候,可能会非常复杂,因为你需要把路径拆成很多条轻链和重链,它们还不一定连续,很难 ...
随机推荐
- Apache 2.4.12 64位+Tomcat-8.0.32-windows-x64负载集群方案
上次搞了Apache 2.2的集群方案,但是现在自己的机器和客户的服务器一般都是64位的,而且tomcat已经到8了.重新做Apache 2.4.12 64位+Tomcat-8.0.32-window ...
- 数据持久化之轻量级Kv持久化(二)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍轻量级Kv持久化: [SharedPre ...
- github中fork分支和pullrequest的最佳实践
github中fork分支和pullrequest的最佳实践 */--> code {color: #FF0000} pre.src {background-color: #002b36; co ...
- 三、hibernate中持久化类的使用
hibernate的持久化类 持久化:将内存中的一个对象持久化到数据库中的过程,hibernate就是一个用来进行持久化的框架 持久化类:一个Java对象与数据库中表建立了关系映射,那么这个类在hib ...
- SqlServer 将表里面的值赋给变量
@@c_beiz varchar(500) select top 1 @c_beiz = c_beiz from g_billd_qh_tmp where u_id=''+@uid+'' and io ...
- Linux curl 命令模拟 POST/GET 请求
Linux curl 命令模拟 POST/GET 请求 本文链接:https://blog.csdn.net/sunboy_2050/article/details/82156402 curl 命 ...
- git的使用(扫盲)
之前一直是通过图形化工具使用git,前两天练习用命令上传代码,遇到不少问题,最终还是解决了,在这里总结一下. 通过一个例子来演示一下.首先去github上面创建一个仓库. 创建好之后,就可以上传文件了 ...
- leetcode-160场周赛-5238-找出给定方程的正整数解
题目描述: class Solution: def findSolution(self, customfunction: 'CustomFunction', z: int) -> List[Li ...
- jupyter|浏览器启动问题|“ImportError: DLL load failed: 找不到指定的模块”sqlite3
问题: 1.安装好Anconda3后,开始——>打开jupyter notebook时 默认浏览器无法启动 2.开始打开——>anaconda prompt 输入jupyter noteb ...
- 理解CommonJS ,AMD ,CMD, 模块规范
参考 : https://blog.csdn.net/xcymorningsun/article/details/52709608 1.CommonJS 模块规范 (同步加载模块): var math ...