首页 > 其他分享 >SDOI/SXOI 2022

SDOI/SXOI 2022

时间:2024-07-24 18:52:38浏览次数:17  
标签:ch SDOI ++ SXOI else int maxn vec 2022

我记得当年好像 vp 过这场,但是他质量真的好高。


整数序列

数据范围很诈骗,但 poly log 做法思考无果还是指引我们来想 sqrt 做法。

首先有一个很暴力的 \(O(cnt_x+cnt_y)\) 的做法。看到和出现次数有关则可以想根号分治。我们设定一个阈值 \(B\),对于两者都 \(<B\) 的部分可以暴力做,都大于 \(B\) 的部分也可以暴力做,因为这样的最多只会有 \(n^2/B\) 次计算。

然后思考一大一小,容易发现两者顺序无关,不妨设 \(cnt_x>cnt_y\)。

那么容易想到 \(x\) 中有很多是不必要的部分。实际上只有 \(y\) 中每个极长元素段在 \(x\) 中的相同长度的前驱和后继才是必要的。然而还有一个问题就是这样不合法的情况有可能变合法,那么我们不妨再放入一段前驱的前驱段。这样就把 \(x\) 的长度变得和 \(y\) 同阶了。

总的预处理复杂度变为 \(O(\frac{n^2}{B})\),总复杂度 \(O(\frac{n^2}{B}+qB)\),取 \(B=\frac{n}{\sqrt{q}}\) 即可得到 \(O(n\sqrt{q})\)。

实现细节可以考虑离线询问,然后预处理前驱后继,全部归并排序后再去重。

#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define MP make_pair
#define F first
#define S second
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
template<typename T>
void read(T &x){
	T sgn=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')sgn=-1;
	for(x=0;isdigit(ch);ch=getchar())x=x*10+ch-'0';
	x*=sgn;
}
int n,m,a[maxn],b[maxn],num;
int B,pre[maxn],nxt[maxn],len;
int d[maxn],e[maxn],f[maxn],g[maxn];
vector<int>vec[maxn];
vector<pii>qry[maxn];
ll s1[maxn],s2[maxn],mp[maxn];
pii c[maxn];
bool vis[maxn],mark[maxn],zz[maxn];
map<pii,ll> ans;
ll Ans[maxn];
ll BF(){
	ll now=-inf;
	vis[n]=1;mp[n]=0;
	for(int k=1;k<=len;k++){
		s1[k]=s1[k-1]+b[c[k].S];
		s2[k]=s2[k-1]+c[k].F;
		if(vis[s2[k]+n])now=max(now,s1[k]-mp[s2[k]+n]);
		if(!vis[s2[k]+n])mp[s2[k]+n]=s1[k],vis[s2[k]+n]=1;
		else mp[s2[k]+n]=min(mp[s2[k]+n],s1[k]);
	}
	vis[n]=0;
	for(int k=1;k<=len;k++)vis[s2[k]+n]=0;
	return now;
}
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++)read(a[i]),vec[a[i]].pb(i);
	for(int i=1;i<=n;i++)if(vec[i].size())num++;
	for(int i=1;i<=n;i++)read(b[i]);
	B=n/sqrt(m)+1;
	for(int i=1;i<=m;i++){
		int x,y;
		read(x);read(y);
		if(ans.find(MP(x,y))!=ans.end()){Ans[i]=ans[MP(x,y)];continue;};
		if(((int)vec[x].size()<B&&(int)vec[y].size()<B)||((int)vec[x].size()>=B&&(int)vec[y].size()>=B)){
			len=0;
			for(int p=0,q=0;p<(int)vec[x].size()||q<(int)vec[y].size();){
				if(p>=(int)vec[x].size())c[++len]=MP(-1,vec[y][q++]);
				else if(q>=(int)vec[y].size())c[++len]=MP(1,vec[x][p++]);
				else{
					if(vec[x][p]<vec[y][q])c[++len]=MP(1,vec[x][p++]);
					else c[++len]=MP(-1,vec[y][q++]);
				}
			}
			Ans[i]=ans[MP(x,y)]=ans[MP(y,x)]=BF();
		}else{
			if(vec[x].size()<vec[y].size())swap(x,y);
			qry[x].pb(MP(y,i));
		}
	}
	for(int i=1;i<=n;i++)if(qry[i].size()){
		for(int j:vec[i])mark[j]=1;
		for(int j=1;j<=n;j++){
			pre[j]=pre[j-1];
			if(mark[j-1])pre[j]=j-1;
		}
		nxt[n+1]=n+1;
		for(int j=n;j;j--){
			nxt[j]=nxt[j+1];
			if(mark[j+1])nxt[j]=j+1;
		}
		for(pii o:qry[i]){
			int j=o.F;
			if(ans.find(MP(i,j))!=ans.end()){
				Ans[o.S]=ans[MP(i,j)];
				continue;
			}
			len=0;
			int u=0,v=0,w=0,tmp=0;
			for(int k:vec[j]){
				if(nxt[k]<=n){
					if(nxt[k]>tmp)d[++u]=tmp=nxt[k];
					else if(nxt[tmp]<=n)d[++u]=tmp=nxt[tmp];
				}
			}
			tmp=n+1;
			for(int l=(int)vec[j].size()-1;~l;l--){
				int k=vec[j][l];
				if(pre[k]){
					if(pre[k]<tmp)e[++v]=tmp=pre[k];
					else if(pre[tmp])e[++v]=tmp=pre[tmp];
					if(pre[tmp])e[++v]=tmp=pre[tmp];
				}
			}
			reverse(e+1,e+1+v);
			for(int p=1,q=1;p<=u||q<=v;){
				if(p>u)f[++w]=e[q++];
				else if(q>v)f[++w]=d[p++];
				else{
					if(d[p]<e[q])f[++w]=d[p++];
					else f[++w]=e[q++];
				}
			}
			for(int p=1,q=0;p<=w||q<(int)vec[j].size();){
				if(p>w)g[++len]=vec[j][q++];
				else if(q>=(int)vec[j].size())g[++len]=f[p++];
				else{
					if(f[p]<vec[j][q])g[++len]=f[p++];
					else g[++len]=vec[j][q++];
				}
			}
			tmp=len;len=0;
			for(int k=1;k<=tmp;k++){
				if(g[k]!=g[len])g[++len]=g[k];
			}
			for(int k=1;k<=len;k++){
				c[k].F=a[g[k]]==i?1:-1;
				c[k].S=g[k];
			}
			Ans[o.S]=ans[MP(i,j)]=ans[MP(j,i)]=BF();
			for(int k=1;k<=len;k++)if(a[c[k].S]==i)zz[c[k].S]=0;
		}
		for(int j:vec[i])mark[j]=0;
	}
	for(int i=1;i<=m;i++)printf("%lld\n",Ans[i]);
	return 0;
}

进制转换

标签:ch,SDOI,++,SXOI,else,int,maxn,vec,2022
From: https://www.cnblogs.com/zcr-blog/p/18321490/SDOI-SXOI-2022

相关文章

  • VS2022 安装.NET4.5目标包
    转载自https://www.cnblogs.com/Stay627/p/15549958.html[VS2022安装.NET4.5目标包]众所周知VS2022将不再支持.NET4.5,即使在VisualStudioInstaller中也找不到.NET4.5的选项在不改变项目结构的情况下,要么选择继续使用VS2019,当然博主已经卸掉了,那么还有什么方法呢?我们可以......
  • 记录下Visual Studio 2022配置mysql
    visualstudio能够连接mysql只需要以下几步即可寻找mysql安装路径,如果你没有选择默认在C盘下ProgramFiles下mysql文件夹里,找到include和lib文件夹,分别复制路径。我们接下来来到visualstudio中,右键项目选择properties再将刚才复制的include跟lib的路径添加到Include......
  • VS2022无法启动程序
    win11专业版23h2在安装VS2022时会遇到以下问题以下就是正确的操作方法1.首先打开VS022的install 2.点击修改 3.选择单个组件 4.找到Windows11SDK(10.0.26100.0)安装好之后就可以正常的编写c/c++代码了 ......
  • [SDOI2012] 走迷宫 题解
    [SDOI2012]走迷宫题目描述Morenan被困在了一个迷宫里。迷宫可以视为\(n\)个点\(m\)条边的有向图,其中Morenan处于起点\(s\),迷宫的终点设为\(t\)。可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的有向边,到达另一个点。这样,Morenan走的步数可能......
  • 踩坑记录:windows11下使用 VS2022 和 PCL1.14.1 配置点云开发环境
    闲话不多说,具体在windows下下载PCL与解压pcl可以看https://www.yuque.com/huangzhongqing/pcl/这位大佬的文章,那我就具体说一下踩过点坑:踩坑点1:按照大佬的文章的步骤进行解压与下载,我的PCL环境下在了K盘中,但是最后不知怎么的我的openni2文件夹下在了C盘里,也就是说3rdparty文件夹......
  • [CCPC2022 广东] XOR Sum
    数位dp看到这样求和价值的计算,考虑可不可以交换求和符号或者改变计算方式。这题中的位运算使我们考虑按位计算贡献,价值可以写成:\[f(A)=\sum_{i=0}2^i\timesc_i\times(k-c_i)\]其中\(c_i\)表示第\(i\)位上为\(1\)的\(a_i\)数量。题目第二个要求即\(f(A)=n\)。考......
  • [SDOI2011] 拦截导弹
    这是CDQ分治优化1D/1D动态规划的模板题(1D/1D动态规划的概念见OI-wiki)一般来说,优化的1D/1D/动态规划,在转移的时候是由不等式作为条件的,所以可以像这样转化为三维偏序用线段树进行如下维护:1.维护区间最大值2.查询区间最大值的某一数组的和代码见下(一定要学会将数组翻转的操作)#......
  • 在VS2022中通过Nuget将vcpkg环境集成/卸载到c++项目
    在VS2022中通过Nuget将vcpkg环境集成/卸载到c++项目vcpkg是微软和C++社区维护的免费开源C/C++包管理器。利用它,可以一条命令编译安装用户所需的库;提供CMake配置文件;并且对于Windows开发者,在VisualStudio中集成后还可以自动链接静态库,非常方便易用。一般而言,开发者仅需要......
  • Windows Server 2022 中文版、英文版下载 (updated Jul 2024)
    WindowsServer2022中文版、英文版下载(updatedJul2024)WindowsServer2022x64,Version21H2请访问原文链接:https://sysin.org/blog/windows-server-2022/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org此次发布更新了什么?答:版本号,当然还有…2021.09.01更......
  • 关于idea2022的内置的DataGrip……
    设置(物理)外键步骤——————企业不禁止/推荐使用选中表——》modifytable…… 选中foreignkey——》new——》foreignkey 填充数据———员工表tb_emp中dept_id关联职位表tb_dept中的id上边的——name:tb_emp_fk_dept_id外键名称(似乎不许与键......