「JOISC 2014 Day1」 历史研究

Solution

子任务2

暴力,用\(cnt\)记录每种权值出现次数。

子任务3

这不是一个尺取吗...

然后用multiset维护当前的区间,动态加,删点即可。

子任务4

目前可以支持在\(o(log(n) )\)的时间里动态加,删单点了。

容易想到莫队。

直接用multiset维护复杂度\(o(n \sqrt n log(n))\)。(一脸不可过)

稍微优化一下

​ 若使用cnt记录的话,是没法很好的删点的。

​ 对于目前要处理的块\([l,r]\),询问右端点单调,没有删点的操作,需要删点操作的是左端点的块内移动。

​ 事实上,左端点的块内移动可以直接改为加入需要用到的点。

​ \(cnt\)统计\(r+1\)以后的点 ,cnt本身维护一个最大值MAX。加入块内的点 时,MAX不变,维护一个ANS。

​ 这样就不需要删点了(加入的 块内的点 回滚一下即可)。

最终复杂度\(o(n \sqrt n)\)

Code

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r) {
static char c;
r=0;
while(c=getchar(),!isdigit(c));
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
}
const int mn=100005;
int val[mn],mid[mn],n,Q;
int cnt[mn];
namespace something_only_for_fc{
void solve(){
int l,r;
while(Q--){
in(l),in(r);
long long Max=0;
rep(q,l,r)++cnt[val[q]];
rep(q,l,r)Max=max(Max,1LL*cnt[val[q]]*mid[val[q]]);
rep(q,l,r)--cnt[val[q]];
printf("%lld\n",Max);
}
}
}
struct node{
int l,r,id;
bool operator <(const node &A)const{
return l==A.l?r<A.r:l<A.l;
}
}qr[mn];
long long ans[mn];
namespace something_value_25pts{
multiset<long long> have_val;
multiset<long long>::iterator it;
void remove(long long v){
it=have_val.find(v);
if(it!=have_val.end())have_val.erase(it);
}
long long Max(){
it=have_val.end(),--it;
return (*it);
}
void solve(){
int now=1;
int l=1;
for(int r=1;r<=n;++r){
if(cnt[val[r]])remove(1LL*cnt[val[r]]*mid[val[r]]);
++cnt[val[r]];
have_val.insert(1LL*cnt[val[r]]*mid[val[r]]);
if(now<=Q&&r==qr[now].r){
while(l<qr[now].l){
remove(1LL*cnt[val[l]]*mid[val[l]]);
--cnt[val[l]];
if(cnt[val[l]])have_val.insert(1LL*cnt[val[l]]*mid[val[l]]);
++l;
}
ans[qr[now].id]=Max();
++now;
}
}
rep(q,1,Q)printf("%lld\n",ans[q]);
}
}
bool pts_25_check(){
rep(q,2,Q)if(qr[q].l==qr[q-1].l)return 0;
return 1;
}
namespace something_just_for_fun{ vector<node> son[400];
long long Max,an;
void add(int v){
++cnt[v];
Max=max(Max,1LL*cnt[v]*mid[v]);
}
void mid_add(int v){
++cnt[v];
an=max(an,1LL*cnt[v]*mid[v]);
} int now_r;
void move(int to){
rep(q,now_r+1,to)add(val[q]);
now_r=to;
}
bool cmp(node a,node b){
return a.r<b.r;
}
void get(int x,int now){
if(!son[x].size())return;
now_r=now,Max=0;
rep(q,1,n)cnt[q]=0;
sort(son[x].begin(),son[x].end(),cmp);
rep(q,0,(int)son[x].size()-1){
if(son[x][q].r<=now){
an=0;
rep(w,son[x][q].l,son[x][q].r)mid_add(val[w]);
rep(w,son[x][q].l,son[x][q].r)--cnt[val[w]];
}else{
move(son[x][q].r);
an=Max;
rep(w,son[x][q].l,now)mid_add(val[w]);
rep(w,son[x][q].l,now)--cnt[val[w]];
}
ans[son[x][q].id]=an;
}
}
void solve(){
int K=sqrt(n)+1;
int lim=n/K;
rep(q,1,Q)son[qr[q].l/K].push_back(qr[q]);
rep(q,0,lim)get(q,min(n,(q+1)*K-1));
rep(q,1,Q)printf("%lld\n",ans[q]);
}
}
int main(){
freopen("history.in","r",stdin);
freopen("history.out","w",stdout);
in(n),in(Q);
rep(q,1,n)in(val[q]),mid[q]=val[q];
sort(mid+1,mid+n+1);
rep(q,1,n)val[q]=lower_bound(mid+1,mid+n+1,val[q])-mid;
if(n<=5000&&Q<=5000)something_only_for_fc::solve();
else{
rep(q,1,Q)in(qr[q].l),in(qr[q].r),qr[q].id=q;
sort(qr+1,qr+Q+1);
if(pts_25_check())something_value_25pts::solve();
else something_just_for_fun::solve();
}
return 0;
}

「JOISC 2014 Day1」 历史研究的更多相关文章

  1. 「JOISC 2014 Day1」历史研究 --- 回滚莫队

    题目又臭又长,但其实题意很简单. 给出一个长度为\(N\)的序列与\(Q\)个询问,每个询问都对应原序列中的一个区间.对于每个查询的区间,设数\(X_{i}\)在此区间出现的次数为\(Sum_{X_{ ...

  2. 「题解」「JOISC 2014 Day1」历史研究

    目录 题目 考场思考 思路分析及标程 题目 点这里 考场思考 大概是标准的莫队吧,离散之后来一个线段树加莫队就可以了. 时间复杂度 \(\mathcal O(n\sqrt n\log n)\) . 然 ...

  3. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...

  4. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  5. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

  6. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  7. loj2880「JOISC 2014 Day3」稻草人

    题目链接:bzoj4237 ​ loj2880 考虑\(cdq\)分治,按\(x\)坐标排序,于是问题变成统计左下角在\([l,mid]\),右上角在\([mid+1,r]\)的矩形数量 我们先考虑固 ...

  8. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  9. LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

    题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...

随机推荐

  1. Java基础(八)——IO流1_字节流、字符流

    一.概述 1.介绍 I/O是 Input/Output 的缩写,IO流用来处理设备之间的数据传输,如读/写文件,网络通讯等.Java对数据的操作是通过流的方式进行.java.io 包下提供了各种&qu ...

  2. Redis 的 3 种集群方案对比

    数据持久化 主从复制 自动故障恢复 集群化 数据持久化本质上是为了做数据备份,有了数据持久化,当Redis宕机时,我们可以把数据从磁盘上恢复回来,但在数据恢复之前,服务是不可用的,而且数据恢复的时间取 ...

  3. KKT (LICQ)

    目录 基本内容 LICQ 假设 KKT 定理 KKT定理的证明 引理A Farkas 引理 推论 KKT定理的证明 H. E. Krogstad, TMA 4180 Optimeringsteori ...

  4. CS5265typec转HDMI2.0方案说明书|Capstone CS5265typec转HDMI4K60HZ单转电路|瑞奇达CS5265typec拓展坞设计

    一.CS5265总概 Capstone CS5265 USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出.嵌入式微控制器(MCU)基于工业标准8 ...

  5. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  6. 线性基(Linear Basis)学习笔记

    前言 我看网络上没有什么非常系统的教学,可能是我太菜了吧,现在才学,做个记录给自己看. 简略介绍 一个数集能两两异或,能表出许多新的数. 线性基是一个集合,能够在记录最少的数的基础上,表示出一个等价的 ...

  7. .NET 微服务——CI/CD(3):镜像自动分发

    如何通过Jenkins完成镜像分发?基本做法是:打包镜像→上传镜像到仓库→脚本分发.镜像仓库也有很多,比如docker hub.Harbor等,今天这一篇讲一下基于阿里云镜像仓库的操作. 首先,准备一 ...

  8. VMware_win10能ping通虚拟机ip,虚拟机ping不通win10ip的解决方法

    一.虚拟机设置为桥接模式 二.修改虚拟机linux的ip 查看win10的ip和网关 使用ifconfig查看网卡名,并在 /etc/sysconfig/network-scripts/目录修改对应的 ...

  9. MySQL约束和数据类型

    约束条件 约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期. 常用约束条件如下: UNSIGNED :无符号,值从0开始,无负数 ZEROFILL:零填充,当数据的显示长度不够的时候 ...

  10. 利用 Maven 创建 Docker 镜像并且推送到私有注册中心

    利用 Maven 命令生成项目框架 mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darchetype ...