首页 > 其他分享 >CF1089K King Kog's Reception 题解

CF1089K King Kog's Reception 题解

时间:2023-11-05 13:45:10浏览次数:45  
标签:rt King maxx CF1089K 题解 ll tree le 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,CF1089K,题解,ll,tree,le,sum
From: https://www.cnblogs.com/The-Shadow-Dragon/p/17810442.html

相关文章

  • [ABC327G] Many Good Tuple Problems 题解
    题意对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在所有可......
  • CF1721A Image题解
    转裁自我的洛谷博客:https://www.luogu.com.cn/blog/653832/Code-of-CF1721A-Image题意简述给你一个2×2的矩阵,每次可以将一个或两个字母变成任意的其他字母,问最少用几步能将矩阵中的字母变成一样的。思路可以先分类讨论可能会出现的情况(如下表)。根据1,2,3列可得出暴力做法,即......
  • VM安装RedHat7虚机ens33网络不显示IP问题解决
    1、今天在VMware中安装RedHat7.4虚拟机,网络连接使用的是NAT连接方式,刚开始安装成功之后输入ifconfig还能看到ens33自动分配的IP地址,但是当虚机关机重启后,再查看IP发现原来的ens33网络已经没有了,只变成了这两个:然后输入ipa查看网卡信息发现出现了下面的信息:ens33:<BROADCA......
  • B3610 [图论与代数结构 801] 无向图的块 题解
    题目传送门前言本题解内容均摘自我的Tarjan学习笔记。解法Tarjan与无向图无向图与割点(割顶)在一个无向图中,不存在横叉边(因为边是双向的)。一个无向图中,可能不止存在一个割点。割点(割顶):在一个无向图中,若删除节点\(x\)以及所有与\(x\)相关联的边之后,图将会被分......
  • postman读取不到文件This file isn't in your working directory问题的解决方法
    遇到问题使用postman发起请求时,看到感叹号提示,具体信息如下:Thisfileisn'tinyourworkingdirectory.Teammatesyousharethisrequestwithwon'tbeabletousethisfile.TomakecollaborationeasieryoucansetupyourworkingdirectoryinSettings.解决方法进......
  • NEFU OJ Problem1356 帽儿山奇怪的棋盘 题解
    帽儿山奇怪的棋盘题目:TimeLimit:1000ms|MemoryLimit:65535KDescription军哥来到了帽儿山,发现有两位神人在顶上对弈。棋盘长成下图的模样:每个点都有一个编号:由上到下,由左到右,依次编号为1、2……12。两位神人轮流博弈,每一轮操作的一方可以取走一个棋子,或者取走相邻的两......
  • T392582 我有抑郁症【题解】
    题目描述要求有多少个序列满足:令\(v=1\simn\)从\(v\)号点开始,走到\(p_v\),…,最后走回\(v\)记录每个点被走到的次数(起点算,终点不算,反正只算一次)\(i\)号点走到的次数恰好是\(i\)答案对\(998,244,353\)取模Solution首先,一个点有一个出边,这个图为什么一定可以走回......
  • 【洛谷 P1085】[NOIP2004 普及组] 不高兴的津津 题解(打擂台法)
    [NOIP2004普及组]不高兴的津津题目描述津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因......
  • [题解]AT_abc222_f [ABC222F] Expensive Expense
    板子题,模拟赛场切了。思路线段树换根板子题。因为需要求每一个点的答案,所以定义\(dp_i\)表示以\(i\)为根的最长距离。考虑将一个点\(v\)转化为根,树的形态会发生什么变化(假设\(v\)的父亲节点是\(u\))。发现在\(v\)子树中的节点,距离都会减少\(w_{u\tov}\),其它节点......
  • 跨域问题解决办法
    跨域问题及解决#xss:跨站脚本攻击,cors:跨域资源共享,csrf:跨站请求伪造#1同源策略:请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.#2CORS:跨域资源共享,允许不同的域来我的服务器拿数据#3CORS请求分成两类:简单请求(simplerequest)和非简单请求(no......