CF1082E Increasing Frequency (multiset+乱搞+贪心)
题目大意:
\(给你n个数a_i,给定一个m,你可以选择一个区间[l,r],让他们区间加一个任意数,然后询问一次操作完之后,最多能得到多少个m\)
QWQ
考场上真的**
想了好久都不会,直到考试快结束才知道怎么做。
首先,根据题目,我们可以得知,假设我们修改了\([l,r]\)这个区间,那么最后的\(ans\)就应该是总的m的个数,减去区间中m的个数,加上区间内的众数的个数
QWQ
那么我们考虑怎么来处理这个。
首先,每个数字之间都是独立的。
所以我们可以预处理每一个数字出现的位置。
然后假设当前我们要计算的数字是\(x\)
那么,我们可以先对于所有出现的位置\(i\),求一个\([pos_1,pos_i]\)的答案QWQ
转移的式子也是比较显然。
\]
其中\(sum_m\)表示这段区间中的m的个数,这个可以用前缀和来维护
dp[j]=dp[j-1]+1-(sum[v[i][j]]-sum[v[i][j-1]]);
那么既然求出来这个东西,我们考虑左端点每移动一个,相当于对所有的右端点的区间加一个释放出来的贡献,也就是m的个数-1
所以说,我们现在需要一个能支持插入,删除,后缀修改,\(求max\)的一个数据结构
很自然能想到\(multiset\),插入删除和max就不说了,后缀修改的话,我们只需要维护一个\(delta\)表示改变量,对于每个元素,调用的时候都\(+delta\)就解决了
QWQ
给代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk makr_pair
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 5e5+1e2;
int n,a[maxn];
int m;
int sum[maxn];
vector<int> v[maxn];
int cnt;
int vis[maxn];
int dp[maxn];
int ans;
int main()
{
n=read(),m=read();
for (int i=1;i<=n;i++) v[i].push_back(0);
for (int i=1;i<=n;i++)
{
a[i]=read();
if (!vis[a[i]])
{
++cnt;
vis[a[i]]=cnt;
}
v[vis[a[i]]].push_back(i);
}
for (int i=1;i<=n;i++) if(a[i]==m) sum[i]=1;
for (int i=1;i<=n;i++) sum[i]+=sum[i-1];
ans=sum[n];
for (int i=1;i<=cnt;i++)
{
if (a[v[i][1]]==m) continue;
int num = v[i].size();
multiset<int> s;
dp[1]=1;
s.insert(1);
for (int j=2;j<num;j++)
{
dp[j]=dp[j-1]+1-(sum[v[i][j]]-sum[v[i][j-1]]);
//cout<<j<<" "<<dp[j]<<endl;
s.insert(dp[j]);
}
ans=max(ans,(*(s.rbegin()))+sum[n]);
int j=1;
int delta=0;
while (j<num-1)
{
s.erase(s.find(dp[j]));
j++;
delta+=sum[v[i][j]]-sum[v[i][j-1]]-1;
ans=max(ans,(*(s.rbegin()))+delta+sum[n]);
}
}
cout<<ans;
return 0;
}
CF1082E Increasing Frequency (multiset+乱搞+贪心)的更多相关文章
- Codeforces724D [字符串][乱搞][贪心]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意:给你一个区间长度n和一个字符串,要求在字符串中选择一些symbol使得字符串的任意长度为n的子区间都存在至少一个symbol. 任意选取symbol ...
- bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
2217: [Poi2011]Lollipop Time Limit: 15 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 383 Solved ...
- [CF1082E] Increasing Frequency
Description 给定一个长度为 \(n\) 的数列 \(a\) ,你可以任意选择一个区间 \([l,r]\) ,并给区间每个数加上一个整数 \(k\) ,求这样一次操作之后数列中最多有多少个数 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- SCOI 2013 密码 & 乱搞
题意: Fish 是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息:1. 该密 ...
- BZOJ4401:块的计数(乱搞)
Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...
- 2017 ACM-ICPC EC-Final ShangHai(思维乱搞赛)
感觉全是思维乱搞题. Gym - 101775J Straight Master 给你n种扑克,你每次可以出连续的3 ~ 5 张,问你能否出完. Sample Input 2 13 1 2 2 1 0 ...
- [TJOI2013]奖学金 乱搞
[TJOI2013]奖学金 乱搞 从\(c\)个二元组\((v,w)\)中选出\(n\)个,使其\(v\)的中位数最大的同时使\(w\)和小于等于\(f\),求这个中位数 有点意思.有点像二分答案的思 ...
随机推荐
- tree命令出现乱码
alias tree='tree --charset ASCII'就可以了
- (一)羽夏看C语言——简述
"羽夏看C语言"介绍什么 本系列从汇编的角度,比较翔实的介绍C语言.C++和C其实是一样的东西,C++的编译器只是更强大,更能帮助我们写代码,例如模板.没有特殊说明,本系列不会 ...
- Java基础之SPI机制
SPI 机制,全称为 Service Provider Interface,是一种服务发现机制.它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件 ...
- Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器
Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器 Mybatis-plus官网: https://mp.baomidou.com/ Demo ...
- client-go实战之三:Clientset
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Install Docker Engine on CentOS 在CentOS 7 上安装Docker
Install Docker Engine on CentOS OS Requirements 系统要求 To install Docker Engine,you need a maintained ...
- VS dll 引用依赖
在公司实习过程中,经常遇到三个问题: 开发环境 dll引用依赖 dll版本控制 一般公司都会配置开发/测试/Lab/线上四个环境,之后不管时开发什么项目,都与环境分不开边.这个和dll版本控制暂且记下 ...
- Tars | 第5篇 基于TarsGo Subset路由规则的Java JDK实现方式(上)
目录 前言 1. 修改.tars协议文件 1.1 Go语言修改部分 1.2 修改地方的逻辑 1.3 通过协议文件自动生成代码 2. [核心]增添Subset核心功能 2.1 Go语言修改部分 2.2 ...
- Identity基于角色的访问授权
详情访问官方文档 例如,以下代码将访问权限限制为属于角色成员的用户的任何操作 AdministrationController Administrator : [Authorize(Roles = & ...
- python库--requests
requests 方法 返回 参数 方法详情 .get() r url get请求 params url?后面的内容会以'key=value'的方式接到url后面 proxies 设置代理ip ...