C240817D. 模拟赛:树上dp(以i为起点)+set操作
比较显然的树上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
*/
C240817D. 模拟赛:树上dp(以i为起点)+set操作的更多相关文章
- [10.18模拟赛] 序列 (DP)
[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...
- 模拟赛20181016 dp
给出1-n的序列插入一个bst: 给出T组询问,包含n,h分别代表点数为n,高度为h的树,求所有插入顺序的合法方案数,模1e9+7 样例输入 1 2 1 样例输出 2 #include<bit ...
- [8.16模拟赛] 玩具 (dp/字符串)
题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...
- 放棋游戏(NOIP模拟赛)(DP)
没有原题... 囧.. [问题描述] 游戏规则是这样,有n(1<=n<=100)行格子,第一行由n个格子,第二行有n-1个格子,第三行由n-2个格子,……以此类推,第n行有1个格子.要求再 ...
- 98: 模拟赛-神光 dp
$code$ #include <cstdio> #include <cstring> #include <algorithm> using namespace s ...
- NOIp模拟赛 现实(DP 拓扑)
题目来源:by lzz \(Description\) 给定一张有向图,求对于哪些点,删除它和它的所有连边后,图没有环. \(n\leq 5\times10^5,m\leq 10^6\). \(Sol ...
- 83: 模拟赛 树形dp
$des$ $sol$ 维护每个点的子树中的信息以及非子树的信息 $code$ #include <bits/stdc++.h> using namespace std; #define ...
- 7.1 NOI模拟赛 计数问题 dp
还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- 【2019.8.6 慈溪模拟赛 T3】集合(set)(线段树上DP)
线段树上\(DP\) 首先发现,每个数肯定是向自己的前驱或后继连边的. 则我们开一棵权值线段树,其中每一个节点记录一个\(f_{0/1,0/1}\),表示在这个区间左.右端点是否连过边的情况下,使这个 ...
随机推荐
- 一文教你如何用C代码解析一段网络数据包?【含代码】
本文的目的是通过随机截取的一段网络数据包,然后根据协议类型来解析出这段内存. 学习本文需要掌握的基础知识: 网络协议 C语言 Linux操作 抓包工具的使用 其中抓包工具的安装和使用见下文: < ...
- Atcoder ABC297 E-G
Atcoder ABC297 E-G E - Kth Takoyaki Set 链接: E - Kth Takoyaki Set 简要题意: 问题陈述 有 \(N\) 种章鱼烧出售.一个 \(i\) ...
- 【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
问题描述 使用标准版的Azure Logic App服务,可以创建多个工作流(workflow),如果在启用/禁用其它的工作流时,是否会对正在运行其它工作流造成影响呢? 问题解答 在实际的测验中,我们 ...
- 简单理解.net 依赖注入的三种方式
前言 :.NET5.0 于2020年11月10日正式发布,它是3.1之后的 .NET Core 的下一个主要版本.微软将这个新版本命名为 .NET 5.0 而不是 .NET Core 4.0,其原因有 ...
- csdn 下载券恶心之处
今天在csdn碰到一个恶心事,啥事呢?下载券.详细的说,就是人家码友把下载积分都设置成0了,让大家自行下载.结果,却不行,非得搞个下载券,得去做任务,给它的广告爹爹们点点任务才能获取下载券的code. ...
- 为什么C++ 单例局部static初始化是线程安全的?
为什么C++ 单例局部static初始化是线程安全的? const bg::AppSettings& bg::AppSettings::GetInstance() { static AppSe ...
- C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?
C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法.智能指针模板参数的第二个类型是删除器,一般是一个函数指针 ...
- sql查询死锁
--每秒死锁数量 SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Number of Deadlocksc% ...
- Azure – Front Door (AFD)
前言 会研究到 Azure Front Door (AFD) 是因为想安装 WAF. 结果研究了一圈, 发现 AFD 好弱啊. 有许多功能都有 limitation. Limitation & ...
- 阿里面试官常问的TCP和UDP,你真的弄懂了吗?
前 言 作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,面试的时候面试官也非常喜欢问一些协议相关的问题,其中有两个协议因为非常基础,出现的频率非常之高,分别是 "T ...