题目背景

亲爱的哥哥:

你在那个城市里面过得好吗?

我在家里面最近很开心呢。昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了。我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢。不过奶奶说他是很难受的时候才做出这样的事的……

最近村子里长出了一大片一大片的蒲公英。一刮风,这些蒲公英就能飘到好远的地方了呢。我觉得要是它们能飘到那个城市里面,让哥哥看看就好了呢!

哥哥你要快点回来哦!

爱你的妹妹 Violet

Azure 读完这封信之后微笑了一下。

“蒲公英吗……”

题目描述

在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。

为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 (a_1,a_2..a_n)(a1​,a2​..an​) ,其中 a_iai​ 为一个正整数,表示第i棵蒲公英的种类编号。

而每次询问一个区间 [l,r],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。

注意,你的算法必须是在线的

输入输出格式

输入格式:

第一行两个整数 n,m ,表示有n株蒲公英,m 次询问。

接下来一行n个空格分隔的整数 a_iai​ ,表示蒲公英的种类

再接下来m 行每行两个整数 l_0,r_0l0​,r0​ ,我们令上次询问的结果为 x(如果这是第一次询问, 则 x=0)。

令 l=(l_0+x-1)\bmod n + 1,r=(r_0+x-1) \bmod n + 1l=(l0​+x−1)modn+1,r=(r0​+x−1)modn+1 ,如果 l>r,则交换 l,r 。

最终的询问区间为[l,r]。

输出格式:

输出m 行。每行一个整数,表示每次询问的结果。

输入输出样例

输入样例#1: 复制

6 3
1 2 3 2 1 2
1 5
3 6
1 5

输出样例#1: 复制

1
2
1

说明

对于 20% 的数据,保证 1\le n,m \le 30001≤n,m≤3000 。

对于 100% 的数据,保证 1\le n \le 40000,1\le m \le 50000,1\le a_i \le 10^91≤n≤40000,1≤m≤50000,1≤ai​≤109 。

题解:

考虑分块,每次询问的答案为询问区间内所有完整的块的众数或者散块中出现过的数

对于每一个数,先离散化,开个vector存下每个数在序列中出现的位置,然后预处理出f[i][j],表示第i个块到第j个块的众数,对于每次询问,考察散块中的每个数及相应的f[i][j],即在vector中二分查找对应的数在询问区间内最近和最远的出现位置,其在vetcor中的位置相减加1即为其在询问区间中的出现次数

另外这题不吸氧气过不去......

#include<bits/stdc++.h>
using namespace std;
int n,m,sz,tot;
int arr[40005],tp[40005],f[205][205],idx[40005],cnt[40005],val[40005];
vector<int>pos[40005];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int disc(int a)
{return lower_bound(tp+1,tp+1+n,a)-tp;
}
inline void pre_work(int k)
{int mx=0,num;memset(cnt,0,sizeof(cnt));for(register int i=(k-1)*sz+1;i<=n;i++){cnt[arr[i]]++;if(mx<=cnt[arr[i]]){if(mx==cnt[arr[i]]){if(num>arr[i])num=arr[i];}else{mx=cnt[arr[i]];num=arr[i];}   }f[k][idx[i]]=num;   }
}
inline int find(int l,int r,int p)
{return upper_bound(pos[p].begin(),pos[p].end(),r)-lower_bound(pos[p].begin(),pos[p].end(),l);
}
inline int query(int l,int r)
{int ret,mx=0;if(idx[l]==idx[r]){for(register int i=l;i<=r;i++){int t=find(l,r,arr[i]);if(mx<=t){if(mx==t){if(val[arr[i]]<ret)ret=val[arr[i]];}else{mx=t;ret=val[arr[i]];}   }}}else{for(register int i=l;i<=idx[l]*sz;i++){ int t=find(l,r,arr[i]);if(mx<=t){if(mx==t){if(val[arr[i]]<ret)ret=val[arr[i]];}else{mx=t;ret=val[arr[i]];}   }}for(register int i=(idx[r]-1)*sz+1;i<=r;i++){int t=find(l,r,arr[i]);if(mx<=t){if(mx==t){if(val[arr[i]]<ret)ret=val[arr[i]];}else{mx=t;ret=val[arr[i]];}   }}if(idx[l]+1<=idx[r]-1){int t=find(l,r,f[idx[l]+1][idx[r]-1]);if(mx<=t){if(mx==t){if(val[f[idx[l]+1][idx[r]-1]]<ret)ret=val[f[idx[l]+1][idx[r]-1]];}else{mx=t;ret=val[f[idx[l]+1][idx[r]-1]];}   }}   }return ret;
}
int main()
{n=read();m=read();sz=(int)sqrt(n);for(register int i=1;i<=n;i++){arr[i]=read();tp[i]=arr[i];idx[i]=(i-1)/sz+1;}sort(tp+1,tp+1+n);for(register int i=1;i<=n;i++){int r=disc(arr[i]);val[r]=arr[i];arr[i]=r;pos[r].push_back(i);}tot=(n-1)/sz+1;for(register int i=1;i<=tot;i++)pre_work(i);int x=0;    for(register int i=1;i<=m;i++){int a,b;a=read();b=read();a=(a+x-1)%n+1;b=(b+x-1)%n+1;x=query((a<b?a:b),(a>b?a:b));printf("%d\n",x);}                  return 0;
}

View Code

转载于:https://www.cnblogs.com/nanjolno/p/9344868.html

luoguP4168: [Violet]蒲公英相关推荐

  1. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

  2. Luogu P4168 [Violet]蒲公英(分块)

    P4168 [Violet]蒲公英 题意 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还 ...

  3. 【题解】洛谷P4168 [Violet]蒲公英 (分块)

    [题解]洛谷P4168 [Violet]蒲公英 (分块)     D e s c r i p t i o n \rm Description Description 我们把所有的蒲公英看成一个长度为 ...

  4. 洛谷4168 [Violet]蒲公英

    标签:分块 题目 题目传送门 背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被 ...

  5. [Luogu P4168] [BZOJ 2724] [Violet]蒲公英

    洛谷传送门 BZOJ传送门 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也 ...

  6. 【luogu1468】[Violet]蒲公英--求区间众数

    题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

  7. [Violet]蒲公英(分块)

    题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

  8. 洛谷 P4168 [Violet]蒲公英

    题目:蒲公英 思路: 分块. 把所有数分成 n \sqrt{n} n ​个块,在每个块里分别求解. 代码: #include<bits/stdc++.h> using namespace ...

  9. 【洛谷 P4168】[Violet]蒲公英(分块)

    题目链接 题目大意:给定\(n\)个数和\(m\)个求区间众数的询问,强制在线 这题我\(debug\)了整整一个下午啊..-_- 从14:30~16:45终于\(debug\)出来了,\(debug ...

最新文章

  1. java中function_Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?...
  2. OGRE例子:Demo_Ocean 源码解析
  3. phpstorm配置Xdebug
  4. 消息映射的服务器的设计与实现
  5. python计算圆周率_用python计算圆周率Π
  6. 【活动(深圳)】告别2018之12.22 大湾区.NET Meet 大会 ,同时有网络直播
  7. 第五十二期:甲骨文遭遇“中年危机”:继阿里后,再被亚马逊永久抛弃
  8. [python]No module named ‘bs4‘
  9. MATLAB中数组的原始索引和线性索引之间相互进行转换
  10. jj为什么会变大变小_胡杏儿怀二胎不解鼻子为何变大?其实,还有三个部位变大的更厉害...
  11. intelliJ IDEA 怎么添加本地的idea web项目
  12. 百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
  13. php使用switch语句编写程序,PHP控制语句之“switch”语句实例详解
  14. MATLAB矩阵基本运算
  15. 2021年电工(技师)考试内容及电工(技师)复审考试
  16. “35岁,我退休了”:关于中年危机,这是最靠谱的回答
  17. 雨夜深思——开发平台(二)
  18. android 永久root权限,安卓 实现永久性开启adb 的root权限
  19. 【图像超分辨率重建】——SwinIR论文精读笔记
  20. 抖音商家入驻需要什么条件

热门文章

  1. child_process使用记录
  2. 3698: XWW的难题 有源汇上下界最大流
  3. 三、实现LED花样流水
  4. 名词介绍 CAPEX OPEX
  5. 计蒜客---它是多么甜蜜啊!
  6. python课题报告_2019-2020-1 《python程序设计》20192428魏来 综合实践报告
  7. 怎样成为精力管理的高手-听书有感
  8. git修改已提交的信息
  9. 【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
  10. python calu_Python的Woe:Woe库功能的介绍、安装和使用,之,woewoe,库函数,简介,方法,详细,攻略...