hdu 4638 Group 多校第四场
来源:互联网 发布:济南网络优化 编辑:程序博客网 时间:2024/05/22 14:05
题意为询问一段区间里的数能组成多少段连续的数。先考虑从左往右一个数一个数添加,考虑当前添加了i - 1个数的答案是x,那么添加完i个数后的答案是多少?可以看出,是根据a[i]-1和a[i]+1是否已经添加而定的,如果a[i]-1或者a[i]+1已经添加一个,则段数不变,如果都没添加则段数加1,如果都添加了则段数减1。设v[i]为加入第i个数后的改变量,那么加到第x数时的段数就是sum{v[i]} (1<=i<=x}。仔细想想,若删除某个数,那么这个数两端的数的改变量也会跟着改变,这样一段区间的数构成的段数就还是他们的v值的和。将询问离线处理,按左端点排序后扫描一遍,左边删除,右边插入,查询就是求区间和。
树状数组+离线查询
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 100010;int c[maxn],pos[maxn],a[maxn],ans[maxn];int n,m;void updata(int p,int v){ for(int i=p;i<=n;i+=i&(-i)) c[i]+=v;}int sum(int p){ int res=0; for(int i=p;i>0;i-=i&(-i)) res+=c[i]; return res;}struct Q{ int l,r,id; bool operator < (const Q a)const { return r<a.r; }}q[maxn];int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),pos[a[i]]=i; for(int i=0;i<m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i; sort(q,q+m); memset(c,0,sizeof(c)); for(int i=1,k=0;i<=n;i++) { updata(i,1); if(a[i]>1&&pos[a[i]-1]<i) updata(pos[a[i]-1],-1); if(a[i]<n&&pos[a[i]+1]<i) updata(pos[a[i]+1],-1); while(q[k].r==i&&k<m) { ans[q[k].id]=sum(q[k].r)-sum(q[k].l-1); k++; } } for(int i=0;i<m;i++) printf("%d\n",ans[i]); }}
- hdu 4638 Group 多校第四场
- 2013 多校第四场 hdu 4638 Group
- HDU 4638 Group 多校第四场(线段树+离线询问)
- HDUOJ 4638 2013多校第四场第7题 Group
- 多校第四场 Hdu 4638 树状数组
- hdu 4638 多校第四场 树状数组+离线处理
- hdu 4639 Hehe 多校第四场
- HDU 5774 多校联赛第四场
- [hdu6070] 2017hdu多校第四场
- hdu6071 2017hdu多校第四场
- HDU 4638 2013多校联合第4场 G-Group
- 多校第四场
- 多校第四场
- HDU/HDOJ 3875 Euclidean Algorithm 多校联合第四场
- HDU 4635 多校第四场 1004 强联通
- hdu 4632 Palindrome subsequence 多校第四场
- hdu 4642 Fliping game 多校第四场
- 2013 多校第四场 hdu 4635 Strongly connected
- java.util.ConcurrentModificationException
- 在eclipse中生成android项目工程生成apk包
- WebDriver拾级而上·之十三 调用Java Script
- WebDriver拾级而上·之十四 RemoteWebDriver
- Linux内核开发入门
- hdu 4638 Group 多校第四场
- WebDriver拾级而上·之十五 拖曳动作模拟
- HDU 1862 EXCEL排序
- zoj3261(并查集+set)
- WebDriver拾级而上·之十六 Table控件的处理
- 在Eclipse中config-brower的应用
- 11995 - I Can Guess the Data
- JAVA学习笔记(二)
- STM32F107启动文件分析(startup_stm32f10x_hd.s)