「AtCoder 1219」歴史の研究

给出 n 个整数 \(x_1, x_2, ...,x_n\) ,询问 [l, r] 中 max{\(x_k\times cnt_{x_k}\)}( \(cnt_i\) 表示 i 出现的次数)

Luogu

AtCoder

分析

回滚莫队裸题。

当然也可以用分块做,但我一开始打的分块,成功的只过了 4 个点......没调出来......

顺便贴一下官方题解,虽然是日文

歴史の研究

代码

回滚莫队

//=========================
//  author:hliwen
//  date:2020.1.17
//=========================
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100005
#define il inline
#define re register
#define DEBUG puts("ok")
#define tie0 cin.tie(0),cout.tie(0)
#define fastio ios::sync_with_stdio(false)
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
typedef long long ll;

template <typename T> inline void read(T &x) {
    T f = 1; x = 0; char c;
    for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;
    for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    x *= f;
}

int n, m, q, sz;
int bl[N], L[N], R[N], id[N], cnt[N], tot[N];
ll t[N], hs[N], ans[N];

struct query {
    int l, r, id;
    friend bool operator < (query x, query y) {
        return (bl[x.l] ^ bl[y.l]) ? bl[x.l] < bl[y.l] : x.r < y.r;
    }
} qy[N];

int main() {
    read(n), read(q);
    sz = sqrt(n);
    for (int i = 1; i <= n; ++i) {
        read(t[i]), hs[i] = t[i];
        bl[i] = (i - 1) / sz + 1;
    }
    m = bl[n];
    for (int i = 1; i <= m; ++i) {
        L[i] = (i - 1) * sz + 1;
        R[i] = i * sz;
    }
    sort(hs + 1, hs + 1 + n);
    int num = unique(hs + 1, hs + 1 + n) - hs - 1;
    for (int i = 1; i <= n; ++i)
        id[i] = lower_bound(hs + 1, hs + 1 + num, t[i]) - hs;
    for (int i = 1; i <= q; ++i) {
        read(qy[i].l), read(qy[i].r);
        qy[i].id = i;
    }
    sort(qy + 1, qy + 1 + q);
    int i = 1;
    for (int k = 0; k <= m; ++k) {
        int l = R[k] + 1, r = R[k];
        ll now = 0;
        memset(cnt, 0, sizeof cnt);
        for ( ; bl[qy[i].l] == k; ++i) {
            int ql = qy[i].l, qr =qy[i].r;
            ll tmp = 0;
            if (bl[ql] == bl[qr]) {
                for (int j = ql; j <= qr; ++j) tot[id[j]] = 0;
                for (int j = ql; j <= qr; ++j) {
                    ++tot[id[j]];
                    tmp = max(tmp, 1ll * tot[id[j]] * t[j]);
                }
                ans[qy[i].id] = tmp;
            }
            else {
                while (r < qr) {
                    ++cnt[id[++r]];
                    now = max(now, 1ll * cnt[id[r]] * t[r]);
                }
                tmp = now;
                while (l > ql) {
                    ++cnt[id[--l]];
                    now = max(now, 1ll * cnt[id[l]] * t[l]);
                }
                ans[qy[i].id] = now;
                while (l < R[k] + 1) --cnt[id[l++]];
                now = tmp;
            }
        }
    }
    for (int i = 1; i <= q; ++i) printf("%lld\n", ans[i]);
    return 0;
}

官方正解

#include<stdio.h>
#include<vector>
#include<algorithm>
#define SQ 100
/*

bucket size: 100

*/
using namespace std;
int c[110000];
int d[110000];
int z[110000];
vector<int>v[110000];
long long e[110000];
long long f[3000][3000];
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    for(int i=0;i<a;i++)scanf("%d",c+i);
    for(int i=0;i<a;i++){
        z[i]=c[i];
    }
    std::sort(z,z+a);
    for(int i=0;i<a;i++){
        d[i]=lower_bound(z,z+a,c[i])-z;
        v[d[i]].push_back(i);
    }
    for(int i=0;i<a/SQ;i++){
        for(int j=0;j<a;j++)e[j]=0LL;
        long long val=0LL;
        for(int j=i*SQ;j<=a;j++){
            if(j%SQ==0){
                f[i][j/SQ]=val;
            }
            e[d[j]]+=z[d[j]];
            val=max(val,e[d[j]]);
        }
    }
    for(int i=0;i<b;i++){
        int p,q;
        scanf("%d%d",&p,&q);
        p--;
        long long ret=f[(p+SQ-1)/SQ][q/SQ];
        for(int j=p;j%SQ;j++){
            ret=max(ret,(long long)z[d[j]]*(lower_bound(v[d[j]].begin(),v[d[j]].end(),q)-lower_bound(v[d[j]].begin(),v[d[j]].end(),p)));
        }
        for(int j=q-1;(j+1)%SQ;j--){
            ret=max(ret,(long long)z[d[j]]*(lower_bound(v[d[j]].begin(),v[d[j]].end(),q)-lower_bound(v[d[j]].begin(),v[d[j]].end(),p)));
        }
        printf("%lld\n",ret);
    }
}

我的错误分块代码

Code

原文地址:https://www.cnblogs.com/hlw1/p/12207564.html

时间: 2024-10-01 05:50:36

「AtCoder 1219」歴史の研究的相关文章

AT1219 歴史の研究(回滚莫队)

题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi?表示,Xi?越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 选择日记中连续的一些天作为分析的时间段 事件种类t的重要度为t*(这段时间内重要度为t的事件数) 计算出所有

AT1219 歴史の研究

题意 关于回滚莫队见这篇博客. code: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+10; const int maxt=350; int n,Q,t,num,block,nowl,nowr; int a[maxn],b[maxn],L[maxt],R[maxt],pos[maxn],cnt[maxn],tmpcnt[maxn]; ll nowans; ll an

3D高科技投影 麦可「复活登台」幕后

美国告示牌音乐颁奖典礼,日前在赌城盛大举行,主办单位利用高科技投影技术,让麦可杰克森「复活」登台表演,3D全像投影,加上影片与真人舞群无缝接轨,高科技让过世的大明星彷佛活了过来. 流行乐天王麦可杰克森死而复生,过世将近5年的他,又现身在今年美国告示牌音乐颁奖典礼上,金光闪闪现身舞台中央,麦可杰克森回来了,再现招牌的动感舞步,流露巨星风采,主办单位利用3D全像摄影技术,秘密制作了半年多,把他带回到世人眼前. 特效专家:「观众在告示牌典礼上看到的是,麦可的头部数字影像,连接到一名演员身上,我们实时捕

「ZigBee模块」协议栈-Z-Stack协议栈基础和数据传输实验

花了好久写的...感觉还不错的呢...如果看,请细看...Mua~ Z-Stack协议栈基础和数据传输实验 一.实验目的 终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来.串口优化把有线串口传输改为无线蓝牙传输. 二.实验平台 硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块 软件:实验基于SampleApp工程进行. 三.实验步骤 串口初始化代码 发送部分代码 接收部分代码 四.协议栈基础 做实验之前先了解一点关于协议栈的基础知识

「豆瓣时间」

变着花样,「豆瓣时间」的广告页已经在豆瓣App上轮播了一周.豆瓣er们被雨果.普希金.菏尔德林等大师邀请了那么多天,终于在今天见到这档付费音频节目的真面目. 今天是2017年3月7日,距分答上线近一年,距喜马拉雅FM“123知识狂欢节”过去3个月.如今,罗胖正在炮制概念的路上狂奔,知乎已然形成付费矩阵,科技媒体Pro版遍地开花. 以文艺青年为主要用户群的豆瓣,却还是秉持“慢工出细活”的态度,除了原创+打赏的标配功能,去年最大的动作就是阿北宣布要进军影业.虽然每个行为都指向内容,但都没真正涉及支付

深度 | 邢波教授谈人工智能科学路径:为人工智能装上「无穷动」引擎

深度 | 邢波教授谈人工智能科学路径:为人工智能装上「无穷动」引擎 本文由邢波教授 授权转载 微信公众号:猫匣子 作者:邢波 有些人是因为对人工智能的原理不理解而导致,有些人是为了个人名望而宣扬人工智能威胁论,有些人则是为了商业的利益推动人工智能威胁论.——Yann LeCun   人工智能算法本身这个计算任务像登山,它是有明确的目标的,可以用数学描述和比较的目标,它本身有弹性.容错性.随机性.和客观的量化的可评估性 … 人工智能功能的提升和突破来源于理论模型,算法,和计算引擎的不断创新,缺一不

「知乎」上那些神回答

1.你收到的最雷的表白语是什么?做我女朋友行不行,行就行,不行我再想想办法.—— 知友:程冬冬 2.“晚来天欲雪,能饮一杯无”,怎么回复比较霸气?司机一行酒,亲人两行泪.—— 知友:鼓鼓 3.「滚床单」有哪些优雅的叫法?管鲍之交.—— 知友:匿名用户 4.为什么中国人这么喜欢拍古装片?科幻片面临的最大问题是,在未来时空还要不要党的领导?—— 知友:magasa 5.暧昧是什么?暧昧=爱日未日.—— 知友:苑小帅 6.女朋友和女性朋友有什么区别?中国人取名字有一个习惯:实际上缺什么,一定要在名字里

七招助力企业在「应用经济」中获竞争优势

当前随着大量公司转型为软件驱动型企业,以更快速度将高质量应用推向市场已成为最关键的差异化元素之一.日前,CA Technologies 委托进行一项名为应用经济 「Application Economy」 中竞争优势之战的全球性研究.结果显示,43%的受访者认为,成为软件驱动型企业已是当前关键竞争优势,该比例较3年前增长了78%. 在「应用经济」中,企业竞争战略的重点包括更加敏捷,以及更快地走向市场.在调查中,一些受访对象已开始接受更先进的软件战略.他们认为,这样的转变将对决策时间产生明显的影响

《iOS「通告机制」及由其引出的对「架构模式」、「设计模式」的理解

说明:为了区别「本地通知」与「推送通知」这两种iOS中提醒用户,可见的「通知」,本文所将Notification翻译为「通告」.它们的详细区别,可参考<iOS开发系列--通知与消息机制>一文. 实践遇到的问题: 最近在维护公司的一个项目中,遇到这样一个报错:-[GlobalManager addAlbum:]: unrecognized selector sent to instance 经排查,原因如下:以前同事在利用「通告机制」在GlobalManager类中把「自己/self」注册为「观