【BZOJ3333】排队计划 树状数组+线段树
【BZOJ3333】排队计划
Description
.jpg)
Input

Output

Sample Input
160 163 164 161 167 160
2
3
Sample Output
3
1
HINT
.jpg)
题解:本题的思路比较好,可惜我只想到了一半。
先用树状数组求出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, ...
随机推荐
- account for 与led to和result in的区别
account for sth:be the explanation of sth; explain the cause of sth 作某事物的解释; 解释某事物的原因:His illness ac ...
- cocos2d-x 2.2.0 图片选中聚焦 ,图片描边 CCClippingNode 实现
效果例如以下图 左边箭头是x方向翻转的.右边箭头有旋转和缩放action. 大概实现方法:用箭头作为遮罩层,底图是一个绘制的矩形,得到一个黄色箭头背景.在用schedule尾随要聚焦箭头动作.这个 ...
- log4j输出日志到flume
现需要通过log4j将日志输出到flume,通过flume将日志写到文件或hdfs中 配置flume-config文件 将日志下沉至文件 a1.sources = r1 a1.sinks = k1 a ...
- Manacher回文串算法学习记录
FROM: http://hi.baidu.com/chenwenwen0210/item/482c84396476f0e02f8ec230 #include<stdio.h> #inc ...
- 关于Docker&kubernetes的一些问题
本文是我自己在学习docker以及kubernetes的过程中遇到的一些问题,以及同事在听过培训之后一些问题,事后我自己去网上找些资料以及问一些资深大牛,我在此做一个归纳总结,将这些问题的解答做一个分 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT如何执行系统命令
TwinCAT提供了一系列的执行Windows系统命令的方法 Name 描述 NT_Shutdown 关机操作系统 NT_AbortShutdown 取消关机操作系统命令 NT_Reboot 重启操作 ...
- A Quick Look at P3P
P3P Made Simple By default, IE will reject cookies coming from 3rd-party contexts. A 3rd-party conte ...
- Android学习(二十一)OptionsMenu选项菜单
一.OptionsMenu选项菜单 在应用程序中点击功能按钮会弹出选项菜单,点击可以实现具体功能. 二.实现思路: 1.创建选项菜单: onCreateOptionsMenu(); 2.设置菜单项可用 ...
- Python命令行选项參数解析策略
概述 在Python的项目开发过程中,我们有时须要为程序提供一些能够通过命令行进行调用的接口.只是,并非直接使用 command + 当前文件 就ok的,我们须要对其设置可选的各种各样的操作类型.所以 ...
- Google Chrome 35 Released – Install on RHEL/CentOS 6 and Fedora 20-15
Google Chrome is a freeware web browser developed by Google Inc. Google Chrome team proudly announce ...