【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)
2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MB
Submit: 1908 Solved: 678Description
Input
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
Sample Input
6 3
1 2 3 2 1 2
1 5
3 6
1 5Sample Output
1
2
1HINT
修正下:
n <= 40000, m <= 50000
Source
【分析】
区间众数见:http://www.docin.com/p-679227660.html
我这道题的就是打这个做法【实际上是膜hzwer的代码
【关于[l,r]之间有多少个x,是把位置存在数值的vector里面,然后lower_bound(l)~upper_bound(r)有多少个数
然后分块一下就好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
#define Maxn 50010
#define Maxm 510 int a[Maxn],f[Maxn],bl[Maxn],mode[Maxm][Maxm];
map<int,int> mp;int id;
vector<int > v[Maxn]; int blo,n;
int cnt[Maxn];
void pre(int x)
{
memset(cnt,,sizeof(cnt));
int mx=,ans=;
for(int i=(x-)*blo+;i<=n;i++)
{
cnt[a[i]]++;
int t=bl[i];
if(cnt[a[i]]>mx||(cnt[a[i]]==mx&&f[a[i]]<f[ans]))
ans=a[i],mx=cnt[a[i]];
mode[x][t]=ans;
}
} int get_(int l,int r,int x)
{
return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
} int query(int l,int r)
{
int ans,mx=;
if(bl[l]==bl[r])
{
for(int i=l;i<=r;i++)
{
int t=get_(l,r,a[i]);
if(t>mx||(t==mx)&&f[a[i]]<f[ans]) ans=a[i],mx=t;
}
}
else
{
ans=mode[bl[l]+][bl[r]-],mx=get_(l,r,ans);
for(int i=l;i<=bl[l]*blo;i++)
{
int t=get_(l,r,a[i]);
if(t>mx||(t==mx)&&f[a[i]]<f[ans]) ans=a[i],mx=t;
}
for(int i=(bl[r]-)*blo+;i<=r;i++)
{
int t=get_(l,r,a[i]);
if(t>mx||(t==mx&&f[a[i]]<f[ans])) ans=a[i],mx=t;
}
}
return ans;
} int main()
{
int m;
scanf("%d%d",&n,&m);
blo=;
int ans=;id=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(!mp[a[i]]) mp[a[i]]=++id,f[id]=a[i];
a[i]=mp[a[i]];
v[a[i]].push_back(i);
}
for(int i=;i<=n;i++) bl[i]=(i-)/blo+;
for(int i=;i<=bl[n];i++) pre(i);
for(int i=;i<=m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
l=(l+ans-)%n+,r=(r+ans-)%n+;
if(l>r) swap(l,r);
ans=f[query(l,r)];
printf("%d\n",ans);
}
return ;
}
【不行了 我也用map了。。。。
然后其实有更快的方法,然后我尝试了一下就放弃了。。【感觉是用空间和代码量换时间啊好恶心、、
然后带修改这样【其实我没看。。
2017-04-23 21:21:48
【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)的更多相关文章
- BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树
之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...
- P4168 [Violet]蒲公英 区间众数
$ \color{#0066ff}{ 题目描述 }$ 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 \((a_1,a_2.. ...
- 洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)
试题来源 2011中国国家集训队命题答辩 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- bzoj 5028: 小Z的加油店——带修改的区间gcd
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...
- BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序
Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- 【BZOJ】2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2900 Solved: 1031[Submit][Statu ...
- BZOJ.2724.[Violet 6]蒲公英(静态分块)
题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...
随机推荐
- TCP/IP 网络编程的理解
一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程 ...
- 51、多线程创建的三种方式之实现Callable接口
实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...
- Python练习-从小就背不下来的99乘法表
心血来潮,灵机一动,反正就是无聊的做了一个很简单的小玩意: for i in range(1,10):#让i 1-9 循环9次 print("\n")#每循环一次进行一次换行 fo ...
- AutoCAD DevTV-AUTOCAD二次开发资源合集
Webcast Language Date AutoCAD .Net - Session 2 English 13-Sep-12 AutoCAD .Net - Session 1 English 6- ...
- php实现异步请求
PHP开启异步多线程执行脚本 装载自:http://www.cnblogs.com/clphp/p/4913214.html 场景要求 客户端调用服务器a.php接口,需要执行一个长达5s-20s不 ...
- 2016.5.21——atoi()函数的测试
对函数atoi()函数的测试: atoi()函数将字符串型转换为整型 代码: #include "stdafx.h" #include "iostream" # ...
- TCP三次握手与四次挥手过程
TCP连接的建立(三次握手) 首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接: 客户端将报文段中的SYN=1(同步位),并选择一个seq=x,(即该请求报文的序号为x) ...
- 【前端开发】禁止微信内置浏览器调整字体大小的方法js
微信webview内置了调整字体大小的功能,用户可以根据实际情况进行调节.但是很多移动端页面的开发都是使用rem作为单位的,字体大小改变以后,会出现页面布局错乱的情况,因此希望能够禁止微信的字体放大功 ...
- DEDECMS去除后门隐患和漏洞以及冗余代码的方法
链接:http://jingyan.baidu.com/article/4d58d541195bdb9dd4e9c029.html 工具/原料 织梦网站管理系统 sublime编辑器 方法/步骤 第一 ...
- 查找sqlserver数据库中,查询某值所表名和字段名
有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将这个存储过程放在所查询的数据库. CR ...