BZOJ 2223: [Coci 2009]PATULJCI 主席树
题目描述:动态求出现次数大于等于区间一半长度的数字.
题解: 对序列维护一个主席树即可.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include<bits/stdc++.h> #define maxn 300001 #define mid ((l+r)>>1) using namespace std; inline void setIO(string s) { string in=s+ ".in" ; freopen (in.c_str(), "r" ,stdin); } int cnt, cc=0; int ls[maxn*20],rs[maxn*20],sumv[maxn*20],root[maxn]; void build( int l, int r, int &o) { o=++cnt; if (l==r) return ; if (mid>=l) build(l,mid,ls[o]); if (r>mid) build(mid+1,r,rs[o]); } int update( int l, int r, int k, int x) { int oo=++cnt; sumv[oo]=sumv[x]+1; ls[oo]=ls[x], rs[oo]=rs[x]; if (l==r) return oo; if (k<=mid) ls[oo]=update(l,mid,k,ls[x]); else rs[oo]=update(mid+1,r,k, rs[x]); return oo; } int query( int u, int v, int l, int r) { if (l==r) { if (sumv[v]-sumv[u] > cc) return l; return -1; } int tmp=sumv[ls[v]]-sumv[ls[u]]; if (tmp > cc) return query(ls[u], ls[v], l, mid); else return query(rs[u], rs[v], mid + 1, r); } int main() { // setIO("input"); int n,m,i,a,Q,l,r; scanf ( "%d%d" ,&n,&m); build(1,m,root[0]); for (i=1;i<=n;++i) { scanf ( "%d" ,&a); root[i]=update(1,m,a,root[i-1]); } scanf ( "%d" ,&Q); while (Q--) { scanf ( "%d%d" ,&l,&r); cc=(r-l+1)>>1; a = query(root[l-1], root[r], 1, m); if (a==-1) printf ( "no\n" ); else printf ( "yes %d\n" , a); } return 0; } |
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版