首页 > 其他分享 >P9801 [NERC2018] King Kog’s Reception

P9801 [NERC2018] King Kog’s Reception

时间:2023-11-05 13:45:26浏览次数:29  
标签:rt King maxx le ll NERC2018 tree Reception sum

题目传送门

前置知识

线段树

解法

第一眼感觉和 luogu P1083 [NOIP2012 提高组] 借教室 很像。本题同样采用线段树维护,\(sum_{l,r}(1 \le l \le r \le 10^6)\) 表示从 \(l \sim r\) 时刻内骑士拜访的总时间,\(maxx_{l,r}(1 \le l \le r \le 10^6)\) 表示从 \(l \sim r\) 时刻内骑士拜访完的最后时间。

build 函数和普通线段树一样。

update 函数和普通单点修改一样。

pushup 函数是本题一个难点。考虑对于从 \(l \sim r(1 \le l \le r \le 10^6)\) 时刻,如果左区间 \(l \sim mid\) 时刻骑士拜访完的最后时间大于右区间 \(mid+1 \sim r\) 时刻的起始点,则右区间 \(mid+1 \sim r\) 时刻内所有骑士拜访均要向后推迟,即 tree[rt].maxx=max(tree[lson(rt)].maxx+tree[rson(rt)].sum,tree[rson(rt)].maxx);

query 函数同理,查询时需要额外记录左区间 \(l \sim mid\) 时刻骑士拜访完的最后时间,对于最终时间时需要取 \(\max\),即 max(tree[rt].maxx,tree[rt].sum+maxxx);。最终答案即为最终时间减去起始拜访时间。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long//本题需要开 long long 
#define sort stable_sort 
#define endl '\n'
ll t[400000],d[400000],ans=0;
struct SegmentTree
{
	ll l,r,sum,maxx;
}tree[5000000];
ll lson(ll x)
{
	return x*2;
}
ll rson(ll x)
{
	return x*2+1;
}
void pushup(ll rt)
{
	tree[rt].sum=tree[lson(rt)].sum+tree[rson(rt)].sum;
	tree[rt].maxx=max(tree[lson(rt)].maxx+tree[rson(rt)].sum,tree[rson(rt)].maxx);
}
void build(ll rt,ll l,ll r)
{
	tree[rt].l=l;
	tree[rt].r=r;
	if(l==r)
	{
		tree[rt].maxx=tree[rt].sum=0;
		return;
	}
	ll mid=(l+r)/2;
	build(lson(rt),l,mid);
	build(rson(rt),mid+1,r);
	pushup(rt);
}
void update(ll rt,ll pos,ll val)
{
	if(tree[rt].l==tree[rt].r)
	{
		tree[rt].sum=val;
		tree[rt].maxx=tree[rt].l+val;
		return;
	}
	else
	{
		ll mid=(tree[rt].l+tree[rt].r)/2;
		if(pos<=mid)
		{
			update(lson(rt),pos,val);
		}
		else
		{
			update(rson(rt),pos,val);
		}
	}
	pushup(rt);
}
ll query(ll rt,ll l,ll r,ll maxxx)
{
	if(l<=tree[rt].l&&tree[rt].r<=r)
	{
		return max(tree[rt].maxx,tree[rt].sum+maxxx);
	}
	else
	{
		ll mid=(tree[rt].l+tree[rt].r)/2;
		if(l<=mid)
		{
			ans=max(ans,query(lson(rt),l,r,maxxx));
		}
		if(mid<r)
		{
			ans=max(ans,query(rson(rt),l,r,ans));
		}
		return ans;
	}
}
int main()
{
	ll q,n,i,val;
	char pd;
	cin>>q;
	build(1,1,1000000);
	for(i=1;i<=q;i++)
	{
		cin>>pd;
		if(pd=='+')
		{
			cin>>t[i]>>d[i];
			update(1,t[i],d[i]);//因为第i位骑士访谈的时间是t[i]到t[i]+d[i]
		}
		if(pd=='-')
		{	
			cin>>val;
			update(1,t[val],0);
		}
		if(pd=='?')
		{
			cin>>val;
			ans=0;
			cout<<max(0ll,query(1,1,val,ans)-val)<<endl;
		}
	}
	return 0;
} 

后记

双倍经验:P9801 | CF1089K

标签:rt,King,maxx,le,ll,NERC2018,tree,Reception,sum
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17810441.html

相关文章

  • CF1089K King Kog's Reception 题解
    题目传送门前置知识线段树解法第一眼感觉和luoguP1083[NOIP2012提高组]借教室很像。本题同样采用线段树维护,\(sum_{l,r}(1\lel\ler\le10^6)\)表示从\(l\simr\)时刻内骑士拜访的总时间,\(maxx_{l,r}(1\lel\ler\le10^6)\)表示从\(l\simr\)时刻内骑士......
  • postman读取不到文件This file isn't in your working directory问题的解决方法
    遇到问题使用postman发起请求时,看到感叹号提示,具体信息如下:Thisfileisn'tinyourworkingdirectory.Teammatesyousharethisrequestwithwon'tbeabletousethisfile.TomakecollaborationeasieryoucansetupyourworkingdirectoryinSettings.解决方法进......
  • Skywalking介绍
    微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的技术栈有不同的开源实现。 ScreenShot2022-01-23at12.48.19PM.png今天主要介绍Skywalking,数据链路追踪,主要的资料来源于网上的教程。链......
  • BlockingQueue---SynchronousQueue
    概述A{@linkplainBlockingQueueblockingqueue}inwhicheachinsertoperationmustwaitforacorrespondingremoveoperationbyanotherthread,andviceversa.Asynchronousqueuedoesnothaveanyinternalcapacity,notevenacapacityofone.......
  • kingbase初始化报错
    [zjh@hs-10-20-30-193Server]$rm-rfdata[zjh@hs-10-20-30-193Server]$./bin/initdb-DdataThefilesbelongingtothisdatabasesystemwillbeownedbyuser"zjh".Thisusermustalsoowntheserverprocess.Thedatabaseclusterwillbeinitializ......
  • E. Tracking Segments
    E.TrackingSegments题目大意:给一个全为零的数组,m次询问区间,q次修改,定义一个区间中的1个数严格大于0个数为漂亮,问在第几次修改后出现了第一个完美区间。思路:对修改次数进行二分,利用前缀和判断区间中的1个数,时间复杂度为$mlog(q)$codeintn,m;intb[N];vector<pii>a;bo......
  • Docker_报错:Host key for 47.116.79.175 has changed and you have requested strict
    Hostkeyfor47.116.79.175haschangedandyouhaverequestedstrictchecking.Hostkeyverificationfailed. 问题原因用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(publickey)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公......
  • PostgreSQL(kingbaseES) 中,可以使用 unnest 函数将一个包含多个值的字符串分割成多行
    在PostgreSQL中,您可以使用unnest函数将一个包含多个值的字符串分割成多行。unnest函数将一个数组(或者像我们的情况下是由STRING_TO_ARRAY函数生成的数组)展开为多行数据。假设您有一个表my_table,其中包含一个名为my_column的字符串列,其内容如下:my_column-----------......
  • Skywalking仪表盘简介
    1、普通服务-->服务-->c4i-smr-->Overview(服务概览) 2、普通服务-->服务-->c4i-smr-->Instance-->选择实例-->Overview(实例概览信息)3、普通服务-->服务-->c4i-smr-->Endpoint(端点信息) 4、普通服务-->服务-->c4i-smr-->Topology(拓扑图) 5、普通服务-->服......
  • centos7.9重启网卡提示Failed to start LSB: Bring up/down networking.
    前几天给一台机器状态centos7.9系统,设备有2个网口,今天重启网卡一直失败,查看network状态,怀疑是eth0网卡有问题查看eth0的网卡配置,发现是eth0网卡的BOOTPROTO=dhcp,且ONBOOT=yes,但eth0网口没插网线,这导致重启网卡时,一直重启eth0,但是没插网线一直失败。解决方案:把eth0网卡的ONB......