离散化和排序后的序号问题搞得我实在是头痛

不过树状数组解逆序和偏序一类问题真的好用

更新:hdu的数据弱的真实,我交上去错的代价也对了。。

下面的代码是错的

/*
每个点的贡献度=权值*在这个点之前的比它大的点数量+在这个点前面比它大的所有点之和
开两个树状数组,一个保存相应序号的点值,另一个保存相应序号的
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
struct node{
int x,id;
bool operator<(const node & a)const{
return x<a.x;
}
}a[maxn];
int b[maxn];//b数组按输入顺序维护每个点的权值,序号
ll bit1[maxn],bit2[maxn];
int n;
void add1(int x){
for(int i=x;i<=maxn;i+=i&-i)
bit1[i]++;
}
void add2(int x,int num){
for(int i=x;i<=maxn;i+=i&-i)
bit2[i]+=num;
}
ll query1(int x){
ll res=;
for(int i=x;i;i-=i&-i)
res+=bit1[i];
return res;
}
ll query2(int x){
ll res=;
for(int i=x;i;i-=i&-i)
res+=bit2[i];
return res;
} int main(){
while(scanf("%d",&n)==){
for(int i=;i<=n;i++)
scanf("%d",&a[i].x),a[i].id=i;
sort(a+,a++n);
for(int i=;i<=n;i++) b[a[i].id]=i;//其实就是一次映射,由于a数组进行了排序,该映射要找到原序列的每个数在排序后,在新的数组里的位置
ll ans=;
for(int i=;i<=n;i++){
ans+=a[b[i]].x*(query1()-query1(a[b[i]].x));//通过映射i->b[i],找到每个数新的位置
ans+=query2()-query2(a[b[i]].x);
add1(b[i]);
add2(b[i],a[b[i]].x);
}
printf("%lld\n",ans); }
return ;
}

下面的代码是对的

#include<iostream>
using namespace std;
#define N 100001
int n;
struct node
{
int index;
__int64 sum;
}c[N];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int k,int s)
{
while(x<=n)
{
c[x].index+=k;
c[x].sum+=s;
x+=lowbit(x);
}
}
int getsum_index(int x)
{
int ans=;
while(x>)
{
ans+=c[x].index;
x-=lowbit(x);
}
return ans;
}
__int64 getsum_sum(int x)
{
__int64 ans=;
while(x>)
{
ans+=c[x].sum;
x-=lowbit(x);
}
return ans;
}
int main(void)
{
while(~scanf("%d",&n))
{
int i; __int64 ans=;
memset(c,,sizeof(c));
for(i=;i<=n;i++)
{
int x;
scanf("%d",&x);
update(x,,x);
__int64 k1=i-getsum_index(x);
if(k1!=)
{
__int64 k2=getsum_sum(n)-getsum_sum(x);
ans=ans+k1*x+k2;
} }
printf("%I64d/n",ans);
}
}

hdu2838树状数组解逆序的更多相关文章

  1. Ultra-QuickSort(树状数组求逆序对数)

    Ultra-QuickSort 题目链接:http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total ...

  2. [zoj4046][树状数组求逆序(强化版)]

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4046 题意:有一个含有n个元素的数列p,每个元素均不同且为1~n中的一个, ...

  3. 用树状数组求逆序对数(poj2299)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 46995   Accepted: 17168 ...

  4. POJ 2299 Ultra-QuickSort (树状数组 && 离散化&&逆序)

    题意 : 给出一个数n(n<500,000), 再给出n个数的序列 a1.a2.....an每一个ai的范围是 0~999,999,999  要求出当通过相邻两项交换的方法进行升序排序时需要交换 ...

  5. 【CDOJ931】Car race game(树状数组求逆序)

    题目连接:http://acm.uestc.edu.cn/#/problem/show/931 OJ评判系统有些坑,不支持__int64以及输出的%I64d大家注意.全开long long也会TLE, ...

  6. POJ-2299 Ultra-QuickSort(用树状数组求逆序对数)

    题目链接 ac代码 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...

  7. poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

    题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...

  8. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  9. 【bzoj2789】[Poi2012]Letters 树状数组求逆序对

    题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...

随机推荐

  1. java.lang.ClassCastException:java.util.LinkedHashMap不能转换为com.testing.models.Account

    ObjectMapper  mapper=new ObjectMapper();POJO pojo = mapper.convertValue(singleObject, POJO.class);

  2. js格式化日期工具类

    就是一个工具类  开箱即用 传进一个指定的参数,格式化 //将时间戳格式化 function getMyDate(time){ if(typeof(time)=="undefined&quo ...

  3. Java 编程下使用 Class.forName() 加载类【转】

    在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类.下面的范例让你可以指定类名称来获得类的相关信息. ...

  4. Java中 break continue return 的区别

    1.break break :跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环: ; i < ; i++) { ) { break; // 在执行 ...

  5. HITS算法--从原理到实现

    本文介绍HITS算法的相关内容. 1.算法来源 2.算法原理 3.算法证明 4.算法实现 4.1 基于迭代法的简单实现 4.2 MapReduce实现 5.HITS算法的缺点 6.写在最后 参考资料 ...

  6. 大量界面刷新时手动Dispose也是有必要的

    在winform窗体上拖一个flowLayoutPane,一个Button,项目中再创建一个用户控件UcControl,用户控件上放几十个子控件 private void button1_Click( ...

  7. Maxwell入门

    1 下载tar包 Download binary distro: https://github.com/zendesk/maxwell/releases/download/v1.19.4/maxwel ...

  8. mysql数据库导出excel xml等格式文件

    http://jingyan.baidu.com/article/ac6a9a5e43a62e2b653eac83.html

  9. 深入理解 RecyclerView 系列之:ItemDecoration

    https://blog.piasy.com/2016/03/26/Insight-Android-RecyclerView-ItemDecoration/?utm_source=tuicool&am ...

  10. Java ArrayList类

    ArrayList对象可以用于存储一个对象列表 例子: ArrayList<String> list = new ArrayList<String>() 例子: public ...