首页 > 其他分享 >C240817D. 模拟赛:树上dp(以i为起点)+set操作

C240817D. 模拟赛:树上dp(以i为起点)+set操作

时间:2024-08-17 15:48:24浏览次数:13  
标签:tmp set return val int C240817D tr dp

C240817D. 模拟赛

比较显然的树上dp, 但是维护set比较烦

考场上其实自己是定义 \(f[i]\) 是以 \(i\) 结尾, 然后这样的话单次更新根本做不到 \(O(logN)\).

反应实在是太迟钝了,考场想“如果有一种只更新一条链的dp就好了”

结果完全没想到只需变成以 \(i\) 开头就行了.

积累经验吧。不要气馁。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
#define int ll
using namespace std;
using ll = long long;
const int N = 1e6+5,ninf = -0x3f3f3f3f3f3f3f3f;
int n,f[N]; //f[i]:以 i 为开头的答案 
multiset<int,greater<int>> tr[N];
void insert(int x,int val){
	if(tr[x].size() && *tr[x].begin() >= val){
		tr[x].emplace(val);
		return ;		
	} tr[x].emplace(val);
	while(x){
		if(tr[x].empty()) return ;
		int tmp;
		if(x*2<1000000) tmp = max(f[x*2], f[x*2+1]) + *tr[x].begin();
		else tmp = *tr[x].begin();
		if(tmp<=f[x]) return; 
		if(f[x] != 0) tr[0].erase(f[x]);
		f[x] = max(0ll,tmp);
		if(f[x] != 0) tr[0].insert(f[x]);
		x>>=1;
	}
}
void del(int x,int val){
	if(tr[x].size() && *tr[x].begin() != val){
		tr[x].erase(val);
		return ;
	} tr[x].erase(val);
	while(x){
		if(tr[x].empty()){
			if(f[x] != 0) tr[0].erase(f[x]);
			f[x] = 0;
		}
		else{
			int tmp;
			if(x*2>1000000) tmp = *tr[x].begin();
			else tmp = max(f[x*2], f[x*2+1]) + *tr[x].begin();
			if(tmp == f[x]) return ;
			if(f[x] != 0) tr[0].erase(f[x]);
			f[x] = max(0ll,tmp);
			if(f[x]!=0) tr[0].insert(f[x]);
		}x>>=1;			
	}
} 
signed main(){
//	freopen("prob.in","r",stdin);freopen("prob.out","w",stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n;
	tr[0].emplace(0);
	while(n--){
		int op,p,b;
		cin>>op>>p>>b;
		if(op==1) insert(p,b);
		else del(p,b);
		cout<<*tr[0].begin()<<"\n";
	}
	return 0;
}
/*		
	T
	n,m,k,st
	u,v,w
	think twice, code once.
	check your code:
	array memory
	testing sentence 
*/

标签:tmp,set,return,val,int,C240817D,tr,dp
From: https://www.cnblogs.com/superl61/p/18364513

相关文章

  • locale: Cannot set LC_CTYPE to default locale: No such file or directory locale:
    locale:CannotsetLC_CTYPEtodefaultlocale:Nosuchfileordirectorylocale:CannotsetLC_MESSAGEStodefaultlocale:Nosuchfileordirectorylocale:CannotsetLC_COLLATEtodefaultlocale:Nosuchfileordirectory 一、CannotsetLC_CTYPEtodefaul......
  • 浅谈TCP协议、UDP协议
    一、介绍说明TCP(传输控制协议)面向连接:TCP在数据传输之前必须建立连接。这通过一个称为三次握手的过程来完成,确保连接的两端都准备好进行数据传输。可靠性:TCP提供可靠的数据传输,确保数据包正确无误地到达目的地。如果数据包在传输过程中丢失或损坏,TCP会重新发送这些数据包......
  • Dataset and DataLoader
    刘二大人_第八节课代码:importmatplotlib.pyplotaspltimporttorchimportnumpyasnpfromtorch.utils.dataimportDataset#抽象类,不可实例化fromtorch.utils.dataimportDataLoader#helpusloadingdatainPyTorchimportosos.environ["KMP_DUPLICATE_LI......
  • 换根dp
    大致步骤 换根dp大致步骤 方法一:(up数组)(1)g[i]以i为根的子树(不是整棵树),由孩子节点推过来(2)up[i]i节点往上走的最大属性(3)f[i]整棵树(不是子树)记录一些值 方法二:加减法(1)g[i]以i为根的子树(不是整棵树),由孩子节点推过来(2)f[i]整棵树(不是子树)记录一......
  • 元素偏移(offset,scroll,client)介绍,动态设置类名
    文章目录一offset,scroll,client简单介绍二、scroll系列1scrollWidth2scrollHeight3scrollTop4scrollLeft三、offset系列1.offsetHeight2.offsetWidth3.offsetTop4.offsetLeft四client系列1clientTop2clientLeft3clientWidth4clientHeight五案例1动态设置......
  • TCP/UDP网络聊天室
        本博客仅对网络聊天室项目进行分享,仅供学习讨论使用,欢迎大家讨论。UDP网络聊天室项目要求        利用UDP协议,实现一套聊天室软件。服务器端记录客户端的地址,客户端发送消息后,服务器群发给各个客户端软件,服务器也可以自己发送通知给所有客户端。  ......
  • 【网络】UDP回显服务器和客户端的构造,以及连接流程
    回显服务器(EchoServer)最简单的客户端服务器程序,不涉及到业务流程,只是对与API的用法做演示客户端发送什么样的请求,服务器就返回什么样的响应,没有任何业务逻辑,没有进行任何计算或者处理0.构造方法网络编程必须要使用网卡,就需要用到Socket对象创建一个DatagramS......
  • 巨大的数(dp+矩阵加速)
    第3题   巨大的数 查看测评数据信息小明定义了一种生成大数的函数f[n],他的含义是将1-n所有的正整数按照从小到大拼接起来,形成一个巨大的数,例如f[13]=12345678910111213,现在给定一个数n,输出f[n]%m的值,其中n和m都是正整数输入格式 第一行两个整数n,m部分数据:1<=n<=......
  • map和set的封装用红黑树
    1.iterator迭代器迭代器。迭代器的作用——容器的类型有很多种但是不是每一个容器的取值方式都是一样的。比如说list是箭头->和解引用*的方式,string则是通过方括号的方式访问的。所以为了统一的访问这些容器所以我们就设置出了迭代器。统一用一种方式这里是,箭头->和解引用*的......
  • 抛硬币(概率dp)
    https://www.luogu.com.cn/problem/AT_dp_i第1题   抛硬币 查看测评数据信息有n个质地不均匀的硬币,抛第i枚硬币器正面朝上的概率是p[i],反面朝上的概率是1-p[i],扔完n个硬币后,求正面朝上的个数大于反面朝上的概率是多少。结果保留三位小数输入格式 第一行一个整数n,......