题目描述:
有一条河,沿河的一侧生活着一个部落。这个一字型的部落有n个据点,从左至右依次编号1~n。
部落的人们有时会在某个据点建立建筑,每个建筑都有各自的价值。一开始,每个据点的都没有建筑,价值都是0。如果在已有建筑的据点建立新的建筑,那么新的建筑会代替旧的建筑(旧的建筑就此消失)。
有两种操作C和Q:
1、C x y,表示在据点x建立一个价值为y的建筑。
2、Q x y,询问在据点x~y之间(包括x,y)的建筑中,价值第八大的建筑的价值是多少。

输入描述:
第一行,两个正整数n和k,表示据点的数量和操作的数量。
接下的k行,每行一个操作。

输出描述:
对于所有的Q操作,输出相应的第八大建筑的价值。

输入样例:
10 14
C 1 5
C 2 4
C 3 7
C 4 6
C 5 5
C 6 1
C 7 8
Q 1 10
C 8 3
C 9 6
C 10 3
Q 1 9
C 6 10
Q 1 10

输出样例:
0
3
4
思路:唉,当时要是能想到这一点,也不会只拿个国二了。
很明显,区间操作,线段树是很容易想到的。但是这次线段树的每一个节点不是维护一个数了,而是8个数。因为8很小,所以还是可以承担的。每次pushup的时候,将最大的八个数更新给父节点。查询的时候返回一个数组就可以了。代码没有测试,不知道有没有问题,当个参考吧。
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;const int maxx=1e5+100;
struct node{int l;int r;int a[9];int len;
}p[maxx<<2];
int n,m,x,y;inline void pushup(int cur)
{int *c1=new int[9];int *c2=new int[9];int len1=p[cur<<1].len;int len2=p[cur<<1|1].len;sort(p[cur<<1].a,p[cur<<1].a+len1);sort(p[cur<<1|1].a,p[cur<<1|1].a+len2);c1=p[cur<<1].a;c2=p[cur<<1|1].a;int len=0;len1--,len2--;while(len<8&&(len1>=0&&len2>=0)){if(c1[len1]>c2[len2]) p[cur].a[len++]=c1[len1],len1--;else p[cur].a[len++]=c2[len2],len2--;}if(len1==-1) while(len<8&&len2>=0) p[cur].a[len++]=c2[len2--];else while(len<8&&len1>=0) p[cur].a[len++]=c1[len1--];while(len<8) p[cur].a[len++]=0;p[cur].len=len;
}
inline void build(int l,int r,int cur)
{p[cur].l=l;p[cur].r=r;p[cur].len=0;memset(p[cur].a,0,sizeof(p[cur].a));if(l==r) return ;int mid=l+r>>1;build(l,mid,cur<<1);build(mid+1,r,cur<<1|1);
}
inline void update(int pos,int v,int cur)
{int L=p[cur].l;int R=p[cur].r;if(L==R) {p[cur].a[0]=v;p[cur].len=1;return ;}int mid=L+R>>1;if(pos<=mid) update(pos,v,cur<<1);else update(pos,v,cur<<1|1);pushup(cur);
}
inline int *query(int l,int r,int cur)
{int L=p[cur].l;int R=p[cur].r;if(l<=L&&R<=r) return p[cur].a;int mid=L+R>>1;if(r<=mid) return query(l,r,cur<<1);else if(l>mid) return query(l,r,cur<<1|1);else{int *c1=new int[9];c1=query(l,mid,cur<<1);int *c2=new int[9];c2=query(mid+1,r,cur<<1|1);sort(c1,c1+8);sort(c2,c2+8);int *c=new int[9];int len=0,len1=7,len2=7;while(len<8&&(len1>=0&&len2>=0)){if(c1[len1]>c2[len2]) c[len++]=c1[len1],len1--;else c[len++]=c2[len2],len2--;}if(len1==-1) while(len<8&&len2>=0) c[len++]=c2[len2--];else while(len<8&&len1>=0) c[len++]=c1[len1--];return c;}
}
int main()
{scanf("%d%d",&n,&m);build(1,n,1);char s[2];while(m--){scanf("%s%d%d",s,&x,&y);if(s[0]=='C') update(x,y,1);else {int *c=new int[9];c=query(x,y,1);sort(c,c+8);printf("%d\n",c[0]);}}return 0;
}

努力加油a啊,(o)/~

2019蓝桥杯国赛B组第九题相关推荐

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

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

  2. 【2019蓝桥杯国赛B组】排列数

    这道题的思路就是从 i i i个数的情况推到 i + 1 i+1 i+1个数的情况,首先设 d p [ i ] [ j ] dp[i][j] dp[i][j]: i i i个数, j j j个折点的方 ...

  3. 2019蓝桥杯省赛B组填空题 迷宫

    题目描述 下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为左上角,出口为右下角,在迷宫中,只能 ...

  4. 2019 蓝桥杯省赛 B 组模拟赛(一)蒜厂年会

    2019 蓝桥杯省赛 B 组模拟赛(一)蒜厂年会 这题有两种情况 1.最大的和是在0~n-1 2.最大的和越过了首尾 这时候只要用n个数的和 - 0~n-1 的连续的最小和 这是求连续子集最大.最小 ...

  5. 2019 蓝桥杯省赛 B 组模拟赛(一)——计蒜客(未完待续)

    比赛链接: 2019 蓝桥杯省赛 B 组模拟赛(一) 友情提示: 蓝桥杯的头文件,如果不是都记得,可以直接万能头文件 #include <bits/stdc++.h>, 不过有的时候,这样 ...

  6. java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...

    原文作者:疼疼蛇 原文标题:[蓝桥杯省赛JavaB组真题详解]四平方和(2016) 发布时间:2021-02-26 15:00:01 题目描述 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数 ...

  7. 蓝桥杯 第十三届蓝桥杯省赛C++组真题 修剪灌木 Python

    题目 爱丽丝要完成一项修剪灌木的工作. 有 NN 棵灌木整齐的从左到右排成一排. 爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 00 厘米. 爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪 ...

  8. 2018年第九届蓝桥杯国赛B组C++真题汇总

    1. 换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. 小明有点强迫症,他坚持要求200元换 ...

  9. 2019蓝桥杯国赛总结

    5月24号我们激动地乘着火车向北京出发了,时隔七个多小时,大概下午两点我们抵达北京西站,然后去石景山西黄村附近找个宾馆住下来,夏天的炎热在那天似乎在欢呼着我们的到来,那天下午显的格外热,我们同行十几人 ...

最新文章

  1. PE 文件格式 .text .data .idata .rsrc
  2. 批处理详细教程(三)
  3. 各种主流数据库的比较
  4. VTK:可视化之ShadowsLightsDemo
  5. SAP Netweaver ECATT介绍
  6. 5门可能衰落的编程语言
  7. asp.net 操作ftp 通用代码[测试通过]
  8. H5页面适配iOS、Android和微信
  9. RAID阵列及常用RAID
  10. Unity3d + UGUI 的多分辨率适配
  11. Kubernetes Secret
  12. html5全屏(Fullscreen)
  13. 独家专访VB100:趋势科技退出缘于新病毒检测失败
  14. C语言调用函数流程图怎么画,【C语言】求教这个流程图怎么画啊
  15. MATLAB平台文字识别算法实现
  16. Python模拟鼠标点击与实时获取鼠标位置
  17. 【ERP知识】一个VMI(供应商管理库存)实现方案
  18. ps 给小姐姐更换背景
  19. 利用递归查询部门表,以树(tree)的结构展示返回给前端出来,一般都要有这种需求的
  20. Android 应用程序开发

热门文章

  1. IOS笔记CALayer的position和anchorPoint
  2. 我人傻了,火狐坏了,重启系统删了重下都搞不好那种,点开只有弹窗(已解决)
  3. 鸿蒙系统适配机型_华为鸿蒙 OS 适配机型曝光,除了 Mate 40 还有这几款!
  4. python怎么画出圆润的曲线_利用python画出AUC曲线的实例
  5. c++ 嵌套类 内部类
  6. was java sdk_关于WAS9单独安装SDK的问题?
  7. java判断读到末尾_Flink实战:自定义KafkaDeserializationSchema(Java/Scala)
  8. SpringBoot+SpringCache+Redis补充
  9. centos 安装JAVA 三种方法
  10. Silverlight 5 beta新特性探索系列:9.视频快进快退和TextSearch对象对文字项查询