hdu 5792 线段树+离散化+思维
题目大意:
Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ada≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad.
A1,A2⋯AnA1,A2⋯An. 1≤n≤500001≤n≤50000 0≤Ai≤1e9
基本思路:
最朴素的思想就是算出所有顺序对所有逆序对相乘然后再减去所有有重复元素的结果,最终得到答案;基本思路和树状数组还是一致的;
反思与总结:
之前学线段树的时候貌似学的太浅了,区间更新的lazy标记没学,就是那个PushDown函数,这次专门去理解了一下,我的理解是,如果每次都向下找到每个叶节点再操作非常的费时间,解决方法就用个lazy标记(就是我程序里的add数组),除非用到每一段,否则不再向下递归,指示标记到当前结点,这样能大大节省时间(详细的讲解看我的线段树,其实多半都是转的大佬们的);
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map> using namespace std; typedef long long ll; const int maxn = +; int arr[maxn],tmp[maxn];
int lx[maxn],rx[maxn],ld[maxn],rd[maxn];
int sum[maxn],num[maxn];
int ans[maxn<<],add[maxn<<];
int n;
map<int,int>mm; void PushUp(int root)
{
ans[root]=ans[root<<]+ans[root<<|];
} void build(int l,int r,int root)
{
add[root]=;
if(l==r)
{
ans[root]=;
return;
}
int m=(l+r)>>;
build(l,m,root<<);
build(m+,r,root<<|);
PushUp(root);
} void PushDown(int l,int r,int root)
{
if(add[root])
{
add[root<<]+=add[root];
add[root<<|]+=add[root];
ans[root<<]+=add[root<<];
ans[root<<|]+=add[root<<|];
add[root]=;
}
}
void update(int ql,int qr,int l,int r,int root)
{
if(qr<l||ql>r) return;
if(ql<=l&&qr>=r)
{
ans[root]+=;
add[root]+=;
return;
}
PushDown(l,r,root);
int m=(l+r)>>;
if(ql<=m) update(ql,qr,l,m,root<<);
if(qr>m) update(ql,qr,m+,r,root<<|);
PushUp(root);
} int query(int ql,int qr,int l,int r,int root)
{
if(qr<l||ql>r) return ;
if(ql<=l&&qr>=r) return ans[root];
PushDown(l,r,root);
int m=(l+r)>>;
return query(ql,qr,l,m,root<<)+query(ql,qr,m+,r,root<<|);
}
int main()
{
while(scanf("%d",&n)==)
{
mm.clear();
for(int i=;i<=n;i++)
{
scanf("%d",&arr[i]);
tmp[i]=arr[i];
}
sort(tmp+,tmp+n+);
sum[]=add[]=;
int cnt=;
for(int i=;i<=n;i++)
{
if(!mm[tmp[i]])
{
mm[tmp[i]]=++cnt;
num[cnt]=;
sum[cnt]=sum[cnt-]+num[cnt-];
}
else num[cnt]++;
}
build(,cnt,);
for(int i=;i<=n;i++)
{
int order=mm[arr[i]];
update(order,order,,cnt,);
lx[i]=query(,order-,,cnt,);
ld[i]=query(order+,cnt,,cnt,);
rx[i]=sum[order]-lx[i];
rd[i]=n-lx[i]-rx[i]-ld[i]-num[order];
}
ll res=;
ll x=,y=;
for(int i=;i<=n;i++)
{
x+=lx[i];
y+=ld[i];
}
res=x*y;
for(int i=;i<=n;i++)
{
res-=lx[i]*ld[i];
res-=rd[i]*rx[i];
res-=lx[i]*rx[i];
res-=rd[i]*ld[i];
}
printf("%I64d\n",res);
}
return ;
}
hdu 5792 线段树+离散化+思维的更多相关文章
- ZOJ 2301/HDU 1199 线段树+离散化
给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候, ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- HDU 4288 线段树+离散化
题意: n个操作 在[1, 100000] 的区间上add 或del数( 必不会重复添加或删除不存在的数) sum 求出整个集合中 (下标%5 == 3 位置) 的数 的和 注意数据类型要64位 ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU5124:lines(线段树+离散化)或(离散化思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 Problem Description John has several lines. The lines ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
随机推荐
- 五、Redis五种类型 - 字符串类型
1.介绍: 字符串类型是Redis中最基本的数据类型,可以存储任何形式的字符串数据,最大容量是512MB. key 和 value 都是区分大小写的. 2.命令介绍 (1).赋值: set key v ...
- 一、创建且运行JPA工程
1. 创建JPA 工程 (1)选择创建 JPA Project,注意不是Java Project (2)JPA version选择 2.0 (3)选择用户库,否则会出现 At least one us ...
- jQuery HTML- 添加元素
添加内容 html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...
- 18.synchronized
同步的前提: 必须要有两个或者两个以上的线程 必须是多个线程使用同一个锁 必须保证同步中只能有一个线程在运行 好处:解决了多线程的安全问题 弊端:多个线程需要判断锁,较为消耗资源.抢锁的资源 ...
- 【持久层】Druid简介
Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSou ...
- (转)Spring Boot干货系列:(三)启动原理解析
转:http://tengj.top/2017/03/09/springboot3/ 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂Spri ...
- MySQL 表的创建、修改、删除
1.创建表 create table 表名 ( 列名 类型 是否可以为空 列名 类型 是否可以为空 ) engine=innodb default charset=utf8; 是否可以为控制.null ...
- 线程类中使用spring注解报空指针异常
springboot项目开发中,作为服务端,实现了线程类,在此类中添加spring注解@Source注入的service,报空指针异常. 查原因后,发现是线程中,不支持spring注解,因为sprin ...
- (3)C++复合类型
存储数据时必须跟踪的三个属性:信息储存在何处,存储的值,存储的类型 一.数组 #include <iostream> using namespace std; int main() { / ...
- Ngrinder简单使用
文章目录 安装 试玩 性能测试 安装 https://github.com/naver/ngrinder/releases 下载对应版本,是一个war包,3.4以上支持jdk1.8 将war包放到to ...