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 ...
随机推荐
- 在脚本中使用set命令调试脚本
当脚本文件较长时,可以使用set命令指定调试一段脚本.在脚本中使用set -x命令开启调式模式:使用set +x命令关闭调式模式. 例如: #!/bin/bash #Scriptname: greet ...
- mysql优化的理解(转载)
当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这 ...
- [js测试]JavaScript Web Quiz By davidshariff
Question1 var foo = function foo() { console.log(foo === foo); }; foo(); 输出是"true",因为foo就指 ...
- Java缓冲流的优点和原理
不带缓冲的流的工作原理: 它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了. 带缓冲的流的工作原理: 读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从 ...
- 双联通的tarjan算法
转自:https://www.zhihu.com/question/40746887/answer/88428236 连通分量有三种∶边双连通分量,点双连通分量,强连通分量,前两种属于无向图,后一种属 ...
- 这样才能正确解锁MaxCompute客户端
大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的TB/PB级数据仓库解决方案.MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决 ...
- linux基础(六)
今天我们来看一下Samba服务和nginx服务. Samba服务 1.samba的功能 samba是一个网络服务器,用于Linux和Windows之间共享文件. 2.samba服务的启动.停止.重启 ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)
传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...
- Mistakes Collection I
Symbol =>'s meaning: what it used to be like => what it should be. 1) mistake array subscript: ...
- Spring Boot 报错记录
Spring Boot 报错记录 由于新建的项目没有配置数据库连接启动报错,可以通过取消自动数据源自动配置来解决 解决方案1: @SpringBootApplication(exclude = Dat ...