题目描述

$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模拟测试]:购物(柯朵莉树)的更多相关文章

  1. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  2. [Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)

    无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机 ...

  3. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  4. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

  5. 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)

    传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...

  6. 洛谷P2082 区间覆盖(加强版)(珂朵莉树)

    传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...

  7. 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)

    传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...

  8. CF915E Physical Education Lessons(珂朵莉树)

    中文题面 据说正解是动态开点线段树而且标记也不难下传的样子 然而这种区间推平的题目还是喜欢写珂朵莉树啊……码量小…… 虽然真要构造的话随便卡…… //minamoto #include<cstd ...

  9. CF896C Willem, Chtholly and Seniorious(珂朵莉树)

    中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下(逃 //minamoto #include<bits/stdc++.h> #define ...

随机推荐

  1. Nginx 的root和 alias

    nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alia ...

  2. python 元组及操作

    # 元组是'不可变'的 list 使用小括号 创建后不允许修改 # 创建# t = ('a','b','c',1,2,3)# print(t)# print(type(t))# # 3# print( ...

  3. 最长上升子序列(LIS) Medium2

    JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two ...

  4. 多线程测试工具groboutils的使用

    一直使用junit做为服务测试框架,感觉不错.最近有人反映在高并发的情况下,存在服务调不到.无奈再次打开单元测试模拟高并发的 情况,却发现junit不支持并发测试      引入groboutils ...

  5. SPA(单页面应用)和MPA(多页面应用)

    话不多说,直接看图,一目了然

  6. tab栏切换效果运用案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Django中常用字段

    一.Django框架的常用字段 Django ORM 常用字段和参数 常用字段 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列 ...

  8. MySQL数据类型和约束条件

    一.数据库操作数据的存储引擎 INNODB:支持事务 行锁 外键 查询速度比MYSiam慢 但是保证了数据的安全性 5.1 版本之后 MYSIAM:老版本用 5.1版本之前 搜索速度快 不支持事务 没 ...

  9. JavaEE高级-Struts2学习笔记

    Struts2是一个用来来发MVC应用的框架,它提供了Web应用程序开发过程中一些常见问题的解决方案: - 对来自用户的输入数据进行合法的验证 - 统一的布局 - 可扩展性. - 国际化和本地化 - ...

  10. PC端网站微信扫码登录

    需求分析:用户通过扫描我们网页的二维码,如果已经绑定我们平台的账户,即成功进入首页,否则提示先绑定个人微信账号. 1.绑定微信账号:是通过关注微信公众号实现绑定个人微信账号.首先通过后台接口获取到ti ...