[ZJOI2007]报表统计(链表法+set)
problem
洛谷链接
solution
纯纯不理解要搬用平衡树的那些做法,使我们可可爱爱的链表不香不好写吗??
众所周知,链表法是可以进行删除和增加的,只需要维护每个点的前驱和后继。
相邻两个的差绝对值的最小值,用 set\text{set}set 维护这个绝对值差即可,每次增点时把原来的先删掉再加上新的。
任选两个数的差的绝对值更简单,直接扔进一个 set\text{set}set 然后每次新加点的时候,就 lower_bound()
求前后继,全局取 min\text{min}min 即可。
由于值可能相同,所以我们用 multiset\text{multiset}multiset 就行了。
非常小清新啊!
code
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000005
multiset < int > s1, s2;
int n, m, ans = 0x3f3f3f3f;
int a[maxn], g[maxn], lst[maxn], nxt[maxn];int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a[i] );g[i] = i;if( i > 1 ) lst[i] = i - 1;if( i < n ) nxt[i] = i + 1;if( i > 1 ) s1.insert( fabs( a[i] - a[i - 1] ) );s2.insert( a[i] );auto it = s2.lower_bound( a[i] );auto l = it, r = it;if( it != s2.begin() ) ans = min( ans, a[i] - *(--l) );if( (++r) != s2.end() ) ans = min( ans, *r - a[i] );}int cnt = n;for( int i = 1;i <= m;i ++ ) {char op[10]; int x, k;scanf( "%s", op );if( op[0] == 'I' ) {scanf( "%d %d", &x, &k );a[++ cnt] = k;s1.erase( s1.find( fabs( a[g[x]] - a[nxt[g[x]]] ) ) );lst[nxt[g[x]]] = cnt;lst[cnt] = g[x];nxt[cnt] = nxt[g[x]];nxt[g[x]] = cnt;g[x] = cnt;s1.insert( fabs( k - a[lst[cnt]] ) );s1.insert( fabs( k - a[nxt[cnt]] ) );s2.insert( k );auto it = s2.lower_bound( k );auto l = it, r = it;if( it != s2.begin() ) ans = min( ans, k - *(--l) );if( (++r) != s2.end() ) ans = min( ans, *r - k );}else if( op[4] == 'G' ) printf( "%d\n", *s1.begin() );else printf( "%d\n", ans );}return 0;
}
[ZJOI2007]报表统计(链表法+set)相关推荐
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- bzoj 1058: [ZJOI2007]报表统计(set+multiset)
1058: [ZJOI2007]报表统计 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 3774 Solved: 1284 [Submit][St ...
- bzoj 1058: [ZJOI2007]报表统计
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...
- P1110 [ZJOI2007]报表统计
题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一张报表实际上是维护一个非负整数数列,并 ...
- BZOJ1058 [ZJOI2007]报表统计 set
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1058.html 题目传送门 - BZOJ1058 题解 考虑用两个 multiset 分别维护两个答案 ...
- BZOJ1058 ZJOI2007 报表统计 线段树+平衡树
题意:给定一个序列,维护:1.插入一个元素 2.求相邻两个元素中,差值绝对值的最小值 3.求序列排序后相邻两个元素中,差值绝对值的最小值 题解: MIN_GAP:如果我们把数看成一组一组,每次插入 ...
- bzoj1058: [ZJOI2007]报表统计
哈哈set卡时过了. set求前驱的方法:*--b.lower_bound(x) (想想写了splay的肉老师就很愉悦啊) 弄两个set,一个记录的是位置的值,一个是差值,MIN_SORT_GAP就很 ...
- Luogu P1110 [ZJOI2007]报表统计 multiset
沿用了学长的$multiset$ 然后这道题可以看到我的程序中有两行注释,它在我看来和他们下面的代码没区别,但是我们发现,C++会先调用后面的参数,所以$--it$会被先执行 ... ... ... ...
最新文章
- 4.0 C++远征:重载运算符
- 工作后,拉开你和同龄人差距的,不是出身,不是努力,而是……
- 从计算机移到u盘如何加快速度,我的电脑移动文件到U盘里时进度很慢很慢,怎么让它变快?...
- 快速入门cocos2d-x jsbinding
- python学习笔记(七)——类基础
- Http / Put 和 Post 区别
- 浙江省计算机二级excel函数,浙江省计算机二级excel练习5操作要求
- Python type函数和isinstance函数区别 - Python零基础入门教程
- 玩转Redis集群(下)
- Discretized Streams (DStreams)离散化流
- 一文搞懂C++强制类型转换
- C++之实现优先队列
- android 设置超时时间,为android requestSingleUpdate设置超时
- oracle in table类型,Oracle Built-in Data Types(Oracle内置数据类型)
- solidworks分析视频教程-结构应力仿真有限元虚拟样机及流场分析
- c++ time_t和tm
- H5前端开源框架收藏
- 三大变换与自控(五)三角函数的正交性证明
- 用 MeGUI 压制 BDrip
- 信号(signal,kill,raise)
热门文章
- 卸载wrapt_[python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project...
- 密封槽设计标准_哈尔滨轴承 | 超全面机械密封选型
- java字符串拼接例子_Java详解【String】+【StringBuilder vs StringBuffer】+【字符串拼接】...
- python如何使用geotools_基于GeoTools实现道路结点的提取
- android平板 useragent,移动端适配 user-Agent
- 计算机算法音乐专业,音乐信号分析算法的乐理简说(非音乐专业的乐理)
- tcp unity 图片_用 Unity 做个游戏(七) - TCP Socket 客户端
- [C++11]指针空值类型nullptr
- C++ class实现顺序队列(完整代码)
- AcWing 1015. 摘花生