正题

Portal

这题挺巧妙的。

我一开始想的就是考虑一个点对不包含比它大一的点的区间的贡献,在考虑一个点 对包含比它大一的点的区间的贡献,这两个东西可以用一个树状数组套主席树来维护,但是死活卡在2700ms过不了,无奈之下翻看题解。


题解的做法在这里就不再赘述了:

先考虑区间[l, r]的贡献。将区间排序后共有r-l+1段,如果i和i+1同时这个区间中,那么就可以合并两段为一段。一个所以一个区间的贡献可以转化为:区间的长度-区间中相邻数值的对数。

再考虑区间[L, R]的meaty值。按照上面的思路,可以转变为:子区间的长度和-每对相邻数值在子区间中的出现次数和。

子区间的长度和为 s(R−L+1) ,s(n)=∑nl=1l⋅(n−l+1)=(n+1)∑nl=1l−∑ni=1l2 。

每对在[L, R]内的相邻数值会产生贡献:设数值i和i+1的位置为 li,ri(L≤li<ri≤R) ,那么在所有子区间中的出现次数为 (R−ri+1)⋅(li−L+1) 。每对相邻数值在子区间中的出现次数和为 ∑i(R−ri+1)⋅(li−L+1)=−(R+1)⋅(L−1)⋅∑i1+(R+1)⋅∑ili+(L−1)⋅∑iri−∑ili⋅ri ,对于四个需要求和的值分别维护就好了。

这时候注意到还有[li, ri]在[L, R]内的要求,可以用主席树把L,R当成两个维度,或者直接离线处理。

复杂度 O(nlogn)


也不就比我少个log

#include<bits/stdc++.h>
using namespace std;const int N=100010;template<class IT>inline void cmin(IT &a,IT b){if(b<a)a=b;}
template<class IT>inline void cmax(IT &a,IT b){if(a<b)a=b;}
struct BIT{long long tre[N];inline void add(int x,long long y){for(;x<N;x+=x&-x)tre[x]+=y;}inline long long que(int x){static long long y;y=0ll;for(;x!=0;x-=x&-x)y+=tre[x];return y;}
}t1,t2,t3,t4;
struct node{int x,y,t;inline node(){}inline node(int x,int y,int t):x(x),y(y),t(t){}inline bool operator<(const node &a)const{return x>a.x||(x==a.x&&(y<a.y||(y==a.y&&t<a.t)));}
}nod[N<<1];
long long ans[N];
int a[N];
int tot,n,m;void solve(){int l,r;sort(nod+1,nod+tot+1);for(int i=1;i<=tot;++i){l=nod[i].x;r=nod[i].y;if(nod[i].t==0){t1.add(r,1ll);t2.add(r,l+1);t3.add(r,r-1);t4.add(r,1ll*(l+1)*(r-1));}else{ans[nod[i].t]+=(t1.que(r)*l)*r-t2.que(r)*r-t3.que(r)*l+t4.que(r);}}
}int main(){int x,y,t;scanf("%d %d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&t);a[t]=i;}for(int i=1;i<n;++i){x=a[i];y=a[i+1];if(x>y){t=x;x=y;y=t;}nod[++tot]=node(x,y,0);}for(int i=1;i<=m;++i){scanf("%d %d",&x,&y);t=y-x;ans[i]=1ll*(t+1)*(t+2)*(t+3)/6ll;nod[++tot]=node(x,y,i);}solve();for(int i=1;i<=m;++i)printf("%lld\n",ans[i]);return 0;
}

Meatycake,51nod2117,树状数组相关推荐

  1. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  2. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  3. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  4. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  5. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  6. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  7. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  8. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  9. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  10. 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

最新文章

  1. 面向对象的设计模式及魔术函数
  2. 用Python做科学计算
  3. 读书笔记 |《推荐系统实践》- 个性化推荐系统总结
  4. java多个mapreduce_一个简单的MapReduce示例(多个MapReduce任务处理)
  5. 云笔记/笔记软件工具
  6. 343. 整数拆分 golang 动态规划
  7. 华为麦芒9正式亮相:6400万三摄,2199元起
  8. windows nginx 停止和启动_nginx在window与linux中启动、停止、与关闭
  9. Swift3.0朝圣之路-Then协议库-绝妙的初始化方式
  10. React中最基础的jsx语法
  11. paip.本机CVS环境搭建
  12. 利用Tushare下载多个股票数据并进行数据处理以及数据合并
  13. 怎么把音频转换文字?三个步骤解决它
  14. 【COCA】美国当代语料库常用高频词汇20200个(可直接复制)
  15. C语言实现哈夫曼压缩与解压缩的实现以及读取哈夫曼编码 万文长书,绝对详细哦
  16. 固态U盘能装linux么,用u盘在固态硬盘上安装linux 多重开启系统
  17. 机器学习7—聚类算法之K-means算法
  18. linux hba查看,各操作系统查看HBA和WWN的方法
  19. 系统的认识大数据人工智能数据分析中的数据
  20. Android Gradle 技巧之二: 最爱命令行

热门文章

  1. 一个页面播放多个视频
  2. ZT:神秘的通道——三焦经
  3. Andriod 第三方 ROM
  4. Banner图片轮播器实现ViewPager图片切换效果及下方小圆点
  5. 如何使单片机复位可靠,单片机复位电路?
  6. oracle form视频,深入浅出Oracle 之Form开发
  7. flutter02 - 基础部件
  8. word2003流程图变成图片_怎样将word文档的部分内容(流程图)制作成图片 详细始末...
  9. ikuai路由管理系统教程
  10. ubuntu中修改只读文件