BZOJ4966 : 总统选举
线段树维护每个点的最有可能是答案的数以及它的权重。
合并两个节点的时候,将权重互相抵消,保留较大的那一个。
得到答案后,再在对应权值的Treap中查询出现次数,检查是否真正是答案。
时间复杂度$O(n\log n)$。
- #include<cstdio>
- #include<cstdlib>
- const int N=500010,M=1100010,BUF=30000000;
- int n,m,i,a[N],c,d,pos[N],v[M],f[M],V,F;char Buf[BUF],*buf=Buf;
- inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
- inline void merge(int a,int b,int c,int d,int&V,int&F){
- if(b==d){V=a+c,F=b;return;}
- if(!b||!d){V=a+c,F=b+d;return;}
- if(a==c){V=F=0;return;}
- if(a>c){V=a-c,F=b;return;}
- V=c-a,F=d;
- }
- void build(int x,int a,int b){
- if(a==b){
- v[x]=1;
- f[x]=::a[a];
- pos[a]=x;
- return;
- }
- int mid=(a+b)>>1;
- build(x<<1,a,mid),build(x<<1|1,mid+1,b);
- merge(v[x<<1],f[x<<1],v[x<<1|1],f[x<<1|1],v[x],f[x]);
- }
- struct node{
- int val,cnt,sum,p;node*l,*r;
- node(){val=cnt=sum=p=0;l=r=NULL;}
- inline void up(){sum=cnt+l->sum+r->sum;}
- }*blank=new(node),pool[1500010],*cur=pool,*T[N];
- inline void Rotatel(node*&x){node*y=x->r;x->r=y->l;x->up();y->l=x;y->up();x=y;}
- inline void Rotater(node*&x){node*y=x->l;x->l=y->r;x->up();y->r=x;y->up();x=y;}
- void Insert(node*&x,int p){
- if(x==blank){
- x=cur++;x->val=p;x->l=x->r=blank;x->cnt=x->sum=1;x->p=rand();
- return;
- }
- x->sum++;
- if(p==x->val){x->cnt++;return;}
- if(p<x->val){
- Insert(x->l,p);
- if(x->l->p>x->p)Rotater(x);
- }else{
- Insert(x->r,p);
- if(x->r->p>x->p)Rotatel(x);
- }
- }
- void Delete(node*&x,int p){
- x->sum--;
- if(p==x->val){x->cnt--;return;}
- if(p<x->val)Delete(x->l,p);else Delete(x->r,p);
- }
- int Ask(node*&x,int p){
- if(x==blank)return 0;
- if(p==x->val)return x->r->sum;
- if(p<x->val)return x->cnt+x->r->sum+Ask(x->l,p);
- return Ask(x->r,p);
- }
- inline void change(int x){
- Delete(T[a[x]],x);
- Insert(T[a[x]=F],x);
- f[x=pos[x]]=F;
- for(x>>=1;x;x>>=1)merge(v[x<<1],f[x<<1],v[x<<1|1],f[x<<1|1],v[x],f[x]);
- }
- void ask(int x,int a,int b){
- if(c<=a&&b<=d){
- merge(V,F,v[x],f[x],V,F);
- return;
- }
- int mid=(a+b)>>1;
- if(c<=mid)ask(x<<1,a,mid);
- if(d>mid)ask(x<<1|1,mid+1,b);
- }
- inline bool check(int l,int r,int t){
- if(!t)return 0;
- int w=Ask(T[t],l-1)-Ask(T[t],r);
- return w*2>r-l+1;
- }
- int main(){
- fread(Buf,1,BUF,stdin);read(n),read(m);
- blank->l=blank->r=blank;
- for(i=1;i<=n;i++)T[i]=blank;
- for(i=1;i<=n;i++)read(a[i]),Insert(T[a[i]],i);
- build(1,1,n);
- while(m--){
- read(c),read(d);
- V=F=0;
- ask(1,1,n);
- if(!check(c,d,F))F=0;
- read(c);
- if(!F)F=c;
- read(c);
- while(c--)read(d),change(d);
- printf("%d\n",F);
- }
- if(!check(1,n,f[1]))f[1]=-1;
- return printf("%d",f[1]),0;
- }
BZOJ4966 : 总统选举的更多相关文章
- 【BZOJ4966】总统选举 线段树+随机化
[BZOJ4966]总统选举 Description 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大 ...
- 洛谷 P3765 总统选举 解题报告
P3765 总统选举 题目背景 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作 ...
- 【bzoj4966】总统选举 随机化+线段树
题目描述 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作为一名民主人士,小C决 ...
- 省队集训Day1 总统选举
[题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变 ...
- [洛谷P3765]总统选举
题目大意:有$n(n\leqslant5\times10^5)$个数,有$m(m\leqslant5\times10^5)$次询问. 一次询问形如$l\;r\;s\;k\;w_1\;w_2\dots ...
- luogu P3765 总统选举(线段树维护摩尔投票+平衡树)
这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...
- hihoCoder 1426 : What a Ridiculous Election(总统夶选)
hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...
- Zookeeper-Zookeeper leader选举
在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...
- 2017-10-27模拟赛2-T1 选举(election.*)
Description 题目描述 C国的总统选举委员会最近遇到了一些麻烦. 他们在统计各省对H先生的支持率(百分比)时,把支持率四舍五入到了整数.等他们公布结果后,该国媒体发现这些省份的支持率之和不等 ...
随机推荐
- Python - 去除list中的空字符
list1 = ['122', '2333', '3444', '', '', None] a = list(filter(None, list1)) # 只能过滤空字符和None print(a) ...
- 使用docker方式安装etcd集群,带TLS证书
网上文档也多,安装的时候,还是踩了几个坑. 现在作一个安装记录吧. 1,先作自签名的证书ca-csr.json(为了和k8s共用根证书,可能将信息调为k8s). { "CN": & ...
- html5和html的区别
最近看群里聊天聊得最火热的莫过于手机网站和html5这两个词.可能有人会问,这两者有什么关系呢?随着这移动互联网快速发展的时代,尤其是4G时代已经来临的时刻,加上微软对“XP系统”不提供更新补丁.维护 ...
- Nodejs通过账号密码连接MongoDB数据库
转自https://blog.csdn.net/szu_lzz/article/details/77435804#commentBox 1.创建管理员 首先开启Mongo服务,然后切换admin数据库 ...
- select2插件 多选框动态初始化值
转自https://blog.csdn.net/yiyiwyf/article/details/53521980 上一篇讲了select2的多选和大标题设置. 这周做到了修改的功能,需要将旧数据的选项 ...
- Summary of continuous function spaces
In general differential calculus, we have learned the definitions of function continuity, such as fu ...
- Loadrunner和JMeter并发对比
今天在项目中测试发现,其实LR才是实际意义上的并发测试,JMeter不算并发 记录用户登录日志: LR脚本: 1.登录操作放在init初始化中,用5个虚拟用户并发测试:
- 带你了解zabbix如何监控mysql主从到报警触发
本章博客我们一起来聊一聊如何监控mysql数据库主从状态? 思路梳理: 1)首先我们都知道,判断Mysql主从是否正常,是通过主从上面的SQL和IO线程都为yes状态判断(通过awk取值,grep过滤 ...
- mybatis拦截器处理
1.自定义注释 package com.hsfw.backyard.biz.security.authority; import java.lang.annotation.*; /** * 数据权限过 ...
- Codeforces 1000G Two-Paths 树形动态规划 LCA
原文链接https://www.cnblogs.com/zhouzhendong/p/9246484.html 题目传送门 - Codeforces 1000G Two-Paths 题意 给定一棵有 ...