P1533 可怜的狗狗
漂亮小姐姐点击就送:https://www.luogu.org/problemnew/show/P1533
题目背景
小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗。
题目描述
小卡家有N只狗,由于品种、年龄不同,每一只狗都有一个不同的漂亮值。漂亮值与漂亮的程度成反比(漂亮值越低越漂亮),吃饭时,狗狗们会按顺序站成一排等着主人给食物。
可是嘉嘉真的很懒,他才不肯喂这么多狗呢,这多浪费时间啊,于是他每次就只给第i只到第j只狗中第k漂亮的狗狗喂食(好狠心的人啊)。而且为了保证某一只狗狗不会被喂太多次,他喂的每个区间(i,j)不互相包含。
输入输出格式
输入格式:
第一行输入两个数n,m,你可以假设n<300001 并且 m<50001;m表示他喂了m次。
第二行n个整数,表示第i只狗的漂亮值为ai。
接下来m行,每行3个整数i,j,k表示这次喂食喂第i到第j只狗中第k漂亮的狗的漂亮值。
输出格式:
M行,每行一个整数,表示每一次喂的那只狗漂亮值为多少。
输入输出样例
7 2 1 5 2 6 3 7 4 1 5 3 2 7 1
3 2
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int N=3e5+5; const int INF=599518803;int n,m; int a[N]; struct Query {int l,r,k,tim,ans; }query[N]; struct Node {Node *son[2];int key;int key_cnt;int size;int heap_key; }node[N],A;typedef Node* Tree; Tree Root,now_node,null;bool cmp1(const Query &a,const Query &b) {return a.l<b.l; }bool cmp2(const Query &a,const Query &b) {return a.tim<b.tim; }void init() {srand(INF);node->son[0]=node->son[1]=node;Root=now_node=null=node; }inline Tree new_node(int key) {++now_node;now_node->key=key;now_node->key_cnt=1;now_node->heap_key=rand();now_node->size=1;now_node->son[0]=now_node->son[1]=null;return now_node; }inline void rotate(Tree &root,bool flag) {Tree tmp=root->son[!flag];root->son[!flag]=tmp->son[flag];tmp->son[flag]=root;root->size=root->son[0]->size+root->son[1]->size+root->key_cnt;tmp->size=tmp->son[0]->size+tmp->son[1]->size+tmp->key_cnt;root=tmp; }void insert(Tree &root,int key) {if(root==null)root=new_node(key);else if(key==root->key)++root->size,++root->key_cnt;else{bool flag=key>root->key;insert(root->son[flag],key);++root->size;if(root->heap_key<root->son[flag]->heap_key)rotate(root,!flag);} }void erase(Tree &root,int key) {if(root==null)return;if(root->key!=key){bool flag=key>root->key;erase(root->son[flag],key);--root->size;}else{if(root->key_cnt>1)--root->key_cnt,--root->size;if(root->son[0]==null)root=root->son[1];else if(root->son[1]==null)root=root->son[0];else{bool flag=root->son[0]->heap_key>root->son[1]->heap_key;rotate(root,flag);erase(root->son[flag],key);--root->size;}} }inline int kth(Tree root,int rank) {while(root!=null){if(rank<=root->son[0]->size)root=root->son[0];else if(rank>root->son[0]->size+root->key_cnt)rank-=root->son[0]->size+root->key_cnt,root=root->son[1];elsereturn root->key;} }int main() {//freopen("testdata.in","r",stdin);//freopen("233.out","w",stdout); init();scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)scanf("%d",a+i);for(int i=1;i<=m;++i){scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].k); // query[i].l=read(), // query[i].r=read(), // query[i].k=read(),query[i].tim=i;}sort(query+1,query+m+1,cmp1);for(int i=1;i<=m;++i){if(i==1)for(int j=query[i].l;j<=query[i].r;++j)insert(Root,a[j]);else{if(query[i-1].r<query[i].l){for(int j=query[i-1].l;j<=query[i-1].r;++j)erase(Root,a[j]);}else{for(int j=query[i-1].l;j<query[i].l;++j)erase(Root,a[j]);}for(int j=query[i-1].r+1;j<=query[i].r;++j)insert(Root,a[j]);}query[i].ans=kth(Root,query[i].k);}sort(query+1,query+m+1,cmp2);for(int i=1;i<=m;++i)printf("%d\n",query[i].ans);return 0; }
旋转 Treap
#include<iostream> #include<cstdio> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;const int N=300005; const int M=5e4+5;int n,m; int a[N]; struct ASK {int l,r,k;int tim,ans; }ask[M]; struct NODE {NODE *fa;NODE *son[2];int key,key_cnt;int size; }node[N];typedef NODE* Tree; Tree Root,now_node,null;inline int read() {char c=getchar();int num=0,f=1;for(;!isdigit(c);c=getchar())f=c=='-'?-1:f;for(;isdigit(c);c=getchar())num=num*10+c-'0';return num*f; }bool cmp1(const ASK &a,const ASK &b) {return a.l<b.l; }bool cmp2(const ASK &a,const ASK &b) {return a.tim<b.tim; }inline void init() {node->fa=node->son[0]=node->son[1]=node;Root=now_node=null=node; }inline Tree new_node(int key,Tree fa) {++now_node;now_node->key=key;now_node->fa=fa;now_node->son[0]=now_node->son[1]=null;return now_node; }inline bool getgx(Tree root) {return root->fa->son[1]==root; }inline void connect(Tree root,Tree fa,bool flag) {if(fa==null)Root=root;elsefa->son[flag]=root;if(root!=null)root->fa=fa; }inline void update(Tree root) {root->size=root->son[0]->size+root->son[1]->size+root->key_cnt; }inline void rotate(Tree root) {Tree fa=root->fa;Tree gfa=fa->fa;bool a=getgx(root),b=!a;connect(root->son[b],fa,a);connect(root,gfa,getgx(fa));connect(fa,root,b);update(fa);update(root); }inline void splay(Tree root,Tree goal) {while(root->fa!=goal){Tree fa=root->fa;if(fa->fa==goal)rotate(root);else{if(getgx(root)==getgx(fa))rotate(fa),rotate(root);elserotate(root),rotate(root);}} }inline void insert(int key) {if(Root==null)Root=new_node(key,null);for(Tree root=Root;root!=null;root=root->son[key>root->key]){if(key==root->key){++root->key_cnt;++root->size;splay(root,null);return;}elseif(root->son[key>root->key]==null)root->son[key>root->key]=new_node(key,root);++root->size;} }inline void erase(int key) {if(Root==null)return;Tree root=Root;for(;root!=null&&root->key!=key;root=root->son[key>root->key]);if(root==null)return;splay(root,null);if(root->son[0]==null){Root=root->son[1];if(Root!=null)Root->fa=null;}elseif(root->son[1]==null){Root=root->son[0];if(Root!=null)Root->fa=null;}else{Tree tmp=root->son[0];for(;tmp->son[1]!=null;tmp=tmp->son[1]);splay(tmp,root);Root=tmp;Root->fa=null;Root->son[1]=root->son[1];if(Root->son[1]!=null)Root->son[1]->fa=Root;update(Root);} }inline int query(int rank) {for(Tree root=Root;root!=null;){if(rank<=root->son[0]->size)root=root->son[0];elseif(rank>root->son[0]->size+root->key_cnt)rank-=root->son[0]->size+root->key_cnt,root=root->son[1];elsereturn root->key;} }int main() { // freopen("testdata.in","r",stdin); init();n=read(),m=read();for(int i=1;i<=n;++i)a[i]=read();for(int i=1;i<=m;++i){ask[i].l=read(),ask[i].r=read(),ask[i].k=read();ask[i].tim=i;}sort(ask+1,ask+m+1,cmp1);int l=ask[1].l,r=l;for(int i=1;i<=m;++i){for(;l<ask[i].l;++l)erase(a[l]);for(;r<=ask[i].r;++r)insert(a[r]);ask[i].ans=query(ask[i].k);}sort(ask+1,ask+m+1,cmp2);for(int i=1;i<=m;++i)printf("%d\n",ask[i].ans);return 0; }
Splay
转载于:https://www.cnblogs.com/lovewhy/p/8670653.html
P1533 可怜的狗狗相关推荐
- Luogu P1533 可怜的狗狗
https://www.luogu.org/problemnew/show/P1533 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂 ...
- P1533 可怜的狗狗 平衡树
题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都有一个不同的漂亮值.漂亮 ...
- 【题解】Luogu P1533 可怜的狗狗
原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...
- Conclusion
/* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...
- 【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用
前言 国际惯例,先来波地址: CUDA WIN7:链接:http://pan.baidu.com/s/1nvyA3Qp 密码:h0f3 官方网址:https://developer.nvidia. ...
- 上古时期(大雾)的数据结构pdf
分块+点分治+Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块,然后要处理的时候整块一起的加上局部的直接暴力. 如果将块的大小分配好一般每次都是O ...
- Google 要在游戏世界里训练 AI 了!
现在,Google将通过强化学习和虚拟世界来"发展"更智能的算法了! 智能设计与进化不仅仅是人们在世界观上的一个分歧.这也是人工智能社区的一个分歧.直到几年前,AI的主要用途还只是 ...
- 好心人救了一只瘦成骷髅的狗,没想到这个善举却让自闭症的儿子不药而愈…
2012年9月15日,美国佐治亚州德卡尔布县的动物营救组织在路边看到一个狗狗"尸体","尸体"仿佛是狗皮包裹着一副狗骨架. 救援人员发现狗狗还有一丝气息,于是马 ...
- 第5堂音频课:发音词串自学方法示范
1. 发音怎么练习 我讲解的第5-6节发音课,就像一个有用教练,教你的划水姿势,你学了以后,在床上趴着练练蹬腿,然后,要立刻跳下水去游泳,也就是说,你要去听英语: 请你听一段可可宝贝APP的绘本故事, ...
最新文章
- 有望替代卷积神经网络?微软最新研究提基于关系网络的视觉建模
- 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任
- c语言中go的作用,go语言与c语言的相互调用
- python的映射_Python学习:映射函数(map)和函数式编程工具(filter和reduce)
- android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)
- VBScript是什么?有什么优缺点?
- StringUtils,FileUtils,PropertiesUtils,DataBaseUtils
- axure 7.0 7.0.0.3142 简体中文版(附汉化包注册)
- Java基础知识——JNI入门介绍
- SSH2-Spring Framework2 struts2 hibernate
- (8)USB协议 —— 高速模式握手过程
- 之前从未接触过编程,想学Python怎么开始?(史上最全学习路线图)
- 云原生CI/CD:tekton/pipeline之认证篇
- 聚合收款码怎么推广?
- 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结
- MATLAB马氏链分析工具
- 红米note3图片剪裁bug
- FPGA到底是什么?
- 将Openwrt路由器配置为无线交换机,实现同网段无线中继功能
- 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition
热门文章
- 【SpringBoot】开启热部署(jsp 页面热部署、devtools 全局热部署)
- 震惊,CSDN居然可以打出爱心?
- 小程序入门学习10--云开发03
- dao-service-servlet-jsp构建简易web通讯录(三层开发)知识点1
- 渗透工具—反制爬虫之Burp Suite RCE
- AD域控Exchange邮箱(二)——卸载ExchangeServer2010报错:“有些控件无效 - 请指定要卸载的现有服务器” 解决方法
- java实现文件上传和文件查看、下载
- debug跳出循环_Java基础-第04章:循环结构「云图智联」
- axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
- 软件工程导论 08章软件维护