「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. matplotlib 高阶之Transformations Tutorial

    目录 Data coordinates Axes coordinates Blended transformations 混合坐标系统 plotting in physical units 使用off ...

  2. matplotlib 进阶之Legend guide

    目录 matplotlib.pyplot.legend 方法1自动检测 方法2为现有的Artist添加 方3显示添加图例 控制图例的输入 为一类Artist设置图例 Legend 的位置 loc, b ...

  3. [opencv]KAZE、AKAZE特征检测、匹配与对象查找

    AkAZE是KAZE的加速版 与SIFT,SUFR比较: 1.更加稳定 2.非线性尺度空间 3.AKAZE速度更加快 4.比较新的算法,只有Opencv新的版本才可以用 AKAZE局部匹配介绍 1.A ...

  4. MongoDB分片集群机制及原理

    1. MongoDB常见的部署架构 * 单机版 * 复制集 * 分片集群 2. 为什么要使用分片集群 * 数据容量日益增大,访问性能日渐下降,怎么破? * 新品上线异常火爆,如何支撑更多用户并发? * ...

  5. String 既然能做性能调优,我直呼内行

    码哥,String 还能优化啥?你是不是框我? 莫慌,今天给大家见识一下不一样的 String,从根上拿捏直达 G 点. 并且码哥分享一个例子:通过性能调优我们能实现百兆内存轻松存储几十 G 数据. ...

  6. select 1 from 是什么意思?有什么作用?

    参考:https://www.douban.com/note/518373959/ 一.select 1 from 的作用1.select 1 from mytable 与 select anycol ...

  7. Linux的六种查找命令

    http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html 1. find fi ...

  8. 详谈 Java工厂 ---工厂方法模式

    1.前言 有个场景,消费者需要付钱,有可能是使用支付宝.微信.银行卡,那么该怎么选择呢? 是不是想到了使用用if else判断?还是使用switch? 一个地方这样写还好,如果有很多这样的业务,难道都 ...

  9. TestNG 运行Webdriver测试用例

    1.单击选中的新建工程的名称,按Ctrl+N组合键,弹出对话框选择"TestNG"下的"TestNG class"选项,点击"next" 2 ...

  10. kafka学习笔记(七)kafka的状态机模块

    概述 这一篇随笔介绍kafka的状态机模块,Kafka 源码中有很多状态机和管理器,比如之前我们学过的 Controller 通道管理器 ControllerChannelManager.处理 Con ...