题目描述

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

题解:

这题是我在中考完之后做的……当时在洛谷上只得了20分,其它全TLE,然后我就怀疑是常数太大了,毕竟有好多次树状数组的操作,当时就放弃了。今天又想填填坑,然后上网一搜题解,发现CQzhangyu的方法和我是一样的,只不过它的块的大小是17n−−−√\sqrt{17n},然后我一改,也AC了……分块真是个玄学的东西……吐槽完,简单说一下做法,就是每个块开两个树状数组,一个用来得到逆序对数,一个用来得到权值和,然后用类似BZOJ2141的方法搞搞就行了。

代码:(奇丑,慎抄)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define Work \
if(a[x]<a[i])ans+=(v[x]+v[i]),Mod(ans);\
if(a[x]>a[i])ans-=(v[x]+v[i]),Mod(ans);\
if(a[y]<a[i])ans-=(v[y]+v[i]),Mod(ans);\
if(a[y]>a[i])ans+=(v[y]+v[i]),Mod(ans);
#define LL long long
const int maxn=50010;
const LL mod=1e9+7;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
void Mod(LL &x){x=(x+mod)%mod;}
LL s[230][maxn],s1[230][maxn];
int n,m,a[maxn],belong[maxn],l[maxn],r[maxn];
LL v[maxn],block_v[230];
void add(int x,LL y,int block){for(int i=x;i<=n;i+=(i&-i))s[block][i]=(s[block][i]+y)%mod;}
LL getsum(int x,int block){int r=0;for(int i=x;i;i-=(i&-i))r=(r+s[block][i])%mod;return r;}
void add1(int x,int y,int block){for(int i=x;i<=n;i+=(i&-i))s1[block][i]+=y;}
int getsum1(int x,int block){int r=0;for(int i=x;i;i-=(i&-i))r+=s1[block][i];return r;}
int main()
{n=read();m=read();for(int i=1;i<=n;i++)a[i]=read(),v[i]=(LL)read();int o=(int)sqrt(n*17);for(int i=1;i<=n;i++)belong[i]=(i-1)/o+1,block_v[belong[i]]+=v[i];for(int i=1;i<=n;i++){if(!l[belong[i]])l[belong[i]]=i;r[belong[i]]=i;}LL ans=0,tt=0;for(int i=1;i<=n;i++){add(a[i],v[i],belong[i]);add1(a[i],1,belong[i]);add(a[i],v[i],0);add1(a[i],1,0);tt+=v[i];LL xx=(LL)getsum1(a[i],0),yy=(LL)getsum(a[i],0);ans+=(LL)(i-xx)*v[i]+tt-yy;Mod(ans);}while(m--){int x=read(),y=read();if(x>y)swap(x,y);int bx=belong[x],by=belong[y];if(bx==by)for(int i=x+1;i<y;i++){Work}else{for(int i=x+1;i<=r[bx];i++){Work}for(int i=l[by];i<y;i++){Work}for(int i=bx+1;i<by;i++){ans+=(LL)(block_v[i]-getsum(a[x],i))+v[x]*(LL)(r[i]-l[i]+1-getsum1(a[x],i)),Mod(ans);ans-=(LL)getsum(a[x]-1,i)+v[x]*(LL)getsum1(a[x]-1,i),Mod(ans);ans-=(LL)(block_v[i]-getsum(a[y],i))+v[y]*(LL)(r[i]-l[i]+1-getsum1(a[y],i)),Mod(ans);ans+=(LL)getsum(a[y]-1,i)+v[y]*(LL)getsum1(a[y]-1,i),Mod(ans);}}if(a[x]<a[y])ans+=(v[x]+v[y]),Mod(ans);if(a[y]<a[x])ans-=(v[x]+v[y]),Mod(ans);printf("%lld\n",ans);add(a[x],-v[x],bx);add(a[y],-v[y],by);add(a[y],v[y],bx);add(a[x],v[x],by);add1(a[x],-1,bx);add1(a[y],-1,by);add1(a[y],1,bx);add1(a[x],1,by);block_v[bx]=block_v[bx]-v[x]+v[y];block_v[by]=block_v[by]-v[y]+v[x];swap(a[x],a[y]);swap(v[x],v[y]);}
}

[BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组相关推荐

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

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

  2. 洛谷P3987 我永远喜欢珂朵莉~ 树状数组+vector(暴力)

    题目链接:我永远喜欢珂朵莉- 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到 ...

  3. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...

  4. 洛谷P3987 我永远喜欢珂朵莉~(set 树状数组)

    题意 题目链接 Sol 不会卡常,自愧不如.下面的代码只有66分.我实在懒得手写平衡树了.. 思路比较直观:拿个set维护每个数出现的位置,再写个线段树维护区间和 #include<bits/s ...

  5. 【洛谷5069】纵使日薄西山【set】【树状数组】

    传送门 最nb的就是这种算法简单思维困难的题. 题目说,选最大,将左中右三个一起减少. 使用瞪眼法你要发现一个性质: 修改一个数,那左中右的相对大小不变.所以它左右的数不会被修改,永远不会.因为其它数 ...

  6. 洛谷 P3353 在你窗外闪耀的星星(树状数组)

    利用数组在 x 处做个映射,为 x 点处的亮度之和,这样利用树状数组在区间查询的时候要注意一下端点的情况 从位置 1 开始,一直到 1e5,寻找最大的区间和,复杂度为 O(1e5logn),不开 o2 ...

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

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

  8. [bzoj4889] [Tjoi2017]不勤劳的图书管理员

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

  9. 洛谷P3758 [TJOI2017]可乐

    原题链接:洛谷P3758 [TJOI2017]可乐  题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: ...

最新文章

  1. 使用NVelocity自动生成Favorite收藏夹的导航页面
  2. 深入理解并行编程-分割和同步设计(一)
  3. Delphi从Internet下载文件
  4. ZedGraph曲线图实现X轴与Y轴可拖动,并且对应曲线也一起移动
  5. Flink三种运行模式安装部署
  6. Solr 6.7学习笔记(04)-- Suggest
  7. 【设计模式】装饰器模式的使用
  8. [Cake] 2. dotnet 全局工具 cake
  9. PHP正则提取table中数据
  10. PostgreSQL的几种分布式架构对比
  11. 【废了-准备删除02】信息收集——基于WAMP的drupal7.x管理系统
  12. python程序自动运行_定时后台运行Python程序
  13. Parallels Desktop 安装 Win7注意事项
  14. CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m
  15. python学习小报4--python的数据类型
  16. 晋商消费金融总裁惠康获准,前不久被央行处罚49万元
  17. 服务器查看系统盘位置,服务器上查看硬盘位置
  18. 深度剖析TCP三次握手,面试官拍案叫绝
  19. [转载]20世纪十大算法
  20. MacOS Ventura 13.2.1 (22D68) 正式版带 OC 0.8.9 and winPE 双分区原版黑苹果镜像

热门文章

  1. graphics.h头文件_C语言图形(graphics.h头文件功能和示例)
  2. linux tcp repair及tcp热迁移
  3. Try HP DL388 Gen9 and Dell PowerEdge R320 (by joshua)
  4. OLED使用 SSD1306 IIC
  5. 机器学习吴恩达第二周
  6. Docker+Frp+NGinx+云服务器 实现HTTPS内网穿透
  7. CentOS7安装nginx 代理vsftp服务器
  8. SpringCloud的@Value注解及GitLab配置使用
  9. RaspberryPi+OneNET MQTT方式 数据上传和命令下发
  10. CSS,给你点“颜色“看看