[CSP-S模拟测试]:购物(柯朵莉树)
题目描述
$visit_world$有一个商店,商店里卖$N$个商品,第$i$个的价格为$a[i]$我们称一个正整数$K$是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间$[K,2K]$中。
问:有多少个美妙的数。
输入格式
第一行一个整数$N$。
接下来一行$N$个整数,描述数组$a[]$。
输出格式
输出一行一个整数,表示答案。
样例
样例输入:
3
1 2 3
样例输出:
6
数据范围与提示
样例解释:
可以证明$1\leqslant K\leqslant 6$都是美妙的,除此之外的数都不是美妙的。
数据范围:
子任务$1$($30$分):$N\leqslant 100,a_i\leqslant 100$。
子任务$2$($20$分):$N\leqslant 100000,a_i\leqslant 20$。
子任务$3$($20$分):$N\leqslant 3,a_i\leqslant 10^9$。
子任务$4$($30$分):$N\leqslant 10^5,a_i\leqslant 10^9$。
题解
正解不会,今天刚学柯朵莉树,于是就打了它(可惜考试的时候并不会……)
基本上就是一道柯朵莉树的板子题,不妨就拿它来讲一下柯朵莉树吧~
柯朵莉树的原理很简单,就是不断往里面添加区间,添加完之后再进行合并(有交集的两个区间合并),用$set$维护这些区间就好了。
来讲几个细节:
$\alpha.$添加区间的时候,如果要同时添加多个区间(比如这道题),需要先枚举$set$里所有的原区间,生成新的区间并将这些区间放到$vector$里,如果直接放进去会造成死循环(当然也是错的)。
$\beta.$合并时与前一个区间比较,会更方便处理(细节看代码)。
$\gamma.$合并之后注意$it$指针的位置,可以用二分查找……
时间复杂度:$\Theta(n\log\log n)$(随机数据)。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int N;
int a[100001];
set<pair<int,long long>>s;
vector<pair<int,long long>>v;
long long ans;
void add(int x)
{
for(auto it=s.begin();it!=s.end();it++)
v.push_back(make_pair((*it).first+x,(*it).second+2*x));
while(v.size())
{
s.insert(v.back());
v.pop_back();
}
}
void split()
{
for(auto it=s.begin();;)
{
auto ti=it;it++;
if(it==s.end())break;
if((*ti).second>=(*it).first)
{
pair<int,long long> flag=make_pair((*ti).first,(*it).second);
s.erase(it);s.erase(ti);s.insert(flag);
it=s.lower_bound(flag);
}
}
}
int main()
{
scanf("%d",&N);
s.insert(make_pair(0,0));
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
add(a[i]);
split();
}
for(auto it=s.begin();it!=s.end();it++)
{
if(!(*it).first)continue;
ans+=((*it).second+1)/2-((*it).first-1)/2;
}
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:购物(柯朵莉树)的更多相关文章
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- [Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)
无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机 ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- CF915E Physical Education Lessons(珂朵莉树)
中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...
- CF896C Willem, Chtholly and Seniorious(珂朵莉树)
中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...
随机推荐
- 红帽学习笔记[RHCSA] 第六课[进程、服务相关]
第六课 进程 进程:已经启动的可执行程序的运行中的实例.每个进程都有自己的地址空间,并占用了一定的系统资源. 如何产生一个进程 执行程序或命令 计划任务 在终端中对进程管理 运行一个前台进程 [roo ...
- CentOS7linux通过http配置共享自动创建yum源的shell脚本
因工作需要用到,所以记录一下配置流程 环境介绍: 两台CentOS7系统 yum源服务主节点IP:192.168.1.78 从节点IP:192.168.1.79(79从78上获取yum源) 配置78节 ...
- P1118 [USACO06FEB]数字三角形`Backward Digit Su`… (dfs)
https://www.luogu.org/problemnew/show/P1118 看的出来是个dfs 本来打算直接从下到上一顿搜索 但是不会 看了题解才知道系数是个杨辉三角....... 这样就 ...
- CentOS7 内核模块管理
1.查看所有模块:lsmod 2.查看指定模块的详细信息:modinfo 模块名 3.动态加载模块:modprobe 模块名 4.动态卸载模块:modprobe -r 模块名 5.开机自动加载模块:假 ...
- Java 14 可能带来什么新特性?
JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ...
- 数塔 Easy
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题 ...
- 4.css3文本属性
1.css3文本属性: ①Color:颜色. ②Text-align:文本水平对齐方式. ⑴Left默认值,right,center,justify两端对齐: ⑵新增start相当于left,end相 ...
- git init error:Malformed value for push.default: simple
git init error:Malformed value for push.default: simple 1.git config --global push.default matching
- python基础知识的入门介绍
一.什么是编程语言 任何词语都是一种高度的概括和总结,所以找关键字.如下: (1)1.什么是"语言":一个人与另一个人沟通的介质 2人将自己的思维逻辑和想法通过计算机能过识别的语言 ...
- 完整的node脚手架搭建服务
使用脚手架来搭建node服务,使用到了express架构,不熟悉的可以看下express官方文档:http://www.expressjs.com.cn/ 使用express直接生成服务的文档结构目录 ...