【BZOJ3333】排队计划 树状数组+线段树
【BZOJ3333】排队计划
Description
Input
Output
Sample Input
160 163 164 161 167 160
2
3
Sample Output
3
1
HINT
题解:本题的思路比较好,可惜我只想到了一半。
先用树状数组求出f[i],代表i和后面的人能构成多少逆序对。然后我们发现,每次放哨时,只有出列的那些同学的f值会发生变化(变成0),而其他人的f值不发生改变,所以我们将这些出列的同学找出来暴力清零即可。
但是放哨后高度的排列顺序会变啊,这样会不会对其他询问有影响呢?显然不会啊!f值都清零了还会有什么影响?所以我们可以用线段树维护区间最大值,这样就能找到每个人后面所有比它小的了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long ll;
const int maxn=500010;
struct node
{
int val,org;
}p[maxn];
int n,m,nm;
ll ans;
int f[maxn],s[maxn],v[maxn],ps[maxn<<2];
bool cmp(const node &a,const node &b)
{
return a.val<b.val;
}
inline void updata(int x)
{
for(int i=x;i<=nm;i+=i&-i) s[i]++;
}
inline int query(int x)
{
int i,ret=0;
for(i=x;i;i-=i&-i) ret+=s[i];
return ret;
}
inline int MX(int a,int b)
{
return v[a]<v[b]?a:b;
}
void build(int l,int r,int x)
{
if(l==r)
{
ps[x]=l;
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson),build(mid+1,r,rson);
ps[x]=MX(ps[lson],ps[rson]);
}
int query(int l,int r,int x,int a,int b)
{
if(a<=l&&r<=b) return ps[x];
int mid=(l+r)>>1;
if(b<=mid) return query(l,mid,lson,a,b);
if(a>mid) return query(mid+1,r,rson,a,b);
return MX(query(l,mid,lson,a,b),query(mid+1,r,rson,a,b));
}
void updata(int l,int r,int x,int a)
{
if(l==r) return ;
int mid=(l+r)>>1;
if(a<=mid) updata(l,mid,lson,a);
else updata(mid+1,r,rson,a);
ps[x]=MX(ps[lson],ps[rson]);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a,b,c;
for(i=1;i<=n;i++) p[i].val=rd(),p[i].org=i;
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++)
{
if(p[i].val>p[i-1].val) nm++;
v[p[i].org]=nm;
}
for(i=n;i;i--) f[i]=query(v[i]-1),ans+=f[i],updata(v[i]);
build(1,n,1);
printf("%lld\n",ans);
for(i=1;i<=m;i++)
{
a=rd(),c=v[a];
if(c!=1<<30)
{
while(1)
{
b=query(1,n,1,a,n);
if(v[b]>c) break;
ans-=f[b],v[b]=1<<30,updata(1,n,1,b);
}
}
printf("%lld\n",ans);
}
return 0;
}//6 2 160 163 164 161 167 160 2 3
【BZOJ3333】排队计划 树状数组+线段树的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
- 2019.01.22 bzoj3333: 排队计划(逆序对+线段树)
传送门 题意简述:给出一个序列,支持把ppp~nnn中所有小于等于apa_pap的'扯出来排序之后再放回去,要求动态维护全局逆序对. 思路:我们令fif_ifi表示第iii个位置之后比它大的数的个 ...
- 数据结构--树状数组&&线段树--基本操作
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
- BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...
随机推荐
- Java算法题:兔子问题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 解题思路: public int exp(int ...
- androidmanifest
在unity里面这个androidmanifest.xml 就相当于 buildsetting 里面的playersettings
- http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
- Spring随笔之ApplicationContext
前言 以前自己学习和实习的时候多次用过spring框架.对于我这种菜鸟来说,Spring给我的第一印象是好学,太TM好学了(抱歉没忍住脏话),跟着开发组熟悉几天就可以开始写代码,自我感觉代码敲得飞起~ ...
- 2017.6.30 安装IDEA的插件mybatis plugin(破解版)
参考来自:http://blog.csdn.net/u011410529/article/details/54098067 正常情况下的安装: 但是我的界面中找不到这个插件,而且这个插件是收费的. 1 ...
- 国内外DNS服务器地址列表大全
DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址. 通常来说,香港.韩国.日本等国的DNS服务器速度会比较快,大家可以多用几 ...
- 【Datasatge】使用Datastage装载数据时候,报错:Missing record delimiter “”,saw EOF instead
如题,报错截图如下: 根据以上警告信息我们可以清晰看出,是字段DEFAULT_FLAG出错了!于是我们找到对应的字段,结果一看,导出文件中DS表结构中该字段为DECIMAL(18,2),但是导出文件中 ...
- 【Datastage】Datastage在win10上安装报错:This Application requires one of the following versions of the .NET Framework:v1.1.4322 Do you want to install this .NET Framework version now?
Datastage在win10上安装报错如下: 这个错误的意思是:.netFramWork的版本不符合要求,于是,我在网上下载了一个版本一致的 下载地址为:http://pan.baidu.com/s ...
- 监听EditText字数
editContent.addTextChangedListener(new TextWatcher() { private CharSequence temp;private int editSta ...
- hdu 5371 Hotaru's problem【manacher】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=5371 题意: 给出一个长度为n的串,要求找出一条最长连续子串.这个子串要满足:1:能够平均分成三段 ...