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. 443 String Compression 压缩字符串

    给定一组字符,使用原地算法将其压缩.压缩后的长度必须始终小于或等于原数组长度.数组的每个元素应该是长度为1 的字符(不是 int 整数类型).在完成原地修改输入数组后,返回数组的新长度.进阶:你能否仅 ...

  2. TCP协议三次握手和四次握手

    前言 先说一下IP协议和TCP协议,IP协议是无连接的通信协议,IP不会占用两个设备之间通信的线路,IP实际上主要负责将每个数据包路由至目的地,但是IP协议并没有能够确保数据包是否到达,传过去的数据包 ...

  3. [BZOJ2456]mode 其它

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2456 这道题有着神奇的内存限制1MB也就是说我们是没办法把读入的数字存下来的. 由于答案求 ...

  4. 学习笔记 第六章 使用CSS美化图片

    第六章  使用CSS美化图片 6.1  在网页中插入图片 GIF图像 跨平台能力,无兼容性问题: 具有减少颜色显示数目而极度压缩文件的能力,不会降低图像的品质(无损压缩): 支持背景透明功能,便于图像 ...

  5. addslashes,stripslashes

    官方介绍: (PHP 4, PHP 5) addslashes — 使用反斜线引用字符串 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线.这些字符是单引号(’).双引号(”). ...

  6. 摘:关于php调用.net的web service 踩过的坑

    文档地址:http://www.cnblogs.com/wyycc/p/6722701.html

  7. C++ 继承/派生、访问属性、构造函数

    1.子类继承父类的继承方式:public,private,protected,不写则默认为private: 2.子类会继承父类的全部成员(除了构造函数.析构函数,虽然析构函数有virtual,但是不是 ...

  8. 迅为4412嵌入式安卓开发板兼容3G网络|4G网络

    iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,陀螺仪等,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台 ...

  9. 一个圆的移动 AE教程 速度曲线调节

    AE里面速度的曲线调节 最终的小效果 两个关键点: 一:速度曲线调节 编辑速度图标,他的曲线是编辑速度的. 二:节点不要用贝塞尔曲线 编辑值图标,就是圆圈的x值y值的曲线.控制位置移动的. 选择一个节 ...

  10. 【计算机网络】2.3 文件传输协议:FTP

    第二章第三节 文件传输协议:FTP 在一个典型的FTP(File Transfer Protocol,文件传输协议)会话中,用户坐在一台主机(本地主机)前面,向一台远程主机传输(或接收来自远程主机的) ...