codeforces 261 D

题目链接:

解题报告:给出一个序列a1,a2,a3.........an,f(i , j ,x) ak 等于x的个数(i <= k <= j),令i < j,求有多少对 i 和 j 使得 f(1,i,ai) > f(j,n,aj)。

从左往右扫一遍这个序列,num1[i] 等于从1到i有多少个等于a[i]的,同理从右往左扫一遍得到num2[i],然后把从右往左扫的num2[i]的个数用一个树状数组维护,先全部加到树状数组里面去,然后从左往右扫一遍num1[i],每次判断在num2中有多少个小于num1[i]的数,同时判断完之后要把对应的num2[i]的个数减去1,因为这时候num1[i]的位置已经超过这个num2的位置了,所以以后的算个数的时候这个num2[i]不能算进去,应该删掉。用树状数组的目的就是为了能快速判断num2[i]中有多少个小于num1[i]的,这样可以做到在log2(n)的时间内完成查找和删除操作。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<map>
 5 #include<algorithm>
 6 using namespace std;
 7 #define LL long long
 8 #define maxn 1000005
 9 LL n,tot;
10 map<LL,LL> mp1,mp2;
11 LL a[maxn],num1[maxn],num2[maxn],num3[maxn];
12 LL tree[maxn];
13 LL find(LL d,int l,int r)
14 {
15     while(l < r)
16     {
17         int mid = (l + r) / 2;
18         if(d <= num1[mid]) r = mid;
19         else l = mid + 1;
20     }
21     if(num1[l] != d) return l - 1;
22     else return l;
23 }
24 void insert(int l,int d)
25 {
26     for(int i = l;i <= n;i += (-i & i))
27     tree[i] += d;
28 }
29 LL sum(int l)
30 {
31     LL tot = 0;
32     for(int i = l;i > 0;i -= (-i & i))
33     tot += tree[i];
34     return tot;
35 }
36 
37 int main()
38 {
39     
40     while(scanf("%lld",&n)!=EOF)
41     {
42         for(int i = 1;i <= n;++i)
43         scanf("%lld",&a[i]);
44         memset(tree,0,sizeof(tree));
45         memset(num1,0,sizeof(num1));
46         memset(num2,0,sizeof(num2));
47         mp1.clear();
48         mp2.clear();
49         for(int i  = 1;i <= n;++i)
50         {
51             if(mp1.insert(pair<LL,LL> (a[i],1)).second == 1)
52             num1[i] = 1;
53             else
54             {
55                 mp1[a[i]] = mp1[a[i]] + 1;
56                 num1[i] = mp1[a[i]];
57             }
58         }
59         for(int i = n;i >= 1;--i)
60         {
61             if(mp2.insert(pair<LL,LL> (a[i],1)).second == 1)
62             num2[i] = 1;
63             else
64             {
65                 mp2[a[i]] = mp2[a[i]] + 1;
66                 num2[i] = mp2[a[i]];
67             }
68         }
69         for(int i = 1;i <= n;++i)
70         insert(num2[i],1);
71         tot = 0;
72         for(int i = 1;i <= n;++i)
73         {
74             insert(num2[i],-1);
75             tot += sum(num1[i]-1);
76         }
77         printf("%lld\n",tot);
78     }
79     return 0;
80 }
View Code

 

转载于:https://www.cnblogs.com/xiaxiaosheng/p/3916290.html

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

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

相关文章

不使用物理引擎,自己动手做真实物理的模拟投篮游戏

最近打算做一个2D投篮游戏&#xff0c;由于对于BOX2D等物理引擎并不熟悉&#xff0c;加之一开始低估了游戏所需要的碰撞检测复杂度&#xff0c;认为仅仅涉及4面墙&#xff0c;篮球&#xff0c;篮板&#xff0c;篮筐&#xff0c;篮网的碰撞检测并不复杂。因此决定自己实现所需要…

nyist 488 素数环

有一个整数n&#xff0c;把从1到n的数字无重复的排列成环&#xff0c;且使每相邻两个数&#xff08;包括首尾&#xff09;的和都为素数&#xff0c;称为素数环。 为了简便起见&#xff0c;我们规定每个素数环都从1开始。例如&#xff0c;下图就是6的一个素数环。 这题在进行判断…

.Net入门-部署问题

学习一门新的语言难免会遇到各种各样的问题&#xff0c;总结一下。 测试环境&#xff1a;windows2008serverIIS7 开发环境: vs2010 问题1&#xff1a;"Unrecognized attribute targetFramework. Note that attribute names are case-sensitive. " 分析&#xff1a; 开…

WINDOWS系统Eclipse+NDK+Android + OpenCv

WINDOWS系统EclipseNDKAndroid OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html 2 官方文档 Android.mk与Application.mk如何编写&#xff0c;OpenCV库如何调用 http://docs.opencv.org/trunk/doc/tutorials/introduction…

正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象&#xff0c;有太多程序员将那些他们只是有过非常浅显的了解&#xff0c; 但其实根本就不懂的技术写到他们的简历中&#xff0c;这个现象几乎每种语言都有&#xff0c;但这其中最严重的就要数javascript了。 你不知道你不懂 出现这种状况…

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施&#xff0c;企业主营业务之一为医疗软件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中&#xff0c;需要实现各地区分院与总院间的数据库互相访问、视频数…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…

控制器中获取Field值

在ASP.NET MVC程序中&#xff0c;我们需要POST Data到制器中&#xff0c;是有很多方法。但是我们想在控制器中&#xff0c;获取Feild值呢&#xff1f;怎样获取&#xff1f;你可以留意到有一个类FormCollection。它能帮助到我们解决这个问题。 举个简单的例子。在ASP.NET MVC应用…

私有RTP协议和标准流媒体协议

先介绍下RTP协议&#xff1a; 实时传输协议RTP&#xff08;Real-time Transport Protocol&#xff09;是一个网络传输协议 &#xff0c;该协议详细说明了在互联网上传递音频和视频的标准数据包格式 。 RTP标准定义了两个子协议 &#xff0c;RTP和RTCP 数据传输协议RTP&#xff…

从WebRtc学习RTP协议

文章目录TCP为何不适用于实时音视频UDP->RTPRTP协议结构JittbufferRTP扩展头RTP填充数据参考TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的。按照TCP原理&#xff0c;当出现极端网络情况时&#xff0c;理论上每个包的时延可达到秒级以上&#xff0c;而且这种时延…

解决ListView异步加载数据之后不能点击的问题

在ListView的onScroll事件中执行异步加载数据&#xff0c;然后使用notifyDataSetChange()函数更新适配器&#xff0c;之后发现listView不能点击了&#xff0c;这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。 Java代码…

从WebRtc学习RTCP协议

文章目录RTCP支持的消息类型RTCP协议头WebRTC的反馈报文RTPFB支持的报文类型&#xff1a;PSFB支持的报文类型&#xff1a;参考RTCP是RTP的控制协议.那么RTCP能对RTP做哪些控制呢&#xff1f;其中最为大家熟知的就是 丢包控制。发送端发送数据后&#xff0c;接收端如果发现有RTP…

无锁队列设计思路以及简要代码

文章目录非并发的一写一读环形队列多读多写环形队列非并发的一写一读环形队列 读指针&#xff1a; 1、先判断是否有数据 2、读取数据 3、操作指针 写指针&#xff1a; 1、先判断空间是否足够 2、写入数据 3、操作指针 所以代码也十分简单&#xff1a; bool putqueue(void* pDa…

CPU Cache对于并发编程的影响

文章目录引子CPU Cache对于并发的影响读写顺序对性能的影响字节对齐对Cache的影响小结引子 下面给出两个极其相似的代码&#xff0c;运行出的时间却是有很大差别&#xff1a; 代码一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

软工之初识

我们之前已经在完全不懂软件工程的情况下&#xff0c;已经做完了两个小系统&#xff0c;虽然能够运行&#xff0c;但其中有很多的问题&#xff0c;学习软工就是让我们在工程学原理的指导之下去开发和设计软件。 软件工程同大多数书讲的都是一样的&#xff0c;首先对软件工程有一…

perf +火焰图使用

以mysqld进程为例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

在一个字符串中找到第一个只出现一次的字符

题目&#xff1a;在一个字符串中找到第一个只出现一次的字符&#xff0c;如输入abaccdeff&#xff0c;则输出b&#xff1b;具体实现如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

零拷贝机制在文件传输中的使用手法

文章目录文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换零拷贝技术sendfilesendfile SG-DMAmmap writespliceDirect I/O经典应用文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换 如果服务端要提供文件传输的功能&#xff0c;最简单的方式…

POJ 3233 Matrix Power Series 矩阵快速幂 + 二分

题意&#xff1a;求矩阵的次方和 解题思路&#xff1a;最容易想到方法就是两次二分因为 我们可以把一段 A^1 A^2 .......A^K 变成 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) A^K 当K 为偶数的时候…