BZOJ5177 : [Jsoi2013]贪心的导游
首先预处理出对于每个模数,所有被模数按结果从大到小排序的结果,那么对于一个询问,如果可以在$O(1)$时间内判断某个数字是否出现,则可以$O(1000)$回答。
考虑对序列进行分治,对于区间$[l,r]$,取$mid=\lfloor\frac{l+r}{2}\rfloor$。
处理出$mid$到$[l,r]$内每个位置里每个数字的出现次数,回答所有经过$mid$的询问,然后递归分治$[l,mid)$和$(mid,r]$。
时间复杂度$O((n+m)\log n+1000m)$。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1000010,M=50010,K=1010,BUF=9000000;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
int n,m,i,j,x,y,a[N],gl[N],gr[N],v[M<<1],nxt[M<<1],ed,b[K],q[K][K];bool c[K];
struct E{int x,y,p,l,r;}e[M];
inline bool cmp(int x,int y){return b[x]>b[y];}
inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;}
inline void check(int x,int l,int r,int&y){
if(~y||e[x].x>l||e[x].y<r)return;
for(int i=0,p=e[x].p;;i++)if(c[q[p][i]]){y=q[p][i]%p;return;}
}
void solve(int l,int r){
if(l>r)return;
int mid=(l+r)>>1,i,j;
for(i=mid;i>=l;i--)for(c[a[i]]=1,j=gl[i];j;j=nxt[j])check(v[j],i,mid,e[v[j]].l);
for(i=mid;i>=l;i--)c[a[i]]=0;
for(i=mid;i<=r;i++)for(c[a[i]]=1,j=gr[i];j;j=nxt[j])check(v[j],mid,i,e[v[j]].r);
for(i=mid;i<=r;i++)c[a[i]]=0;
solve(l,mid-1),solve(mid+1,r);
}
int main(){
fread(Buf,1,BUF,stdin);read(n),read(m);
for(i=1;i<=n;i++)read(a[i]);
for(i=1;i<=m;i++){
read(x),read(y);
if(x>y)swap(x,y);
add(gl[e[i].x=x+1],i),add(gr[e[i].y=y+1],i);
read(e[i].p),e[i].l=e[i].r=-1;
}
for(i=2;i<=1000;i++){
for(j=0;j<=1000;j++)b[j]=j%i,q[i][j]=j;
sort(q[i],q[i]+1001,cmp);
}
solve(1,n);
for(i=1;i<=m;i++)printf("%d\n",max(e[i].l,e[i].r));
return 0;
}
BZOJ5177 : [Jsoi2013]贪心的导游的更多相关文章
- [Bzoj5177][Jsoi2013]贪心的导游(主席树)
5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 32 Solved: 15[Submit][Status] ...
- 【bzoj5177】[Jsoi2013]贪心的导游(分块)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5177 在网上看到的题解基本都是用主席树,也就是带点骚操作的暴力直接艹过去的.这里分享一 ...
- 「JSOI2013」贪心的导游
「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...
- bzoj 4464: [Jsoi2013]旅行时的困惑【贪心】
据说正解是有上下界最小流,但是这种1e5的玩意问什么要跑网络流啊-- 贪心即可,注意一点是可以有多条路径经过一条边-- 以1为根,设d[u][0/1]为u到父亲的边是向下/向上,g记录这个点儿子中不能 ...
- 【NOI2006】聪明的导游
[NOI2006]聪明的导游 题面 洛谷 题目描述 小佳最近迷上了导游这个工作,一天到晚想着带游客参观各处的景点.正好 M 市在举行 NOI,来参观的人特别的多.不少朋友给小佳介绍了需要导游的人. M ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
随机推荐
- ubuntu下配置反向代理
1. 环境 ubuntu:Ubuntu 13.04 x86-64 apache2: 2.2.22-6ubuntu5.1 amd64 2. 配置 2.1 配置应用 增加监听端口 打开/etc/apac ...
- 如何获取jar包的在执行机上面的路径
背景: 最近在项目中遇到一个小问题, 几行代码就能解决了 String path = this.getClass().getProtectionDomain().getCodeSource().get ...
- HBase describe table 参数说明
创建user表 > create 'dimensoft:user', 'info' 查看表结构 > describe 'dimensoft:user' DESCRIPTION 'dimen ...
- 华硕X75VB安装ubuntu12.10网卡不可用等相关问题总结
笔记本相关信息: 电脑型号:华硕X75VB 笔记本电脑 处理器:i5-3230M 2.60GHz 双核 主板:华硕X75VB (英特尔 Ivy Bridge - HM76 Express芯片组) 内存 ...
- 改变input type="file" 文字、样式等
<div class="tac"> <input type="file" id="browsefile" class=&q ...
- 装饰器实现session登陆 验证功能
装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...
- 用Photoshop扭曲滤镜工具打造旋转的光束效果
原文:https://www.w3cschool.cn/photoshopgjjc/dthfn1.html 教程与已往的不同,作者加上了一些新的步骤如锐化等,出来的效果也有所改进.大致过程:先用滤镜制 ...
- Hadoop集群最迅速的配置免密码登陆方法
1:多台机器互相免密登陆的思路(默认你的linux操作系统已经安装好ssh): 第一步:在各自的机器上面生成密钥: 在第1台机器上生产一对钥匙: ssh-keygen -t rsa 在第2台机器上生产 ...
- 简单有效:解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
https://blog.csdn.net/Sukie_csdn/article/details/78752969
- LeetCode高频148错题记录
3. Max Points on a Line 共线点个数3种解法 思路一:思考如何确定一条直线,两点法,确定斜率后带入一点.有三种情况,1. 两点重合,2. 斜率不存在,3. 正常算,依次以每个点为 ...