luogu3759 不勤劳的图书管理员 (树状数组套线段树)
交换的话,只有它们中间的书会对答案产生影响
树状数组记位置,套线段树记书的编号 它对应的页数和书的个数
然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上
别忘了考虑这两个自己交换以后是不是逆序的
最重要的一步:开个O2
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pa;
const int maxn=5e4+,lg2n=2e7+,P=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} namespace SegT{
int ch[lg2n][],pct;
ll sum[lg2n],cnt[lg2n]; inline void update(int x){sum[x]=sum[ch[x][]]+sum[ch[x][]],cnt[x]=cnt[ch[x][]]+cnt[ch[x][]];} inline void add(int &p,int l,int r,int x,int v){
if(!p) p=++pct;
if(l==r) sum[p]+=v,cnt[p]+=(v>?:-);
else{
int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,v);
else add(ch[p][],m+,r,x,v);
update(p);
}
} inline pa query(int p,int l,int r,int x,int y){
if(!p) return make_pair(,);
if(x<=l&&r<=y) return make_pair(sum[p],cnt[p]);
else{
int m=l+r>>;pa r1=make_pair(,),r2=make_pair(,);
if(x<=m) r1=query(ch[p][],l,m,x,y);
if(y>=m+) r2=query(ch[p][],m+,r,x,y);
return make_pair(r1.first+r2.first,r1.second+r2.second);
}
}
} int N,M,rt[maxn];
int pg[maxn],a[maxn]; inline int lowbit(int x){return x&(-x);} inline void add(int x,int y,int v){
for(;x<=N;x+=lowbit(x)) SegT::add(rt[x],,N,y,v);
}
inline pa query(int xl,int xr,int yl,int yr){
pa re=make_pair(,);
for(;xr;xr-=lowbit(xr)){
pa x=SegT::query(rt[xr],,N,yl,yr);
re.first+=x.first,re.second+=x.second;
}
for(xl--;xl;xl-=lowbit(xl)){
pa x=SegT::query(rt[xl],,N,yl,yr);
re.first-=x.first,re.second-=x.second;
}
return re;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=N;i++) a[i]=rd(),pg[i]=rd();
ll ans=;
for(i=;i<=N;i++){
pa re=query(,i-,a[i]+,N);
ans+=re.first+re.second*pg[i],ans%=P;
add(i,a[i],pg[i]);
}
// printf("%d\n",ans);
for(i=;i<=M;i++){
int x=rd(),y=rd();
if(x>y) swap(x,y);
pa re=query(x+,y-,,a[x]-);
ans-=re.first+re.second*pg[x],ans%=P; re=query(x+,y-,a[y]+,N);
ans-=re.first+re.second*pg[y],ans%=P;
if(a[x]>a[y]) ans-=pg[x]+pg[y],ans%=P; re=query(x+,y-,,a[y]-);
ans+=re.first+re.second*pg[y],ans%=P; re=query(x+,y-,a[x]+,N);
ans+=re.first+re.second*pg[x],ans%=P;
if(a[x]<a[y]) ans+=pg[x]+pg[y]; add(x,a[x],-pg[x]);add(x,a[y],pg[y]);
add(y,a[y],-pg[y]);add(y,a[x],pg[x]);
swap(a[x],a[y]);swap(pg[x],pg[y]);
printf("%lld\n",(ans+P)%P); }
return ;
}
luogu3759 不勤劳的图书管理员 (树状数组套线段树)的更多相关文章
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- 【序列操作IV】树状数组套线段树/树套树
题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
随机推荐
- Oracle SQL优化原则
原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...
- mysql5.7以上安装
下载:https://dev.mysql.com/downloads/mysql/ 1.在解压的mysql下(bin目录统计),创建my.ini 文件,内容日下(路径根据自己的目录修改) [mysql ...
- LLVM的安装
1. 官网下载 llvm 2. 官网下载cmake 3. configure 执行 llvm 发现报错 4. 解压缩 cmake 5.将cmake 下面的bin 目录放到环境变量里面去 6. 创建一个 ...
- CPU Cache 机制以及 Cache miss
CPU体系结构之cache小结 1.What is cache? Cache是用来对内存数据的缓存. CPU要访问的数据在Cache中有缓存,称为“命中” (Hit),反之则称为“缺失” (Miss) ...
- Oracle 条件判断函数decode和case when then案例
--decode条件判断函数 ,,,,,) from dual --需求:不通过连表查询,显示业主类型名称列的值 ,,,'商业','其他') from t_owners --case when the ...
- Day 5-7 exec 和元类的创建.
exec方法 元类 exec(str_command,globals,locals)参数1:字符串形式的命令参数2:全局作用域(字典形式). 如果不指定,默认globals参数3:局部作用(字典形式) ...
- ES6/ES2015的一些特性的简单使
1.一些常用的ES6的特性: let, const, class, extends, super, arrow functions, template string, destructuring, d ...
- linux php7 安装redis扩展
1,下载redis扩展地址:https://pecl.php.net/package/redis 选择你需要的版本 上传redis-3.1.3.tar.gz到/usr/local/src目录 cd / ...
- zabbix自定义模板——监控TCP连接状态
TCP十二种连接状态说明 可以使用man netstat查看 LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT -在发送连接请求后等待匹配的连接请求: SYN-RECEIVED ...
- 扩展运算符(spread)是三个点(…)
扩展运算符(spread)是三个点(…),将一个数组||类数组||字符串转为用逗号分隔的序列. js中用来对数组进行操作,把数组里面的东西统统拿出来 一.展开数组 //展开数组 let a = [1, ...