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 ...
随机推荐
- 2019牛客暑期多校训练营(第九场)A.The power of Fibonacci
题意:给出n和m,f(n)是斐波那契额数列的第n项,要求计算ans=f(1)^m+f(2)^m+....f(n)^m.即斐波那契额数列前n项的m次幂和. 解法:这题好像有两种解法:一种是循环节+CRT ...
- Java访问数组
package java03; /* 使用动态初始化数组的时候,其中的元素会自动拥有一个默认值,规则如下: 如果是整数类型,默认为0 如果是浮点类型,默认为0.0 如果是字符类型,默认为'\u0000 ...
- OpenCV常用基本处理函数(6)图像梯度
形态学转换 腐蚀 img = cv2.imread() kernel = np.ones((,),np.uint8) erosion = cv2.erode(img,kernel,iterations ...
- hdu 4609 3-idiots(FFT+去重处理)
3-idiots Problem Description King OMeGa catched three men who had been streaking in the street. Look ...
- POJ 3187 Backward Digit Sums (dfs,杨辉三角形性质)
FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N < ...
- 切换路由时取消全部或者部分axios请求,并将一些从不需要取消的加入白名单
1. axios拦截器进行配置,除了白名单中的接口,统统保存到全局变量canCancelAxios中 window.canCancelAxios = []; // http request 拦截器 a ...
- 【HDOJ6581】Vacation(模拟)
题意:有标号从0到n的n+1辆车,每辆车离终点的距离为s[i],车长为l[i],速度为v[i],规定不能超车,问何时所有车都能过终点线 n<=1e5,保证 思路: #include<bit ...
- implements Serializable有什么作用
转自 http://blog.csdn.net/dinghqalex/article/details/46009911
- 有关于css的四种布局
四种布局 (1).左右两侧,左侧固定宽度200px, 右侧自适应占满. (2).左中右三列,左右个200px固定,中间自适应占满. (3).上中下三行,头部200px高,底部200px高,中间自适应占 ...
- C++ Compiling… Error spawning cl.exe
转自VC错误:http://www.vcerror.com/?p=500 解决方法: 方法(一): 启动VC时不要用图形界面,通过在命令提示符下输入:Msdev /useenv运行(注意啦/前面有个空 ...