【bzoj2724】[Violet 6]蒲公英
来源:互联网 发布:又污又有内涵的网络词 编辑:程序博客网 时间:2024/05/17 03:19
坑了好久的区间众数……
思路是分块。
设块的大小为
预处理第i个块和第j个块之间的众数和出现次数,这是
对于每个询问
于是总的复杂度是
稍微计算+对拍,取
#include <bits/stdc++.h>#define rep(i,a,b) for(int i=a,_=b;i<=_;i++)#define per(i,a,b) for(int i=a,_=b;i>=_;i--)#define maxn 50007#define maxb (742)typedef int arr[maxn];typedef int blk[maxb];typedef int seg[maxn * 20];inline int rd() { char c = getchar(); while (!isdigit(c)) c = getchar() ; int x = c - '0'; while (isdigit(c = getchar())) x = x * 10 + c - '0'; return x;}int BLOCKS;seg sz , lc , rc;arr belong , cnt , a , h , rt;blk st , ed , ans[maxb] , rec[maxb];int n_tot , tot , n , m;void update(int pr , int&nr , int l , int r , int v) { if (!nr) nr = ++ n_tot; sz[nr] = sz[pr] + 1; if (l == r) return; int m = (l + r) >> 1; if (v <= m) rc[nr] = rc[pr] , update(lc[pr] , lc[nr] , l , m , v); else lc[nr] = lc[pr] , update(rc[pr] , rc[nr] , m + 1 , r , v);}int query(int pr , int nr , int l , int r , int v) { while (l < r) { int m = (l + r) >> 1; if (v <= m) nr = lc[nr] , pr = lc[pr] , r = m; else nr = rc[nr] , pr = rc[pr] , l = m + 1; } return sz[nr] - sz[pr];}void input() { n = rd() , m = rd(); rep (i , 1 , n) h[i] = a[i] = rd();}void discrete() { std::sort(h + 1 , h + n + 1); rep (i , 1 , n) a[i] = std::lower_bound(h + 1 , h + n + 1 , a[i]) - h; rep (i , 1 , n) update(rt[i - 1] , rt[i] , 1 , n , a[i]);}void init_block() { BLOCKS = 101; rep (i , 1 , n) belong[i] = (i - 1) / BLOCKS + 1; tot = belong[n]; rep (i , 1 , tot) st[i] = (i - 1) * BLOCKS + 1 , ed[i] = i * BLOCKS; rep (i , 1 , tot) { int mx = 0 , t = 0; rep (j , st[i] , n) { cnt[a[j]] ++; if (cnt[a[j]] > mx || (cnt[a[j]] == mx && a[j] < t)) mx = cnt[a[j]] , t = a[j]; ans[i][belong[j]] = t; rec[i][belong[j]] = cnt[t]; } rep (j , st[i] , n) cnt[a[j]] = 0; }}int get_ans(int l , int r) { int mx = 0 , t; if (belong[l] == belong[r]) { rep (i , l , r) cnt[a[i]] = 0; rep (i , l , r) cnt[a[i]] ++; rep (i , l , r) if (cnt[a[i]] > mx || (cnt[a[i]] == mx && a[i] < t)) mx = cnt[a[i]] , t = a[i]; } else { if (belong[l] - 1 < belong[r]) mx = rec[belong[l] + 1][belong[r] - 1] , t = ans[belong[l] + 1][belong[r] - 1]; rep (i , l , ed[belong[l]]) { int c = query(rt[l - 1] , rt[r] , 1 , n , a[i]); if (c > mx || (c == mx && a[i] < t)) t = a[i] , mx = c; } rep (i , st[belong[r]] , r) { int c = query(rt[l - 1] , rt[r] , 1 , n , a[i]); if (c > mx || (c == mx && a[i] < t)) t = a[i] , mx = c; } } return t;}void solve() { discrete(); init_block(); int ans = 0; #ifndef ONLINE_JUDGE freopen("data.out" , "w" , stdout); #endif rep (i , 1 , m) { int l = (rd() + ans - 1) % n + 1; int r = (rd() + ans - 1) % n + 1; if (l > r) std::swap(l , r); ans = h[get_ans(l , r)]; printf("%d\n" , ans); }}int main() { #ifndef ONLINE_JUDGE freopen("data.txt" , "r" , stdin); #endif input(); solve(); return 0;}
0 0
- 【Violet 6】【BZOJ2724】蒲公英
- 【bzoj2724】[Violet 6]蒲公英
- bzoj2724: [Violet 6]蒲公英
- BZOJ2724: [Violet 6]蒲公英
- 【bzoj2724】[Violet 6]蒲公英
- BZOJ2724: [Violet 6]蒲公英
- bzoj2724: [Violet 6]蒲公英
- bzoj2724[Violet 6][蒲公英]
- 【bzoj2724】[Violet 6]蒲公英
- [分块] [BZOJ2724] [Violet 6] 蒲公英
- bzoj2724 [Violet 6]蒲公英 分块
- [BZOJ2724][Violet 6]蒲公英(分块)
- BZOJ2724: [Violet 6]蒲公英(分块)
- 【bzoj2724】[Violet 6]蒲公英 (注意:题面有毒!)
- BZOJ2724 [Violet 6]蒲公英 解题报告【数据结构】【分块】
- 2724: [Violet 6]蒲公英
- 2724: [Violet 6]蒲公英
- [bzoj2724]蒲公英
- 【图文解释】快速排序算法
- CANopen协议报文处理
- 【Hadoop】HDFS的运行原理
- CocoaPods使用详解
- linux下mysql数据库常用命令以及中文乱码问题的解决
- 【bzoj2724】[Violet 6]蒲公英
- Java学习笔记---继承和多态
- 研发绩效考核
- Java学习笔记---图形用户界面基础
- hdoj 2061 Treasure the new start, freshmen!(结构体)
- Ubuntu命令行查看系统资源使用情况
- GCD同步与异步,串行与并行深入讲解
- 从头认识java-9.7 LinkedList
- 一次纠结与喜悦的liunx+apache+php+mysql的安装过程