【CF1181D】Irrigation
题目大意:给定 M 个城市,每年会选出一个城市举办比赛,现给出前 N 年城市举办比赛的情况。在接下来的年份中,每年会在举办比赛次数最小的城市举办比赛,如果有很多城市举办次数均为最小值,则在编号最小的城市举办比赛。现给出 Q 个询问,每次询问第 K 年在哪个城市举办比赛。
题解:
首先,记录下每个城市前 N 年举办比赛的次数,并按照举办比赛的次数为第一关键字,城市编号为第二关键字进行从小到大排序。
发现排序后城市举办比赛的情况如下图所示

那么若当前矩形高度小于下一个小矩形高度时,一定是当前矩形高度增加,且对于大矩形内的小矩形高度呈现周期性增加。
因此,可以采用将询问离线,并将问题划分为前 i 个高度均为 h[i] 的矩形到前 i+1 个高度均为 h[i+1] 的矩形的时间。对于每个划分出来的子问题,i 个小矩形高度呈现周期性变化,可以利用取模操作得到第几个矩形高度增加。需要注意的是,这里面的第 i 个矩形为相对下标,还需要转化成具体是第几个城市,这里可以采用权值线段树上二分的操作,求出第 k 个数对应的下标即可。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
typedef long long LL;
int n,m,Q,sz[maxn<<2],ans[maxn];
struct city{int cnt,id;}c[maxn];
struct qry{int id;LL year;}q[maxn];
void insert(int o,int l,int r,int pos){
if(l==r){++sz[o];return;}
int mid=l+r>>1;
if(pos<=mid)insert(o<<1,l,mid,pos);
else insert(o<<1|1,mid+1,r,pos);
sz[o]=sz[o<<1]+sz[o<<1|1];
}
int kth(int o,int l,int r,int k){
if(l==r)return l;
int mid=l+r>>1;
if(k<=sz[o<<1])return kth(o<<1,l,mid,k);
else return kth(o<<1|1,mid+1,r,k-sz[o<<1]);
}
void read_and_parse(){
scanf("%d%d%d",&n,&m,&Q);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
++c[x].cnt;
}
for(int i=1;i<=m;i++)c[i].id=i;
for(int i=1;i<=Q;i++){
LL year;scanf("%lld",&year);
q[i].id=i,q[i].year=year;
}
sort(c+1,c+m+1,[](const city &a,const city &b){
return a.cnt==b.cnt?a.id<b.id:a.cnt<b.cnt;
});
sort(q+1,q+Q+1,[](const qry &a,const qry &b){
return a.year<b.year;
});
}
void solve(){
LL now=n;
for(int i=1,j=1;i<=m;i++){
LL nxt=i==m?2e18:(LL)(c[i+1].cnt-c[i].cnt)*i+now;
insert(1,1,m,c[i].id);
while(j<=Q&&q[j].year<=nxt){
LL year=q[j].year;
int idx=(year-now)%i;
if(idx==0)idx=i;
ans[q[j].id]=kth(1,1,m,idx);
++j;
}
now=nxt;
}
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
}
int main(){
read_and_parse();
solve();
return 0;
}
【CF1181D】Irrigation的更多相关文章
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
随机推荐
- Spring MVC 源码 分析
spring web 源码 @HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInit ...
- MSF魔鬼训练营-3.5.3 MSF中常用的关于数据库的命令
渗透测试数据库用来保存渗透测试过程中获取的各种数据,很多时候你重启了kali发现连接不上数据库了,其实就是因为这个服务没开 MSF所使用的数据库时postgresql root@kali:/# ser ...
- spring请求多方式
<!-- 使表单可以使用GET,.POST. HEAD.OPTIONS.PUT.DELETE.TRACE方式提交--> <filter> <filter-name> ...
- shell脚本获取的参数
$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表
- redis 学习(8)-- redis 客户端 -- Jedis
redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...
- oracle查看执行计划以及使用场景
文档结构: oracle执行计划使用场景 环境: Centos 6.10 Oracle 18.3.0.0.0 c 11g默认启动了自动统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天 ...
- 客户端相关知识学习(三)之Android原生与H5交互的实现
Android原生与H5交互的实现 H5调用原生的方式 方式可能有多种,根据开发经验,接触过两种方式. 方法一:Android向H5注入全局js对象,也就是H5调Android 1.首先对WebVie ...
- python time,calendar,datetime
time sleep:休眠指定的秒数(可以是小数) localtime:将一个时间戳转换为time.struct_time类型的对象(类似于元组) # 将一个时间戳转换为一个类似于元组的对象,不指定时 ...
- Nginx(web服务器)与Tomcat(应用服务器)搭建集群
Nginx作为互联网最常用的web服务器,高性能的HTTP和反向代理使它经常作为Tomcat集群的方案.Nginx官方只支持使用HTTP协议的集成,但是如果你想使用AJP协议集成,可以使用阿里开源的n ...
- ssh无密码访问设置(ssh-keygen 的详解)
[原文链接]http://blog.csdn.net/wh_19910525/article/details/7433164 为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签 ...