ZOJ Problem Set - 4053

Couleur

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

题目大意 给一个序列 然后按照一定顺序 删掉一些数字  使得序列不连续 要让我们去找出  逆序数最大的连续序列 输出这个连续序列的逆序对数
本蒟蒻在做这个题目的时候 用的set维护的最大的逆序数
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(启发式 + 主席树)(终于补坑了)的更多相关文章

  1. 【ZOJ4053】Couleur(主席树,set,启发式)

    题意: 有n个位置,每个位置上的数字是a[i],现在有强制在线的若干个单点删除操作,每次删除的位置都不同,要求每次删除之后求出最大的连续区间逆序对个数 n<=1e5,1<=a[i]< ...

  2. 集训队8月1日(拓扑排序+DFS+主席树入门)

    上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...

  3. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  4. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

  5. bzoj3123 [Sdoi2013]森林 树上主席树+启发式合并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3123 题解 如果是静态的查询操作,那么就是直接树上主席树的板子. 但是我们现在有了一个连接两棵 ...

  6. 【BZOJ3123】森林(主席树,启发式合并)

    题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵 ...

  7. bzoj 3123 [Sdoi2013]森林(主席树,lca,启发式合并)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  8. BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]

    3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...

  9. [SDOI2013]森林 主席树+启发式合并

    这题的想法真的很妙啊. 看到题的第一眼,我先想到树链剖分,并把\(DFS\)序当成一段区间上主席树.但是会发现在询问的时候,可能会非常复杂,因为你需要把路径拆成很多条轻链和重链,它们还不一定连续,很难 ...

随机推荐

  1. 基于MFC的Media Player播放器制作的SetTimer函数介绍

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. SetTimer是一种API函数,位于user32.dll中.你想每隔一段时间执行一件事的的时候,你可以使用它. 使用定时器的方法比 较简 ...

  2. jmeter beanshell postprocessor 使用

    String newtoken=bsh.args[0];print(newtoken);${__setProperty(newtoken,${token},)}; String newcompanyI ...

  3. bootstrapTble 的一些小结

    前言: 1.bootstrapTable 官网  http://bootstrap-table.wenzhixin.net.cn/zh-cn/ ,http://bootstrap-table.wenz ...

  4. 深海Django少年

    orm查询,如果遇到我之前的环境报错 就可去manage.py中拷贝前四行代码到tests文件中,然后增加两行代码: import django django.setup() 或者任意新建一个py文件 ...

  5. 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。

    方式一:内联式css 内联式css , 优点:修改其他方便.缺点:造成页面臃肿,不利于后期维护. 方式二:外链css 外链css ,优点:对其他文件无影响,但会造成多个文件css  (缺点) @imp ...

  6. 多线程实现奇偶统计v1 - 暴力版

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include "pthread.h& ...

  7. 2018-10-19-C#-GUID-ToString-

    title author date CreateTime categories C# GUID ToString lindexi 2018-10-19 9:4:44 +0800 2018-4-1 10 ...

  8. nginx proxy_pass设置

    NGINX服务器的反向代理PROXY_PASS配置方法讲解 https://www.cnblogs.com/lianxuan1768/p/8383804.html Nginx配置proxy_pass转 ...

  9. soapui基础知识

    一.基础知识 1.测试步骤(teststep)为最小单位,一个完整的测试用例由多个测试步骤组成: 2.一个测试用例(testcase)代表一个完整的操作 3.测试集(testsuite)主要是为了区分 ...

  10. codeforces 1198E Rectangle Painting 2 最小点覆盖

    题目传送门 题意: 有一个$n∗n$的网格,网格中有一些矩形是黑的,其他点都是白的. 你每次可以花费$ min (h,w)$的代价把一个$h*w$的矩形区域变白.求把所有黑格变白的最小代价. 思路: ...