首页 > 其他分享 >P10633 BZOJ2989 数列/BZOJ4170 极光 题解

P10633 BZOJ2989 数列/BZOJ4170 极光 题解

时间:2024-08-15 15:27:19浏览次数:8  
标签:cnt ++ 题解 mid P10633 int add pd BZOJ2989

题目传送门

前置知识

CDQ 分治 | 权值树状数组及应用 | 曼哈顿距离与切比雪夫距离的相互转化

解法

增加一维为时间戳,那么操作 \(1\) 等价于单点加。

曼哈顿距离直接跑 CDQ 分治,貌似不太可做,考虑转化为切比雪夫距离。

  • 原曼哈顿坐标系中的点 \((x_{1},y_{1}),(x_{2},y_{2})\) 间的距离等价于切比雪夫坐标系中的 \((x_{1}+y_{1},x_{1}-y_{1}),(x_{2}+y_{2},x_{2}-y_{2})\)。
  • 即 \(|x_{1}-x_{2}|+|y_{1}-y_{2}|=\max(|x_{1}+y_{1}-x_{2}-y_{2}|,|x_{1}-y_{1}-x_{2}+y_{2}|)\),将左边的绝对值展开并进行归纳即可证明。

题意转化为求以 \((x,a_{x})\) 为中心的以 \(2k\) 为边长的正方形内点的个数,同 luogu P4390 [BalkanOI2007] Mokia 摩基亚 二维数点维护即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct node
{
	int t,x,y,pd,val,id;
	bool operator < (const node &another) const
	{
		return (x==another.x)?((y==another.y)?(pd>another.pd):(y<another.y)):(x<another.x);
	}
}a[500010],tmp[500010];
int ans[500010],y[500010],b[500010],cnt=0,q_cnt=0;
void add(int t,int x,int y,int pd,int val,int id)
{
	cnt++;
	a[cnt].t=t;
	a[cnt].x=x;
	a[cnt].y=y;
	a[cnt].pd=pd;
	a[cnt].val=val;
	a[cnt].id=id;
}
struct BIT
{
	int c[500010];
	int lowbit(int x)
	{
		return (x&(-x));
	}
	void add(int n,int x,int val)
	{
		for(int i=x;i<=n;i+=lowbit(i))
		{
			c[i]+=val;
		}
	}
	int getsum(int x)
	{
		int ans=0;
		for(int i=x;i>=1;i-=lowbit(i))
		{
			ans+=c[i];
		}
		return ans;
	}
}T;
void cdq(int l,int r,int k)
{
	if(l==r)
	{
		return;
	}
	int mid=(l+r)/2,x,y;
	cdq(l,mid,k);
	cdq(mid+1,r,k);
	sort(a+l,a+mid+1);
	sort(a+mid+1,a+r+1);
	for(x=l,y=mid+1;y<=r;y++)
	{
		for(;a[x].x<=a[y].x&&x<=mid;x++)
		{
			T.add(k,a[x].y,a[x].pd);
		}
		ans[a[y].id]+=a[y].val*T.getsum(a[y].y);
	}
	x--;
	for(int i=l;i<=x;i++)
	{
		T.add(k,a[i].y,-a[i].pd);
	}
}
int main()
{
	int n,m,x,k,i;
	string pd;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		cin>>y[i];
		add(0,i+y[i],i-y[i],1,0,0);
		b[0]++;
		b[b[0]]=i-y[i];
	}
	for(i=1;i<=m;i++)
	{
		cin>>pd;
		if(pd=="Modify")
		{
			cin>>x;
			cin>>y[x];
			add(i,x+y[x],x-y[x],1,0,0);
			b[0]++;
			b[b[0]]=x-y[x];
		}
		else
		{
			cin>>x>>k;
			q_cnt++;
			add(i,x+y[x]+k,x-y[x]+k,0,1,q_cnt);
			b[0]++;
			b[b[0]]=x-y[x]+k;
			add(i,x+y[x]-k-1,x-y[x]+k,0,-1,q_cnt);
			b[0]++;
			b[b[0]]=x-y[x]+k;
			add(i,x+y[x]+k,x-y[x]-k-1,0,-1,q_cnt);
			b[0]++;
			b[b[0]]=x-y[x]-k-1;
			add(i,x+y[x]-k-1,x-y[x]-k-1,0,1,q_cnt);
			b[0]++;
			b[b[0]]=x-y[x]-k-1;
		}
	}
	sort(b+1,b+1+b[0]);
	b[0]=unique(b+1,b+1+b[0])-(b+1);
	for(i=1;i<=cnt;i++)
	{	
		a[i].y=lower_bound(b+1,b+1+b[0],a[i].y)-b;
	}
	cdq(1,cnt,b[0]);
	for(i=1;i<=q_cnt;i++)
	{
		cout<<ans[i]<<endl;
	}
	return 0;
}

标签:cnt,++,题解,mid,P10633,int,add,pd,BZOJ2989
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18361045

相关文章

  • Ubuntu中编译使用ANTs(医学图像配准)含github无法访问问题解决
    目录第一步、修改hosts文件1.打开https://github.com.ipaddress.com/ 2.打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo3.打开hosts文件,并在文件末尾添加如下内容 第二步、编译ANTs1)首先安装git、cmake以及c++编译器2)编译3)配置bin目录,......
  • 【题解】CF - 823C : Coin Troubles
    原题传送门题目大意有\(N\)种硬币,两种硬币的面值可能相同。给定\(q\)个限制,第\(i\)个限制由\(b_i\)和\(c_i\)组成,表示第\(b_i\)种硬币的数量严格大于第\(c_i\)种硬币的数量,且每个\(b_i\)与\(c_i\)都是唯一的。问在满足所有限制的情况下,有多少种可能的方案,能组......
  • Django 数据库迁移:makemigrations 和 migrate 命令详解及常见问题解决
    目录1.问题所示2.pythonmanage.pymakemigrations3.pythonmanage.pymigrate4.拓展1.问题所示最初始的状态是遇到这个问题由于刚开始跑pythonweb项目,开源项目附带的Readme,个别命令不太懂,对此详细研究其基本知识最终的解决方案如下:清理迁移文件:删除迁移目......
  • 大模型面试题库精华:100道经典问题解析
    ↓推荐关注↓算法暑期实习机会快结束了,校招大考即将来袭。当前就业环境已不再是那个双向奔赴时代了。求职者在变多,岗位在变少,要求还更高了。最近,我们陆续整理了很多大厂的面试题,帮助网友解惑答疑和职业规划,分享了面试中的那些弯弯绕绕。喜欢本文记得收藏、关注、点赞,更......
  • Ubunto 24.04 下 Docker Desktop 打开无反应问题解决和原因
    背景系统环境:Ubuntu24.04LTSDocker版本:Dockerversion26.1.4问题表象:打开DockerDesktop之后,无任何反应,使用命令行直接运行DockerDesktop,提示:runningundersystemd解决方案命令行执行如下指令$sudosysctl-wkernel.apparmor_restrict_unprivileged_userns=0$......
  • 【题解】 对决
    题目描述【题目描述】已知n个人(编号为1..n)进行了m轮对决,且给出这m轮对决的结果。请根据这m轮对决的结果,计算出可以确定多少人的最终排名。【输入格式】第一行两个整数n,m表示总共有n个人,m场对决.以下m行,每行两个整数ai,bi,表示ai号的人战胜了bi号的人.......
  • CF1530D Secret Santa 题解
    ProblemSolution每个人初始不会给自己送礼物。如果每人要送礼的人都不一样,答案即为\(n\)。如果有两个或以上的人要送给同一个人礼物,假设有\(x\)个人要给同一个人送礼物,那么必有\(x-1\)个人要更改送礼的人,并将礼物送个\(x-1\)个没有礼物收的人。然而这样送礼物可能会导......
  • Coin Troubles题解(dp,拓扑序)
    CoinTroubles题解(dp,拓扑序)题目链接:https://codeforces.com/problemset/problem/283/C题意:有\(n\)种硬币,每种硬币都有一个价格\(ai\),现在有\(q\)个限制,每个限制会告诉你\((b,c)\),并要求\(b\)种硬币的数量严格大于\(c\)种硬币的数量。现在问你一共有多少种买硬币的方法,使得最后......
  • 【题解】CF - 859C : Pie Rules
    原题传送门题目大意:给定一个长为\(N(1\leqN\leq50)\)的序列,Bob和Alice轮流从序列的最前端进行以下操作之一:取出序列最前端的数,并将其加到自己的分数中;取出序列最前端的数,将其加到对方的分数中,则下一轮可继续操作。两人轮流操作直到序列被取完,分数多的一方获胜。若......
  • 暑期模拟赛题解
    暑期模拟赛题解CSP-J模拟赛2024.7.5CSP-J模拟赛1T1简单二分,判断即可。T2\(60pts\)的状压是好写的。至于\(100pts\),考虑dp状态的合并,由于\(m\)的级别很小,考虑对后\(m\)个数状压,考察满足条件的情况。dp难以优化的时候考察本质相同的状态。T3数据范围显......