洛谷 P4396 [AHOI2013]作业(莫队+值域分块)

2023-10-14 10:30

本文主要是介绍洛谷 P4396 [AHOI2013]作业(莫队+值域分块),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

抱歉,一开始读错题了

由于最后统计 [a,b] 中有多少数出现过,以及位于 [a,b] 内的数值个数

由于这两个是相关联的,所以不好一起统计,所以采用暴力的方法,但是暴力一定超时,所以在这里使用分块

写分块的时候到底需要几个参数,首先对于非整块,vis[x] x出现的次数;对于整块 tag[x] x出现的次数,cnt[x] x 出现的种数

const int N=1e5+5;int n,m;int i,j,k;int a[N];struct Query {int l,r;int a,b;int id;void read(){ sdd(l,r); sdd(a,b); }}q[N];pii ans[N],now;int vis[N];int block,num,bel[N],tag[(int)1e3],cnt[(int)1e3];bool cmp(Query a,Query b)
{return bel[a.l]^bel[b.l]?a.l<b.l:a.r<b.r;
}   void build()
{block=sqrt(n); num=n/block;if(n%block)  num++;for(int i=1;i<=num;i++){int l=(i-1)*block+1,r=i*block;for(int j=l;j<=min(r,n);j++) bel[j]=i;}for(int i=1;i<=m;i++) q[i].id=i;sort(q+1,q+1+m,cmp);
}void add(int pos)
{int x=a[pos];if(!vis[x]) ++cnt[bel[x]];++vis[x]; ++tag[bel[x]];
}void del(int pos)
{int x=a[pos];--vis[x]; --tag[bel[x]];if(!vis[x]) --cnt[bel[x]];
}pii getans(int l,int r)
{pii now=mp(0,0);for(int i=l;i<=min(r,bel[l]*block);i++)if(vis[i]) now.fr+=vis[i],now.sc++;if(bel[l]-bel[r])for(int i=(bel[r]-1)*block+1;i<=r;i++)if(vis[i]) now.fr+=vis[i],now.sc++;for(int i=bel[l]+1;i<bel[r];i++)if(tag[i]) now.fr+=tag[i],now.sc+=cnt[i];return now;
}signed main()
{//IOS;while(~sdd(n,m)){for(int i=1;i<=n;i++) sd(a[i]);for(int i=1;i<=m;i++) q[i].read();build();int l=1,r=0;for(int i=1;i<=m;i++){while(q[i].l<l) add(--l);while(q[i].r>r) add(++r);while(q[i].l>l) del(l++);while(q[i].r<r) del(r--);ans[q[i].id]=getans(q[i].a,q[i].b);}for(int i=1;i<=m;i++) printf("%d %d\n",ans[i].fr,ans[i].sc);}//PAUSE;return 0;
}

这篇关于洛谷 P4396 [AHOI2013]作业(莫队+值域分块)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209921

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP

2024.9.6 作业

1> 手写unique_ptr指针指针 #include <iostream>using namespace std;template <typename T>class my_unique_ptr{public:explicit my_unique_ptr(T *p = nullptr) noexcept // 构造函数{ptr = p;}~my_unique_ptr() noexcep

9月6号作业

1:.h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类

Flink实例(六十九): flink 作业提交(四)总结

独立集群提交 # 启动集群bin/start-cluster.sh# 提交job./bin/flink run ./examples/batch/WordCount.jar --input hdfs:/user/yuan/input/wc.count --output hdfs:/user/yuan/swwwttt yarn session # 启动集群./bin/

【#第三期实战营闯关作业 ## 茴香豆:企业级知识库问答工具】

今天学习了《 茴香豆:企业级知识库问答工具》这一课,对大模型的应用有了更深得认识。以下是记录本课实操过程及截图: 搭建茴香豆虚拟环境: 输入以下命令 ``studio-conda -o internlm-base -t huixiangdou 成功安装虚拟环境截图 安装茴香豆 cd /root 克隆代码仓库 git clone https://github.com/internlm/h