首页 > 其他分享 >Maximum Rating

Maximum Rating

时间:2024-10-14 19:43:34浏览次数:7  
标签:Rating return va int void Maximum Splay fa

  • 通过这道题,对Splay有了更深刻的理解
  • Splay的中序遍历代表当前序列,通过查询排名为i的点找到序列中的第i个数,这些信息是完全由Splay的结构提供的
  • 通过Splay的编号,我们则可以访问到原序列对应的节点
  • 其实这道题完全是可以用线段树做的,既然普通线段树不行,那不妨用权值线段树实现【顺序自动机】
  • 数据结构的程序很难通过一般的输出中间结果法调试,因为问题出现的时候往往不是问题产生的时候
  • 你常告诫自己“想清楚了再写代码“,可是这道题的思路难道不清楚吗?是的,思路很清楚,重要的是你该如何实现它呢?
  • 尝试了一种新的Splay树写法,即忽视相同的权值,使得节点的标号也能存储一定的信息

是一道典型的 转换题意->选择数据结构->码 的题目,也是“熟悉程序语法”到“合格竞赛选手”的门槛。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n,h[200005],root;
struct t1
{
	int fa,s[2];
	int va,size;
	long long sum;
	t1()
	{
		fa=s[0]=s[1]=0;
		va=size=sum=0;
	}
}t[200005];
bool get(int x)
{
	return x==t[t[x].fa].s[1];
}
void maintain(int x)
{
	t[x].sum=t[t[x].s[0]].sum+t[t[x].s[1]].sum+t[x].va;
	t[x].size=t[t[x].s[0]].size+t[t[x].s[1]].size+1;
}
void rotate(int x)
{
	int y=t[x].fa,z=t[y].fa,opt=get(x);
	t[y].s[opt]=t[x].s[opt^1];
	if(t[x].s[opt^1])
	{
		t[t[x].s[opt^1]].fa=y;
	}
	t[x].s[opt^1]=y;
	t[y].fa=x;
	t[x].fa=z;
	if(z)
	{
		t[z].s[y==t[z].s[1]]=x;
	}
	maintain(y);
	maintain(x);
}
void update(int x)
{
	maintain(x);
	if(t[x].fa)
	{
		update(t[x].fa);
	}
}
void Splay(int x,int k)
{
	update(x);
	while(t[x].fa!=k)
	{
		int y=t[x].fa,z=t[y].fa;
		if(z!=k)
		{
			if(get(x)==get(y))
			{
				rotate(y);
			}
			else
			{
				rotate(x);
			}
		}
		rotate(x);
	}
	if(!k)
	{
		root=x;
	}
}
void output(int p)
{
	if(!p)
	{
		return;
	}
	output(t[p].s[0]);
	cout<<" "<<t[p].va;
	output(t[p].s[1]);
}
int rnk(int p,int va)
{
	if(t[t[p].s[0]].size==va-1)
	{
		return p;
	}
	else if(t[t[p].s[0]].size<va-1)
	{
		return rnk(t[p].s[1],va-t[t[p].s[0]].size-1);
	}
	else
	{
		return rnk(t[p].s[0],va);
	}
}
long long ask(int p)
{
	Splay(rnk(root,1),0);
	Splay(rnk(root,p+2),rnk(root,1));
	return t[t[rnk(root,p+2)].s[0]].sum;
}
void insert(int x)
{
	int p=root;
	while(p)
	{
		if(t[x].va>t[p].va)
		{
			if(!t[p].s[1])
			{
				t[p].s[1]=x;
				t[x].fa=p;
				Splay(x,0);
				return;
			}
			p=t[p].s[1];
		}
		else
		{
			if(!t[p].s[0])
			{
				t[p].s[0]=x;
				t[x].fa=p;
				Splay(x,0);
				return;
			}
			p=t[p].s[0];
		}
	}
}
int pre()
{
	int cur=t[root].s[0];
	while(t[cur].s[1])
	{
		cur=t[cur].s[1];
	}
	Splay(cur,0);
	return cur;
}
int merge(int x,int y)
{
	if(!x)
	{
		return y;
	}
	if(!y)
	{
		return x;
	}
	int p=pre();
	t[p].s[1]=y;
	t[y].fa=p;
	maintain(p);
	return p;
}
void clear(int x)
{
	t[x].fa=t[x].s[0]=t[x].s[1]=t[x].sum=t[x].size=0;
}
void erase(int x)
{
	Splay(x,0);
	t[t[x].s[0]].fa=t[t[x].s[1]].fa=0;
	root=merge(t[x].s[0],t[x].s[1]);
	clear(x);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int q,maxn=0;
	cin>>n>>q;
	t[1].va=INT_MIN;
	t[n+2].va=INT_MAX;
	t[1].s[1]=n+2;
	t[n+2].fa=1;
	maintain(n+2);
	maintain(1);
	root=1;
	h[1]=1;
	for(int i=2;i<=n+1;i++)
	{
		cin>>t[i].va;
		insert(i);
		h[i]=i;
		maxn+=(t[i].va>0);
	}
	auto check=[](int p)
	{
		return ask(p)<=0;	
	};
	for(int i=1;i<=q;i++)
	{
		int x,v;
		cin>>x>>v;
		maxn-=(t[x+1].va>0);
		maxn+=(v>0);
		t[x+1].va=v;
		erase(x+1);
		insert(x+1);
		int p=partition_point(h+1,h+n+1,check)-h;
		int minn=n+1-p;
		cout<<maxn-minn+1<<"\n"; 
	}
	return 0;
}

标签:Rating,return,va,int,void,Maximum,Splay,fa
From: https://www.cnblogs.com/watersail/p/18449704

相关文章

  • 题解 QOJ5048【[ECFinal19K] All Pair Maximum Flow】
    题目描述给你一个\(n\)个点\(m\)条边的图,它是平面上的正\(n\)边形和一些对角线,节点按逆时针方向编号为\(1\)到\(n\)。对角线只可能在节点处相交。每条边有一个容量,求每个点对之间的最大流的和。\(n\leq200000,m\leq400000\)。solution做法每次找出边权最小的边\(......
  • CS 259 Accelerating Convolutional Neural Network
    Fall2024CS259Lab1AcceleratingConvolutionalNeuralNetwork(CNN)onFPGAsusingMerlinCompilerDueOctober911:59pmDescriptionYourtaskistoacceleratethecomputationoftwolayersinaconvolutionalneuralnetwork(CNN)usingahigh-levelsynt......
  • 帝国CMS建立模型字段报错:Row size too large. The maximum row size for the
    在帝国CMS中建立模型字段时,如果字段过多或单个字段过长,可能会遇到MySQL报错“Rowsizetoolarge”。这个错误是因为MySQL表的最大行大小限制为65535字节(不包括BLOB和TEXT类型字段)。解决这个问题的方法是将一些字段转换为TEXT或BLOB类型。解决方案分析现有字段......
  • #1118 - Row size too large. The maximum row size for the used table type, not co
    这个问题表示在MySQL中,表的一行数据大小超过了最大限制65535字节。这通常是因为表中的某些字段过长导致的。下面是一些解决方法:调整字段类型:将一些较大的字段改为TEXT或BLOB类型。这些类型的存储方式不同于普通字段,可以避免占用过多的行内空间。拆分字段:如果某个字段包含多......
  • COMP3230 Principles of Operating Systems
    COMP3230PrinciplesofOperatingSystemsProgrammingAssignmentOneDuedate:Oct.17,2024,at23:59Total13points–ReleaseCandidateVersion2ProgrammingExercise–ImplementaLLMChatbotInterfaceObjectivesAnassessmenttaskrelatedto......
  • “Celebrating National Day: A Glorious Chapter“
    Thewindofgoldenautumnbringsdelicatefragrance.Thechrysanthemumsinfrostofferbloomingbeautyforaseason.Kissingtheafterglowofthesettingsun,loveoverflowsfromgentleeyes.Lookingatthepeacefulfieldsallaround,passionfliesintov......
  • 文献阅读笔记|合成医学图像数据综述|Generating Synthetic Data for Medical Imaging
    论文链接:https://doi.org/10.1148/radiol.232471论文信息:GeneratingSyntheticDataforMedicalImaging,综述,2023年9月14日投稿,2024年3月1日接收,2024年9月10日发表于Radiology蓝色字体标注对我而言的新知识目录绪论需求决定合成数据的应用合成数据应具备的特点合成图像的应用1......
  • COMP2240/COMP6240 - Operating Systems
    Schoolof InformationandPhysicalSciencesCOMP2240/COMP6240-OperatingSystemsAssignment2(15%)SubmitusingCanvasby 11:59pm,Friday27th September2024Tasks:Problem 1,and2arebothCOMP2240& COMP6240 students.Problem3isonlyfor COMP6......
  • 为何生成静态页的时候或者上传附件过程中有报错:Maximum execution time of 30 seconds
    错误信息 Maximumexecutiontimeof30secondsexceeded 表明PHP脚本的执行时间超过了服务器设定的最大执行时间限制。这通常发生在生成静态页面或上传大文件等耗时较长的操作中。解决方案方法一:修改 php.ini 文件找到 php.ini 文件:通常 php.ini 文件位于服务......
  • COMPSCI 340  Operating System
    COMPSCI340 S2 2024Assignment 215%ofyour gradeDuedate: 11:59 pm Friday 20th SeptemberTotal– 15 marksIntroductionThisassignmentisdivided intothreeparts:1.  Thefirstpartofthisassignmentservesasanintroductiontouserspace......