【蓝桥杯 第八大奇迹】

题目描述

在一条 R 河流域,繁衍着一个古老的名族 Z。
他们世代沿河而居,也在河边发展出了璀璨的文明。
Z 族在 R 河沿岸修建了很多建筑,最近,他们热衷攀比起来。
他们总是在比谁的建筑建得最奇特。
幸好 Z 族人对奇特的理解都差不多,他们很快给每栋建筑都打了分,这样评选谁最奇特就轻而易举了。
于是,根据分值,大家很快评出了最奇特的建筑,称为大奇迹。
后来他们又陆续评选了第二奇特、第二奇特、……、第七奇特的建筑,依次称为第二大奇迹、第三大奇迹、……、第七大奇迹。
最近,他们开始评选第八奇特的建筑,准备命名为第八大奇迹。
在评选中,他们遇到了一些问题。
首先,Z 族一直在发展,有的建筑被拆除又建了新的建筑,新建筑的奇特值和原建筑不一样,这使得评选不那么容易了。
其次,Z 族的每个人所生活的范围可能不一样,他们见过的建筑并不是所有的建筑,他们坚持他们自己所看到的第八奇特的建筑就是第八大奇迹。
Z 族首领最近很头疼这个问题,他害怕因为意见不一致导致 Z 族发生分歧。
他找到你,他想先了解一下,民众自己认为的奇迹是怎样的。
现在告诉在 R 河周边的建筑的变化情况,以及在变化过程中一些人的生活范围,请编程求出每个人认为的第八大奇迹的奇特值是多少。

解题思路

看到这道题,还是很眼熟的,记得以前应该是做过的,但是时间太久忘了,今天又来复习一下,这道题可以用树套树或者整体二分来做,今天就先写个树状数组讨权值线段树版本的,之后复习了整体二分再来写一篇整体二分的。
首先树状数组可以维护的是前缀和的信息,比如用来求区间和。权值线段树可以用来求关于全局第K大这种问题,当把这两个算法结合在以前的时候就可以求解区间第K大了。
注意树状数组上面的每个点都是一颗权值线段树,这颗线段树维护的是树状数组这个点代表的区间的所有权值。只是以前树状数组关于求1-R的区间信息的时候,答案是保存在i(i=i&-i)这一系列的点上的。现在一个区间的信息是保存在以i(i=i&-1)为根的一系列权值线段树上面的,把这些权值线段树上的所有信息统合在一起就可以知道整个区间的信息了。

比如,X[i]中存放了权值在[l,r]这个区间的所有线段树(1,R)的信息,Y[i]中存放了权值在[l,r]这个区间的所有线段树(1,L-1)的信息

那么如果Σ{sum[rs[X(i)]]}-Σ{sum[rs[Y(i)]]}>=k,那么我们可以直接去右边区间找,否则去左边区间
注:L,R是求解的具体区间,[l,r]是线段树中的权值区间。sum[g]表示以g为根的权值线段树下有多少个值。k是取区间第k大。

上代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 200050
int root[N],ls[N*40],rs[N*40],sum[N*40];
int X[N],Y[N];
int cnt=0,L,n;
void tr_change(int &g,int l,int r,int x,int v){if(!g)g=++cnt;if(l==r){sum[g]+=v;return;}int mid=l+r>>1;if(x<=mid){tr_change(ls[g],l,mid,x,v);sum[g]=sum[ls[g]]+sum[rs[g]];}else{tr_change(rs[g],mid+1,r,x,v);sum[g]=sum[ls[g]]+sum[rs[g]];}
}
int x[N];
void change(int pos,int v,int num){for(int i=pos;i<=L;i+=(i&-i)){tr_change(root[i],1,x[0],v,num);//  printf("%d %d\n",i,v);}
}
int tr_quary(int l,int r,int k){int sm=0;if(l==r){for(int i=1;i<=X[0];i++)sm+=sum[X[i]];for(int i=1;i<=Y[0];i++)sm-=sum[Y[i]];if(k<=sm)return l;else return 0;}int mid=l+r>>1;sm=0;for(int i=1;i<=X[0];i++)sm+=sum[rs[X[i]]];for(int i=1;i<=Y[0];i++)sm-=sum[rs[Y[i]]];if(k<=sm){for(int i=1;i<=X[0];i++)X[i]=rs[X[i]];for(int i=1;i<=Y[0];i++)Y[i]=rs[Y[i]];return tr_quary(mid+1,r,k); }else{for(int i=1;i<=X[0];i++)X[i]=ls[X[i]];for(int i=1;i<=Y[0];i++)Y[i]=ls[Y[i]];return tr_quary(l,mid,k-sm);}
}int quary(int l,int r,int k){X[0]=Y[0]=0;for(int i=r;i;i-=(i&-i))X[++X[0]]=root[i];for(int i=l-1;i;i-=(i&-i))Y[++Y[0]]=root[i];return tr_quary(1,x[0],k);
}int find(int b){int l=1,r=x[0];while(r-l>1){int mid=l+r>>1;if(x[mid]>=b)r=mid;else l=mid;}if(x[l]==b)return l;else return r;
}
struct com{char opt;int a,b;
}C[N];
int s[N];
int main(){memset(s,-1,sizeof(s));scanf("%d%d",&L,&n);
//  for(int i=1;i<=n;i++)change(i,0);for(int i=1;i<=n;i++){char opt;getchar();scanf("%c",&C[i].opt);scanf("%d%d",&C[i].a,&C[i].b);//  printf("#%c %d %d#\n",C[i].opt,C[i].a,C[i].b);if(C[i].opt=='C'){x[++x[0]]=C[i].b;}}sort(x+1,x+x[0]+1);int x0=1;for(int i=2;i<=x[0];i++){if(x[i]!=x[i-1])x[++x0]=x[i];}x[0]=x0;
//  for(int i=1;i<=x[0];i++)printf("%d ",x[i]);printf("\n");for(int i=1;i<=n;i++){if(C[i].opt=='C'){if(s[C[i].a]==-1){int rk=find(C[i].b);change(C[i].a,rk,1);s[C[i].a]=C[i].b;}else{int rk=find(s[C[i].a]);change(C[i].a,rk,-1);//      printf("@@");rk=find(C[i].b);change(C[i].a,rk,1);s[C[i].a]=C[i].b;}}else{int ans=quary(C[i].a,C[i].b,8);if(ans==0)printf("0\n");else printf("%d\n",x[ans]);}/* int ans=quary(1,L,8);if(ans==0)printf("%d:!0\n",i);else printf("%d:!%d\n",i,x[ans]);*/}
}

【蓝桥杯 第八大奇迹】相关推荐

  1. [2019蓝桥杯国赛B组c++][最优包含][排列数][解谜游戏][第八大奇迹]

    个人题解链接,蓝桥杯历届试题,正在更新中~ 文章目录 个人题解链接,蓝桥杯历届试题,正在更新中~ 一个大佬写了填空题的答案,点击下面链接 最优包含 排列数 解谜游戏 第八大奇迹 一个大佬写了填空题的答 ...

  2. 蓝桥 第八大奇迹 (线段树)

    [问题描述] 在一条 R 河流域,繁衍着一个古老的名族 Z.他们世代沿河而居,也在河 边发展出了璀璨的文明. Z 族在 R 河沿岸修建了很多建筑,最近,他们热衷攀比起来.他们总是在 比谁的建筑建得最奇 ...

  3. 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)

    2020年第十一届蓝桥杯国赛 题号 类型 C++ A组 C++ B组 C++ C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 (日期处理) 扩散 (BFS) ...

  4. 2019 蓝桥杯 C/C++实现 B组国赛

    2019 蓝桥杯 C/C++实现 B组国赛 题目列表 A:平方序列 B:质数拆分 C:拼接 D:求值 E:路径计数 F:最优包含 G:排列数 H:解谜游戏 I:第八大奇迹 J:燃烧权杖 A:平方序列 ...

  5. 2019第十届蓝桥杯CB组国赛心得

    一年一度的传说中的"暴力"杯又过去了,今年是第一次参加蓝桥杯省赛跟国赛,今天刚从北京回来,觉得应该写点东西,觉得不能再叫蓝桥杯暴力杯了当然大佬觉得还是暴力还请忽略,要改名了,今年难 ...

  6. 蓝桥杯练习系统习题-历年真题解析2(完整版)

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-历年真题解析2 题目搜索方式:Ctrl+F--> 输入题目名称-&g ...

  7. 2014年 第5届 蓝桥杯 Java B组 省赛解析及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  8. 蓝桥杯试题:矩阵翻硬币

    矩阵翻硬币 这是蓝桥杯的一道练习题,题目如下: 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所 ...

  9. 蓝桥杯2013-2016真题

    javaB组蓝桥杯省赛历年真题(23-16) 文章目录 历年真题 第一次蓝桥杯百校真题大联赛 尺取法 概念 反向扫描 同向扫描 真题 2013年真题 一.世纪末的星期 二.马虎的算式 三.振兴中华 四 ...

最新文章

  1. 哈利波特 pdf_干货!哈利波特英文原版pdf免费领,(含音频)词汇量大于新概念!...
  2. 网页禁止复制的chrome插件办法
  3. 超分辨率算法大战!AI in RTC 创新挑战赛——20万巨奖等你来拿!
  4. 如何让不使用vba没办法打开excel表_Excel常见问题
  5. Android摄影App,这20款摄影APP,让你的照片飞上天!
  6. java bitset javadoc_Java数据结构: java.util.BitSet源码学习
  7. postgres的brin索引
  8. 解决mac 下蓝牙卡顿问题
  9. anbox 使用情况_Anbox 实现分析 2:I/O 模型
  10. matlab 在2k屏幕,如何将4k显示器的分辨率调整为2k,并将2k分辨率用于4k显示器
  11. 稳压二极管(ZenerDiod齐纳二极管)
  12. 无往不利:用SQL解海盗分金的利益最大化问题
  13. 11.4 使用Markdown和Flask-PageDown:没有文本编辑框的问题
  14. 同花顺编程入门(一)
  15. Dos 命令(2021/3/1)
  16. 美通企业日报 | 亚洲使用护肤品男性稳步增长;新地标BFC外滩金融中心将开业...
  17. 【音视频】获取桌面程序窗口列表以及桌面、窗口的缩略图(4-4)
  18. web自动化_selenium IDE安装与运行总结
  19. 织梦cms教程:自定义表单添加提交时间
  20. F1赛道 - Bahrain International Circuit | 巴林国际赛道

热门文章

  1. UE4 第三人称完全流程
  2. 洪志鹏专栏> 我爱比尔盖兹
  3. 雾霾环保主题动态网站设计作业
  4. bzoj3083 遥远的国度 bzoj3626 LCA (树链剖分)
  5. google map v3离线版地图
  6. 爬虫君子协议-robots.txt协议
  7. HBuilder如何在真机运行
  8. 在win10下安装eclipse
  9. Kubernetes四探(官网Tutorials的学习)
  10. 【Springboot系列】Springboot接管所有Controller,magic-api源码阅读