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 的新生舞会的更多相关文章

  1. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  2. loj #6250. 「CodePlus 2017 11 月赛」找爸爸

    #6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...

  3. [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔

    Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...

  4. [LOJ 6248]「CodePlus 2017 11 月赛」晨跑

    Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...

  5. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)

    从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...

  6. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  7. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!

    n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...

  8. LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset

    题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...

  9. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

随机推荐

  1. leetcode 484. Find Permutation 思维题

    https://leetcode.com/contest/leetcode-weekly-contest-16a/problems/find-permutation/ 设原本的数字是0,那么按照它的D ...

  2. 解决ASP.NET Core通过docker-compose up启动应用无法配置https的解决办法

    错误重现一下: 新建了一个ASP.NET Core应用,在VS2017下添加Docker支持,选择Linux环境 然后再给这个web应用再右键添加容器业务流程协调程序支持,然后解决方案就多了一个doc ...

  3. AJPFX关于IO流的简单总结

    IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流,比如InputStream,Output ...

  4. 客户端负载均衡 - Ribbon

    Ribbon是Netflix公司开源的一个负载均衡的项目(https://github.com/Netflix/ribbon),它是一个基于HTTP.TCP的客户端负载均衡器. 服务端负载均衡 负载均 ...

  5. 获取请求服务器传输协议http or https

    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PO ...

  6. java io性能分析

    摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...

  7. vs2015 qt5.8新添加文件时出现“无法找到源文件ui.xxx.h”

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7147135.html vs2015 qt5.8新添加文件时出现“无法找到源文件ui.xxx.h” 暂时解决版本 ...

  8. C#斐波那契数列递归算法

    public static int Foo(int i)        {            if (i < 3)            {                return 1; ...

  9. 五、面向切面的spring(1)

    spring的依赖注入看完了,接下来是spring中与DI一并重要的AOP了,开始吧,GO. 在软件开发中,散布于应用中多处的功能被称为横切发关注点,通常来讲,这些横切关注点从概念上市与应用的业务逻辑 ...

  10. 使用webpack搭建react项目 webpack-react-project

    webpack-react-project 使用webpack搭建react项目 webpack搭建react项目 github源码 具体配置信息参照package.json和webpack.conf ...