【树状数组】CF961E Tufurama

挺巧妙的数据结构题(不过据说这是一种套路?

E. Tufurama

One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series "Tufurama". He was pretty surprised when he got results only for season 7 episode 3 with his search query of "Watch Tufurama season 3 episode 7 online full hd free". This got Polycarp confused — what if he decides to rewatch the entire series someday and won't be able to find the right episodes to watch? Polycarp now wants to count the number of times he will be forced to search for an episode using some different method.

TV series have n seasons (numbered 1 through n), the i-th season has ai episodes (numbered 1 through ai). Polycarp thinks that if for some pair of integers x and y (x < y) exist both season x episode y and season y episode x then one of these search queries will include the wrong results. Help Polycarp to calculate the number of such pairs!

Input

The first line contains one integer n (1  ≤ n  ≤  2·10^5) — the number of seasons.

The second line contains n integers separated by space a1, a2, ..., an (1 ≤ ai ≤ 10^9) — number of episodes in each season.

Output

Print one integer — the number of pairs x and y (x < y) such that there exist both season x episode y and season y episode x.


题目大意

有一部电视剧有n季,每一季有ai集。定义二元组(i,j):存在第i季有第j集。求(i,j)与(j,i)合法(i<j)的对数。

真实题意就是:求<i,j>对数,使得a[i]≥j,a[j]≥i并且(i<j)


 看上去很可做的样子,对吧……

题目分析

基础的暴力

从1..n季,每一季都分别判断对答案的贡献。

例如对于 4 \n 3 5 1 2 ,依次检查(1,2)是否存在(2,1);(1,3)是否存在(3,1)……

首先发现a[i]对于答案的贡献最大也就是到n为止,那么读入时候先取个min(n)。

考虑一下check()是O(n)的,所以总复杂度是O(n²)的。

BIT做法

像很多其他题一样,对于这样的、关于元素大小关系之间的限制的题目,先排个序总是能够解决个一维限制掉去的。

我们使用一个结构体node x,x.i表示季数;x.a表示该季的集数。首先对x.a排序。那么就变成这个样子:

p[].a(j)  3  5  1  2
p[].i(i)  1  2  3  4
  |
  |
p[].a(j)  1  2  3  4 (取min之后)
p[].i(i)  3  4  1  2

先考虑每次的统计,那么只要ans+=query(a[i])就可以了。意思就是说ans加上1..a[i]季的贡献(其中每一季的贡献要么是0要么是1,但是由于之后会有修改,所以我们用BIT维护)

接着考虑修改,设立一个now指向当前最小合法的p[]。这个now用来更新那些已经 过气 没有贡献的答案。

这里「没有贡献的答案」指的是p[now].a<i的情况。说人话就是p[now]的电视剧集数太小了,已经不会再有贡献了,因此now++,判断下一个p[]是否可能会对答案有贡献。个人感觉有那么一点相似 单调队列 和 wqs二分 的情况(但是我不是非常清楚)?

为了去除这些没有贡献的季数的影响,我们只需将p[now].i位置在树状数组上-1即可。意思是说这个季数在之后的统计上都不会有贡献了。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long ans;
 4 int n,now,a[200035];
 5 struct node
 6 {
 7     int a,i;
 8     bool operator < (node &xx) const
 9     {
10         return a < xx.a;
11     }
12 }p[200035];
13 int f[200035];
14 int read()
15 {
16     char ch = getchar();int num = 0;
17     for (; !isdigit(ch); ch = getchar());
18     for (; isdigit(ch); ch = getchar())
19         num = (num<<3)+(num<<1)+ch-48;
20     return num;
21 }
22 int lowbit(int x){return x&-x;}
23 void add(int x, int c){for (; x<=n+1; x+=lowbit(x))f[x]+=c;}
24 int query(int x)
25 {
26     int ret = 0;
27     for (; x; x-=lowbit(x))
28         ret += f[x];
29     return ret;
30 }
31 int main()
32 {
33     n = read();now = 1;
34     for (int i=1; i<=n; i++)
35         a[i] = min(read(), n+1), p[i].a = a[i], p[i].i = i, add(i, 1);
36     sort(p+1, p+n+1);
37     for (int i=1; i<=n; i++)
38     {
39         while (now<=n && p[now].a < i)add(p[now++].i, -1);
40         ans += query(a[i]);
41         if (a[i] >= i)ans--;
42     }
43     cout << ans / 2 << endl;
44     return 0;
45 }

 

另附其他做法

其他人用BIT维护也挺巧妙的(但是我觉得初看时候有点云里雾里啊)

1.Educational Codeforces Round 41 E. Tufurama (961E)  BIT做法

2.Codeforces 961E - Tufurama 【树状数组】  BIT做法

3.Codeforces - 961E Tufurama  set+BIT

4.CF 961E Tufurama  跟我一样的

 

 

END

 

转载于:https://www.cnblogs.com/antiquality/p/8746718.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

取文字_把这4个字母输入word,会得到一段神秘文字,承载着一段历史

在英文的输入状态下&#xff0c;把“ rand()”输入word后&#xff0c;按下回车键&#xff0c;就会突然跳出一页文字把“ rand()”输入excel后&#xff0c;按下回车键&#xff0c;则会得到这样的结果&#xff0c;0.134582最后再把“ rand()”输入PPT&#xff0c;按下回车键&…

一文看懂数字孪生,工信部权威白皮书

来源&#xff1a;智东西11月11日消息&#xff0c;《由商务部、科技部、工信部、国家发改委、农业农村部、国家知识产权局、中国科学院、中国工程院等部委和深圳市人民政府共同举办的中国国际高新技术成果交易会正式开幕。作为大会主会场的重要组成部分&#xff0c;由工信部下属…

linux -- control service and daemon process

linux -- control service and daemon process 一、几个重要概念的讲解 1、systemd 系统启动和服务器进程由 systemd 系统和服务管理器进行管理 此程序提供一种方式&#xff0c;可以在启动时和运行中的系统上激活系统资源、服务器守护进程和其他进程 2、守护进程 守护进程是在执…

java 网页正文抽取算法_网页正文抽取算法 ContentExtractor

软件介绍简介ContentExtractor 是一个开源的网页正文抽取工具&#xff0c;用JAVA实现&#xff0c;具有非常高的抽取精度。算法ContentExtractor的网页正文抽取算法使用的是CEPR&#xff0c;适用于几乎所有的包含正文的网页。 算法简介&#xff1a;项目地址转移项目已和WebColle…

基于人工智能智商研究的智能定律初探

什么是智能和意识一直是智能科学领域最基础也是最具有争议的问题&#xff0c;2014年以来&#xff0c;我们在对人机通用智能发展水平的进行研究时提出了标准智能模型&#xff0c;统一描述人和智能机器的特征。在这个研究的基础上&#xff0c;2020年5月我们在《Annals of Data》发…

Postman----Presets(预先设置)的使用

使用场景&#xff1a; 当我们在进行接口测试post请求时&#xff0c;headers是必填项&#xff0c;我们将一个A接口的headers编写后测试完成&#xff0c;再次进行B接口的测试&#xff0c;需重新编写headers&#xff0c;为了简单操作&#xff0c;我们就用到了Presets。 Presets 作…

opengl 如何加阴影_OpenGL + Qt: 3 - 旋转动画和键盘操纵

前三篇链接&#xff1a;OpenGL Qt: 0 - 三角形绘制 OpenGL Qt: 1 - 用下拉框选颜色 OpenGL Qt: 2 - 走向3D&#xff0c;画正四面体 这一周笔者经历了漫长的洲际飞行和昏天黑地的倒时差&#xff0c;所以本篇内容相对少一些&#xff0c;侧重 Qt 而不是 OpenGL。在上一篇中&…

mybatis java类注解式_Spring整合Mybatis注解方式

Spring整合Mybatis(注解方式)环境准备jar包&#xff1a;Spring所需依赖&#xff1a;spring-context、spring-aspects、aspectjrt、aspectjweaver、spring-tx、spring-jdbcmybatis所需要&#xff1a;mybatis、mybatis-spring、mysql-connector-java、(druid、c3p0、HikariCP)辅助…

2020十大新兴技术揭晓!每一项都可能颠覆我们的生活

转自丨科技日报作者丨张佳欣编辑丨翟丽影全世界都在竞相研发新冠肺炎疫苗&#xff0c;前景令人鼓舞&#xff0c;我们可能会在破纪录的时间内研发出疫苗。但在未来新冠疫情仍在蔓延的情况下&#xff0c;技术能帮助我们更快地实现目标吗?世界经济论坛和《科学美国人》杂志本月10…

c#_导出table功能

一&#xff1a;第一张导出方法&#xff0c;简单快捷 请注意&#xff1a;一般表格都有真分页&#xff0c;查询数据时候注意把分页条件去掉#region 此处是获取的list数组 然后转table再调用ExportExcel var list"你的list数据库源"DataTable dt new DataTable();dt.…

java 协议处理器_协议处理器urlstreamhandler及contenthandler

先看段打开网页的代码&#xff1a;URL urlnew URL("http://souljava.blog.163.com/");URLConnection connectionurl.openConnection();connection.getInputStream();问题1&#xff1a;客户端浏览器怎么判断接受到的是什么数据类型&#xff1f;回答&#xff1a;java的…

自己做一个小项目python_【Python】第一个微信小项目

一、微信好友数据分析功能介绍1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式2.统计好友的地域分布&#xff0c;并且做成词云和可视化展示在地图上3.获取所有好友的头像&#xff0c;合并成一张大图二、需要的库1、Pyecharts&#xff1a;一个用于生成ech…

RISC-V的自定义CPU悖论

来源&#xff1a;内容编译自「eejournal」&#xff0c;谢谢。随着这些年的发展&#xff0c;RISC-V的受重视程度与与日俱增。这主要因为它是免费的、灵活的&#xff0c;并且速度很快。这使RISC-V成为许多开发人员的安全便捷选择。但是您会认为RISC-V是通用RISC处理器还是定制的随…

java计算加速减速_Javascript加速运动与减速运动

加速运动&#xff0c;即一个物体运动时速度越来越快&#xff1b;减速运动&#xff0c;即一个物体运动时速度越来越慢。现在用Javascript来模拟这两个效果&#xff0c;原理就是用setInterval或setTimeout动态改变一个元素与另外一个元素的距离&#xff0c;如xxx.style.left或xxx…

python 运维包_基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?

常规导入:import module_name[,module1,...]from module_name import [*|child[,child1,...]from module_name import [*|child[,child1,...] as alias_name注意: 导入语句可出现在程序任意位置,自定义包要实现from module_name import *的效果则此模块必须在__init__.py实现__…

华为宣布出售荣耀,声明来了

来源&#xff1a;澎湃新闻综合华为官网、《深圳特区报》今天&#xff0c;华为发表声明&#xff0c;整体出售荣耀业务资产。对于交割后的荣耀&#xff0c;华为不占有任何股份&#xff0c;也不参与经营管理与决策。11月17日一早&#xff0c;荣耀最终的出售方案公布。多家企业在《…

Node.js教程-mysql模块

概述 在Node.js中&#xff0c;mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接&#xff0c;然后可对数据进行增、删、改、查等操作。 安装 由于mysql模块不是Node.js内置模块&#xff0c;需手动安装 npm i mysql注意&#xff1a;若MySQL服…

java 几种引用类型_Java 四种引用类型总结-Fun言

1. Java引用介绍Java从1.2版本开始引入了4种引用&#xff0c;这4种引用的级别由高到低依次为&#xff1a;强引用 > 软引用 > 弱引用 > 虚引用⑴ 强引用(Strong Reference)强引用是使用最普遍的引用&#xff0c;也是赋值的默认引用。如果一个对象具有强引用&…

JS运算符类型

一、运算符类型 1、算术运算符&#xff1a;用于各类数值运算&#xff0c;包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。2、关系运算符&#xff1a;用于比较运算。包括大于&#xff08;>&#xff09;、小于&#xff08;<&…

python关于字符串的内置函数_Python 字符串内置函数(二)

# 2.格式化相关# ljust(width) 函数 获取固定长度&#xff0c;左对齐&#xff0c;右边不够用空格补齐# rjust(width) 函数 获取固定长度&#xff0c;右对齐&#xff0c;左边不够用空格补齐# center(width) 函数 获取固定长度&#xff0c;中间对齐&#xff0c;两边不够用空格补齐…