「CodePlus 2017 11 月赛」Yazid 的新生舞会
n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半。
这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理。然后没有第二反应。很好。
在枚举一个数字的时候,可以把这个数字出现的位置记+1,没出现的位置记-1,实际就是问现在这个数组有多少个区间和>0,就是问对每个前缀和Si有多少Sj<Si。
出现的位置加起来总共只有n个,如果-1的那些区间能够进行区间处理该多好啊!
那就维护一个以Si的值为下标的东西,然后查一个区间的答案就是查:

红色部分。也就是要查一个区间和乘上若干,以及一个区间每个数乘上等差数列。可以通过维护每个Si的值的个数的区间和,以及区间Cnt_i * i的和。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<bitset>
#include<queue>
//#include<math.h>
//#include<time.h>
//#include<iostream>
using namespace std; int n,type;
#define maxn 1000011
#define LL long long
struct Node
{
int id,v;
bool operator < (const Node &b) const {return v<b.v || (v==b.v && id<b.id);}
}a[maxn];
int lisan[maxn],li=; const int most=;
struct SMT
{
struct Node
{
int ls,rs;
int sum;LL sss;
int add;
}a[maxn<<];
int size,root;
void clear() {size=root=;}
int ql,qr,v;
void up(int x)
{
const int &p=a[x].ls,&q=a[x].rs;
a[x].sum=a[p].sum+a[q].sum;
a[x].sss=a[p].sss+a[q].sss;
}
void New(int &x)
{
x=++size; a[x].ls=a[x].rs=;
a[x].sss=a[x].add=a[x].sum=;
}
void addsingle(int x,int L,int R,int v)
{
a[x].sum+=(R-L+)*v;
a[x].sss+=((1ll*(most-R++most-L+)*(R-L+))>>)*v;
a[x].add+=v;
}
void down(int x,int L,int R)
{
int &p=a[x].ls,&q=a[x].rs,mid=(L+R)>>;
if (!p) New(p); if (!q) New(q);
if (a[x].add)
{
addsingle(p,L,mid+,a[x].add);
addsingle(q,mid+,R,a[x].add);
a[x].add=;
}
}
void Add(int &x,int L,int R)
{
if (!x) New(x);
if (ql<=L && R<=qr) {addsingle(x,L,R,v); return;}
down(x,L,R);
const int mid=(L+R)>>;
if (ql<=mid) Add(a[x].ls,L,+mid);
if (qr> mid) Add(a[x].rs,mid+,R);
up(x);
}
void add(int L,int R,int v)
{
if (L>R) return;
L+=most>>; R+=most>>;
this->v=v; ql=L; qr=R;
Add(root,,most);
}
LL Querysum(int &x,int L,int R)
{
if (!x) New(x);
if (ql<=L && R<=qr) return a[x].sum;
down(x,L,R);
const int mid=(L+R)>>; LL ans=;
if (ql<=mid) ans+=Querysum(a[x].ls,L,mid);
if (qr> mid) ans+=Querysum(a[x].rs,mid+,R);
return ans;
}
LL querysum(int L,int R)
{
if (L>R) return ;
L+=most>>; R+=most>>;
ql=L; qr=R;
return Querysum(root,,most);
}
LL Querysss(int &x,int L,int R)
{
if (!x) New(x);
if (ql<=L && R<=qr) return a[x].sss;
down(x,L,R);
const int mid=(L+R)>>; LL ans=;
if (ql<=mid) ans+=Querysss(a[x].ls,L,mid);
if (qr> mid) ans+=Querysss(a[x].rs,mid+,R);
return ans;
}
LL querysss(int L,int R)
{
if (L>R) return ;
L+=most>>; R+=most>>;
ql=L; qr=R;
return Querysss(root,,most);
}
}t; int main()
{
scanf("%d%d",&n,&type);
for (int i=;i<=n;i++) scanf("%d",&a[i].v),a[i].id=i;
sort(a+,a++n); a[n+].v=0x3f3f3f3f; LL ans=;
for (int i=,j=;i<=n+;i++) if (a[i].v!=a[i-].v)
{
t.clear();
int last=,where=;
t.add(,,);
for (;j<i;j++)
{
const int now=a[j].id;
if (now-last>)
{
int len=now-last-;
ans+=t.querysss(where-len-,where-)+t.querysum(-(most>>),where-len-)*len
-t.querysum(where-len-,where-)*(most-where-(most>>)+);
t.add(where-len,where-,);
where-=len;
}
ans+=t.querysum(-(most>>),where);
where++; t.add(where,where,);
last=now;
}
int len=n-last;
(len)&&(ans+=t.querysss(where-len-,where-)+t.querysum(-(most>>),where-len-)*len
-t.querysum(where-len-,where-)*(most-where-(most>>)+));
}
printf("%lld\n",ans);
return ;
}
这题还有树状数组和分治的写法。待填坑。
「CodePlus 2017 11 月赛」Yazid 的新生舞会的更多相关文章
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...
- loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...
- [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔
Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...
- [LOJ 6248]「CodePlus 2017 11 月赛」晨跑
Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...
- 「CodePlus 2017 11 月赛」可做题
这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...
- LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset
题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
随机推荐
- 190 Reverse Bits 颠倒二进制位
颠倒给定的32位无符号整数的二进制位.例如,给定输入 43261596(二进制表示为 00000010100101000001111010011100 ),返回 964176192(二进制表示为 00 ...
- 219 Contains Duplicate II 存在重复 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使 nums [i] = nums [j],并且 i 和 j 的绝对差值最大为 k. 详见:https://leetcod ...
- Spring Cloud是什么?
[学习笔记] 3)Spring Cloud是什么?马克-to-win@马克java社区:i)Spring Cloud是一个微服务框架,Spring Cloud基于微服务基础框架Netflix进行了up ...
- Program received signal SIGILL, Illegal instruction
Program received signal SIGILL, Illegal instruction 这个错误,发现是直接在printf 的%s中直接使用string类型,而没有使用c字符串格式造成 ...
- Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- iOS Programming Camera 1
iOS Programming Camera 1 1 Displaying Images and UIImageView 1.1 put an instance of UIImageView o ...
- linux命令useradd添加用户
linux命令useradd添加用户详解 1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s ...
- AIX RAC 安装失败完全卸载
1,删除软件安装目录 rm -rf /u01/app 2,删除以下目录内容 rm -rf/tmp/.oracle rm -rf/tmp/* rm -rf/tmp/ora* rm -rf/var/tmp ...
- java图片放大或缩小
package org.jimmy.autotranslate20181022.utils; import java.awt.Graphics; import java.awt.image.Buffe ...
- java引用数据类型在方法中的值传递
package org.jimmy.autosearch20180821.test; public class TestStringArr { public static void main(Stri ...