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\)序当成一段区间上主席树.但是会发现在询问的时候,可能会非常复杂,因为你需要把路径拆成很多条轻链和重链,它们还不一定连续,很难 ...
随机推荐
- Passive Event Listeners——让页面滑动更加流畅的新特性
Passive Event Listeners - 被动事件监听器 在写webapp页面的时候,Chrome 提醒 code 1 <code>[Violation] Added non-p ...
- gdb调试已在运行中的进程
一.在服务器上调试进程,服务器上并没有源代码,所以需要将源码上传至服务器,才能调试看到源码,以下是步骤: 1.查看服务进程id:pgrep 服务名 [user@user-MP app]$ pgrep ...
- Sql Server 表结构相关
1.库表列信息 --取所有库 SELECT Name FROM Master..SysDatabases ORDER BY Name --查询所有表 select name from 库名..syso ...
- window下eclipse搭建hadoop环境
1 生成插件jar 1.1 安装java,ant运行环境 1.2 下载hadoop-2.5.0.tar.gz并解压到指定目录 1.3 下载hadoop2x-eclipse-plugin-master. ...
- Win7下设置一键关闭所有程序的功能
(文章仅作个人整理和笔记) 在很多情况下,上班族发生这种情况的比较多吧,忙碌的一天下来,准备下班走人的时候,发现自己的电脑打开了好多程序,需要一个一个去关闭,那么有没有什么方法可以实现一键快速关闭所有 ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- 用户界面样式(cursor,resize,vertical-align,outline,文字超出显示省略号)
1. 鼠标样式 cursor default: 小白(箭头)默认 pointer:小手 move:移动 text:文本 not-allowed:禁止 2. 轮廓线(表单外发光)outline 给表单添 ...
- 微信小程序の条件渲染
<view> 今天吃什么 </view> <view wx:if="{{condition==1}}">饺子</view> < ...
- termcap - 终端功能数据库
描述 DESCRIPTION termcap 数据库是一个过时 (obsolete) 工具,用来描述以字符为单位的终端和打印机的功能.它之所以被保留,是为了兼容古老的程序:新程序应当使用 termin ...
- (转)Unity Cinemachine插件,实现单目标和多目标之间切换
Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换*版本要求Unity2017.1及以上. 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件 ...