漂亮小姐姐点击就送: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行,每行一个整数,表示每一次喂的那只狗漂亮值为多少。

输入输出样例

输入样例#1: 复制

7 2
1 5 2 6 3 7 4
1 5 3
2 7 1

输出样例#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 可怜的狗狗相关推荐

  1. Luogu P1533 可怜的狗狗

    https://www.luogu.org/problemnew/show/P1533 题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂 ...

  2. P1533 可怜的狗狗 平衡树

    题目背景 小卡由于公务需要出差,将新家中的狗狗们托付给朋友嘉嘉,但是嘉嘉是一个很懒的人,他才没那么多时间帮小卡喂狗狗. 题目描述 小卡家有N只狗,由于品种.年龄不同,每一只狗都有一个不同的漂亮值.漂亮 ...

  3. 【题解】Luogu P1533 可怜的狗狗

    原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...

  4. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  5. 【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用

    前言 国际惯例,先来波地址: CUDA WIN7:链接:http://pan.baidu.com/s/1nvyA3Qp 密码:h0f3   官方网址:https://developer.nvidia. ...

  6. 上古时期(大雾)的数据结构pdf

    分块+点分治+Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块,然后要处理的时候整块一起的加上局部的直接暴力. 如果将块的大小分配好一般每次都是O ...

  7. Google 要在游戏世界里训练 AI 了!

    现在,Google将通过强化学习和虚拟世界来"发展"更智能的算法了! 智能设计与进化不仅仅是人们在世界观上的一个分歧.这也是人工智能社区的一个分歧.直到几年前,AI的主要用途还只是 ...

  8. 好心人救了一只瘦成骷髅的狗,没想到这个善举却让自闭症的儿子不药而愈…

    2012年9月15日,美国佐治亚州德卡尔布县的动物营救组织在路边看到一个狗狗"尸体","尸体"仿佛是狗皮包裹着一副狗骨架. 救援人员发现狗狗还有一丝气息,于是马 ...

  9. 第5堂音频课:发音词串自学方法示范

    1. 发音怎么练习 我讲解的第5-6节发音课,就像一个有用教练,教你的划水姿势,你学了以后,在床上趴着练练蹬腿,然后,要立刻跳下水去游泳,也就是说,你要去听英语: 请你听一段可可宝贝APP的绘本故事, ...

最新文章

  1. 有望替代卷积神经网络?微软最新研究提基于关系网络的视觉建模
  2. 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任
  3. c语言中go的作用,go语言与c语言的相互调用
  4. python的映射_Python学习:映射函数(map)和函数式编程工具(filter和reduce)
  5. android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)
  6. VBScript是什么?有什么优缺点?
  7. StringUtils,FileUtils,PropertiesUtils,DataBaseUtils
  8. axure 7.0 7.0.0.3142 简体中文版(附汉化包注册)
  9. Java基础知识——JNI入门介绍
  10. SSH2-Spring Framework2 struts2 hibernate
  11. (8)USB协议 —— 高速模式握手过程
  12. 之前从未接触过编程,想学Python怎么开始?(史上最全学习路线图)
  13. 云原生CI/CD:tekton/pipeline之认证篇
  14. 聚合收款码怎么推广?
  15. 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结
  16. MATLAB马氏链分析工具
  17. 红米note3图片剪裁bug
  18. FPGA到底是什么?
  19. 将Openwrt路由器配置为无线交换机,实现同网段无线中继功能
  20. 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition

热门文章

  1. 【SpringBoot】开启热部署(jsp 页面热部署、devtools 全局热部署)
  2. 震惊,CSDN居然可以打出爱心?
  3. 小程序入门学习10--云开发03
  4. dao-service-servlet-jsp构建简易web通讯录(三层开发)知识点1
  5. 渗透工具—反制爬虫之Burp Suite RCE
  6. AD域控Exchange邮箱(二)——卸载ExchangeServer2010报错:“有些控件无效 - 请指定要卸载的现有服务器” 解决方法
  7. java实现文件上传和文件查看、下载
  8. debug跳出循环_Java基础-第04章:循环结构「云图智联」
  9. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  10. 软件工程导论 08章软件维护