https://www.lydsy.com/JudgeOnline/problem.php?id=4889

https://www.luogu.org/problemnew/show/P3759

加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员。他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度。现在有n本被打乱顺序的书,在接下来m天中每天都会因为读者的阅览导致书籍顺序改变位置。因为小豆被要求在接下来的m天中至少要整理一次图书。小豆想知道,如果他前i天不去整理,第i天他的厌烦度是多少,这样他好选择厌烦度最小的那天去整理。

最开始以为看的题解很naive,后来发现是自己太naive了。

看起来就像是查逆序对,对于l和r的交换,其贡献的变更只与[l+1,r-1]这些区间有关,可以变成查询这段区间内有多少数满足与l和r构成逆序对。

这个明显可以主席树做。

然而之后你需要交换这两个数……emmm待修改主席树呗。

其实就是树状数组套一个动态开点线段树(因为本质都差不多就都叫成主席树好了。)

剩下的就是码码码了。

(注意取模对常数的影响。)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e4+;
const int p=1e9+;
inline int read(){
int X=,w=;char ch=;
while(ch<''||ch>''){w|=ch=='-';ch=getchar();}
while(ch>=''&&ch<='')X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct tree{
int l,r;
ll v,c;
}tr[N*];
int rt[N],pool,n,m;
ll ans,a[N],v[N],b[N],cnt[N];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){
for(int i=x;i<=n;i+=lowbit(i))b[i]+=y,cnt[i]++;
}
inline ll qry_val(int x){
ll res=;
for(int i=x;i;i-=lowbit(i))res+=b[i];
return res;
}
inline ll qry_cnt(int x){
ll res=;
for(int i=x;i;i-=lowbit(i))res+=cnt[i];
return res;
}
inline void insert(int &x,int l,int r,int pos,int v,int w){
if(!x)x=++pool;
tr[x].v+=v;tr[x].c+=w;
if(l==r)return;
int mid=(l+r)>>;
if(pos<=mid)insert(tr[x].l,l,mid,pos,v,w);
else insert(tr[x].r,mid+,r,pos,v,w);
}
inline void ins(int i,int x,int y,int w){
for(;i<=n;i+=lowbit(i))insert(rt[i],,n,x,y,w);
}
inline ll sqv(int x,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return tr[x].v;
int mid=(l+r)>>;
return sqv(tr[x].l,l,mid,l1,r1)+sqv(tr[x].r,mid+,r,l1,r1);
}
inline ll sqc(int x,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return tr[x].c;
int mid=(l+r)>>;
return sqc(tr[x].l,l,mid,l1,r1)+sqc(tr[x].r,mid+,r,l1,r1);
}
inline ll query_val(int l,int r,int l1,int r1){
if(l>r||l1>r1)return ;
l--;ll res=;
for(int i=r;i;i-=lowbit(i))res=(res+sqv(rt[i],,n,l1,r1))%p;
for(int i=l;i;i-=lowbit(i))res=(res-sqv(rt[i],,n,l1,r1))%p;
return (res+p)%p;
}
inline ll query_cnt(int l,int r,int l1,int r1){
if(l>r||l1>r1)return ;
l--;ll res=;
for(int i=r;i;i-=lowbit(i))res=(res+sqc(rt[i],,n,l1,r1))%p;
for(int i=l;i;i-=lowbit(i))res=(res-sqc(rt[i],,n,l1,r1))%p;
return (res+p)%p;
}
inline void check(ll &x){
while(x>=p)x-=p;
while(x<)x+=p;
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++){
a[i]=read(),v[i]=read();
ins(i,a[i],v[i],);
}
for(int i=n;i>=;i--){
add(a[i],v[i]);
ans=(ans+qry_val(a[i]-)+qry_cnt(a[i]-)*v[i])%p;
}
for(int i=;i<=m;i++){
int l=read(),r=read();
if(l==r){printf("%lld\n",ans);continue;}
if(l>r)swap(l,r);
ans=ans+query_val(l+,r-,,a[r]-);check(ans);
ans=ans+query_cnt(l+,r-,,a[r]-)*v[r];check(ans);
ans=ans-query_val(l+,r-,a[r]+,n);check(ans);
ans=ans-query_cnt(l+,r-,a[r]+,n)*v[r];check(ans);
ans=ans+query_val(l+,r-,a[l]+,n);check(ans);
ans=ans+query_cnt(l+,r-,a[l]+,n)*v[l];check(ans);
ans=ans-query_val(l+,r-,,a[l]-);check(ans);
ans=ans-query_cnt(l+,r-,,a[l]-)*v[l];check(ans);
if(a[l]>a[r])ans-=v[l]+v[r];
else ans+=v[l]+v[r];
check(ans);
ins(l,a[l],-v[l],-);ins(r,a[r],-v[r],-);
swap(a[l],a[r]);swap(v[l],v[r]);
ins(l,a[l],v[l],);ins(r,a[r],v[r],);
printf("%lld\n",ans);
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解的更多相关文章

  1. 洛谷P3759 - [TJOI2017]不勤劳的图书管理员

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  2. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  3. Luogu 3759 [TJOI2017]不勤劳的图书管理员

    再也不作死写FhqTreap作内层树了,卡的不如暴力呜呜呜…… 题意翻译:给一个序列,每个下标包含两个属性$a$和$v$,求第一个属性与下标形成的所有逆序对的第二个属性和,给出$m$个交换两个下标的操 ...

  4. 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT

    [bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...

  5. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  6. 【loj2639】[Tjoi2017]不勤劳的图书管理员

    #2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...

  7. 【洛谷3759】[TJOI2017] 不勤劳的图书管理员(树套树)

    点此看题面 大致题意: 给定一个序列,每个元素有两个属性\(a_i\)和\(v_i\),每次操作改变两个元素的位置,求每次操作后\(\sum{v_i+v_j}[i<j,a_i>a_j]\) ...

  8. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  9. 4889: [Tjoi2017]不勤劳的图书管理员 树套树

    国际惯例的题面(Bzoj没有,洛谷找的):动态加权逆序对,一眼树套树.256MB内存,5e4范围,不虚不虚.首先把交换改成两个插入和两个删除.考虑插入和删除的贡献,就是统计前面比这个值大的数的数值和, ...

随机推荐

  1. 180611-Spring之RedisTemplate配置与使用

        logo 文章链接:https://liuyueyi.github.io/hexblog/2018/06/11/180611-Spring之RedisTemplate配置与使用/ Spring ...

  2. Appium最新的服务器初始化参数(Capability)【截止11月29日,后续最新的可以看github】

    键 描述 值 automationName 自动化测试的引擎 Appium (默认)或者 Selendroid platformName 使用的手机操作系统 iOS, Android, 或者 Fire ...

  3. ant-design学习准备_1

    在学习ant-desin过程中,发现很多知识都不清楚,从现在开始,每天将自己学习到的知识进行一个总结记录,前端大佬勿扰勿喷.先介绍几个基础概念和一些常用命令: 1.什么是脚手架 我们经常在各个博客论坛 ...

  4. 第三模块:面向对象&网络编程基础 第4章 FTP项目作业讲解

    01-FTP项目需求 02-FTP项目框架搭建 03-FTP项目用户认证 04--FTP项目制定标准定长消息头 05-FTP项目下载功能开发 06-FTP项目下载功能开发2 07-FTP项目ls文件列 ...

  5. 韦大仙--python对文件操作

    文件操作: 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was alwa ...

  6. TPO-12 C1 Revise a Hemingway paper

    TPO-12 C1 Revise a Hemingway paper 第 1 段 1.Listen to a conversation between a student and a professo ...

  7. Vue 兄弟组件通信(不使用Vuex)

    Vue 兄弟组件通信(不使用Vuex) 项目中,我们经常会遇到兄弟组件通信的情况.在大型项目中我们可以通过引入vuex轻松管理各组件之间通信问题,但在一些小型的项目中,我们就没有必要去引入vuex.下 ...

  8. 【转】: 《江湖X》开发笔谈 - 热更新框架

    前言 大家好,我们这期继续借着我们工作室正在运营的在线游戏<江湖X>来谈一下热更新机制以及我们的理解和解决方案.这里先简单的介绍一下热更新的概念,熟悉这部分的朋友可以跳过,直接看我们的方案 ...

  9. 日历(Calendar)模块

    #usr/bin/python3 #! -*-conding : utf-8 -*- #2018.3.14 """ 日历(Calendar)模块 此模块的函数都是日历相关 ...

  10. Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList

    本博文归纳在 Vue 学习过程中, Vue-cli 工具的使用说明.除此之外还通过 Vue-cli 工具将之前 Vuejs 基本语法当中实现的 todoList 进行重构. 安装 npm instal ...