线段树维护每个点的最有可能是答案的数以及它的权重。

合并两个节点的时候,将权重互相抵消,保留较大的那一个。

得到答案后,再在对应权值的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 : 总统选举的更多相关文章

  1. 【BZOJ4966】总统选举 线段树+随机化

    [BZOJ4966]总统选举 Description 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大 ...

  2. 洛谷 P3765 总统选举 解题报告

    P3765 总统选举 题目背景 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作 ...

  3. 【bzoj4966】总统选举 随机化+线段树

    题目描述 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作为一名民主人士,小C决 ...

  4. 省队集训Day1 总统选举

    [题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变 ...

  5. [洛谷P3765]总统选举

    题目大意:有$n(n\leqslant5\times10^5)$个数,有$m(m\leqslant5\times10^5)$次询问. 一次询问形如$l\;r\;s\;k\;w_1\;w_2\dots ...

  6. luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

    这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...

  7. hihoCoder 1426 : What a Ridiculous Election(总统夶选)

    hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...

  8. Zookeeper-Zookeeper leader选举

    在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...

  9. 2017-10-27模拟赛2-T1 选举(election.*)

    Description 题目描述 C国的总统选举委员会最近遇到了一些麻烦. 他们在统计各省对H先生的支持率(百分比)时,把支持率四舍五入到了整数.等他们公布结果后,该国媒体发现这些省份的支持率之和不等 ...

随机推荐

  1. netty 学习(1)

    Netty使用:通过BootStrap来启动.而BootStrap主要分为两类:1.面向连接(TCP)的(ClientBootStrap和ServerBootStrap);2. 非面向连接(UDP)的 ...

  2. 页面注册系统--使用forms表单结合ajax

    页面注册系统--使用forms表单结合ajax 在Django中通过forms构建一个表单 1.urls.py 配置路由 from django.conf.urls import url from d ...

  3. Linux桌面环境安装matlab并创建快捷方式

    安装matlab sudo mkdir -p /mnt/matlab sudo mount -t auto -o loop /home/chris/Downloads/2016b_linux/R201 ...

  4. ORA-01536: 超出表空间 'tablespace_name' 的空间限额

    表空间限额问题知识总结:    表空间的大小与用户的配额大小是两种不同的概念    表空间的大小是指实际的用户表空间的大小,而配额大小指的是用户指定使用表空间的的大小    把表空间文件增大,还是出现 ...

  5. SQL Server 常用函数使用方法

    之前就想要把一些 SQL 的常用函数记录下来, 直到今天用到substring()这个函数,C# 里面这个方法起始值是 0,而 SQL 里面起始值是 1.傻傻分不清楚... 这篇博客作为记录 SQL ...

  6. Greenplum和Postgresql的主键自增

    参考:https://blog.csdn.net/u011042248/article/details/49422305 1.第一种情况就是创建数据表的时候创建主键自增,由于业务需要自己的数据表已经创 ...

  7. 一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)

    Hive官网(HQL)语法手册(英文版):https://cwiki.apache.org/confluence/display/Hive/LanguageManual Hive的数据存储 1.Hiv ...

  8. la 4490

    题解: 这道思路还是比较水的 我们可以等价变形成hi<=7 我们的最优决策是把抽出来的那些相同颜色的书最后插在一起(所以要统计序列中还有没有相同元素的书) f[i][j][k][x]表示前i本书 ...

  9. [转]Spring Boot修改最大上传文件限制:The field file exceeds its maximum permitted size of 1048576 bytes.

    来源:http://blog.csdn.net/awmw74520/article/details/70230591 SpringBoot做文件上传时出现了The field file exceeds ...

  10. Vim的合并行操作

    日常常用到多行合并的功能,记录如下: 第一种, 多行合并成一行,即: AAAAABBBBBCCCCC 合并为:AAAAA BBBBB CCCCC 方法1: normal状态下 3J 其中的3是范围,可 ...