POJ 1990 线段树

原创 2016年08月30日 11:03:45

题意:
这里写图片描述
这里写代码片

思路:
线段树 (一棵就够啦 不像树状数组,还得用两棵)

先对v从小到大排序。每回插入的时候当前的v是最大的,只需要统计它到各个坐标的距离就好了。

里面存两个东西:
这个坐标左边的坐标个数和这个坐标左边的坐标之和。
ans_num表示这个坐标左边的坐标个数

ans_num表示这个坐标左边的坐标之和

tot_sum表示一共的坐标之和

i表示当前处理的是第i头牛

ans+=(cow[i].pos*ans_num-ans_sum+tot_sum-cow[i].pos*(i-ans_num-1)-ans_sum)*cow[i].v;

最后说一句:要用long long。。。。。

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
#define int long long
int n,xx,ans_num,ans_sum,tot_sum,ans=0;
struct Cow{int pos,v;}cow[22222];
struct Tree{int num,sum;}tree[88888]; 
bool cmp(Cow a,Cow b){return a.v<b.v;}
void insert(int l,int r,int pos){
    if(l==r){
        tree[pos].num++;
        tree[pos].sum+=xx;
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=xx)insert(l,mid,pos<<1);
    else insert(mid+1,r,pos<<1|1);
    tree[pos].num=tree[pos<<1].num+tree[pos<<1|1].num;
    tree[pos].sum=tree[pos<<1].sum+tree[pos<<1|1].sum;
}
void query(int l,int r,int pos){
    if(r<xx){
        ans_num+=tree[pos].num;
        ans_sum+=tree[pos].sum;
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=xx-1)query(l,mid,pos<<1);
    else query(l,mid,pos<<1),query(mid+1,r,pos<<1|1);
}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld%lld",&cow[i].v,&cow[i].pos);
    sort(cow+1,cow+1+n,cmp);
    for(int i=1;i<=n;i++){
        xx=cow[i].pos;
        ans_num=ans_sum=0;
        query(0,20000,1);
        insert(0,20000,1);
        ans+=(xx*ans_num-ans_sum+tot_sum-xx*(i-ans_num-1)-ans_sum)*cow[i].v;
        tot_sum+=cow[i].pos;
    }
    printf("%lld\n",ans);
}

这里写图片描述

版权声明:本文由SiriusRen原创,未经允许不得转载

POJ 1990

题意:牛的听力为v,两头牛i,j之间交流,需要max(v[i], v[j])*dist(i,j)的音量。应该说,题意是说,v[i]越小,听力越好。求所有牛交谈时叫声总和∑(max(v[i],v[j])...
  • AllenLSY
  • AllenLSY
  • 2010年09月14日 20:22
  • 2453

poj线段树专题

poj 2528 水题 #include #include #include using namespace std; #define N 40500 int n; struct node { ...
  • Jackyguo1992
  • Jackyguo1992
  • 2012年10月31日 11:47
  • 4192

poj上的经典线段树

题目大意: 有一面海报墙,在墙上顺序贴n张海报(海报的高度与墙的高度一样高),墙上有刻度,给出每张海报对应的起始刻度和终止刻度,求最后能看到的海报的数目。   解题思路: 线段...
  • banbanbanzhuan
  • banbanbanzhuan
  • 2017年04月19日 21:46
  • 136

poj 1990 MooFest

点击打开poj 1990 思路: 树状数组 分析: 1 题目给定n头牛的听力v[i]. 现在规定两头你i和j如果要进行交流的话那么消耗的能量就是dis(i,j)*max(v[i].v[j]),现在问n...
  • cgl1079743846
  • cgl1079743846
  • 2013年08月19日 10:33
  • 1512

POJ - 1990 MooFest

题意:一排牛,每头牛(坐标pos,听力v),如果牛i和牛j交流的话,需要max{v[i],v[j]}*abs(pos[i]-pos[j]),求两两交流的总和。 思路:还是求逆序数对的思想,按坐标排序...
  • u011345136
  • u011345136
  • 2014年04月05日 15:42
  • 913

poj2777Count Color(线段树)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40404   A...
  • d_x_d
  • d_x_d
  • 2015年12月20日 17:52
  • 2102

POJ 1990 :MooFest 线段树

poj 线段树
  • qq_32451161
  • qq_32451161
  • 2016年09月17日 21:25
  • 205

poj2823 线段树模板题题解

http://poj.org/problem?id=2823 给你一组数字,滚动窗口,每次只能看见几个数字,(每次左边出去一个,右边进来一个)求每次的最大数字和最小数字,做了三遍啊啊啊啊。。。。 ...
  • zjy2015302395
  • zjy2015302395
  • 2016年03月27日 06:17
  • 326

poj2528 线段树+离散化

题意:n(n       求出最后还能看见多少张海报。 输入: 1 5 1 4 2 6 8 10 3 4 7 10 解法:离散化,如下面的例子(题目的样例),因为单位1是一个单位长度,...
  • Non_Cease
  • Non_Cease
  • 2012年03月22日 22:32
  • 8176

线段树成段更新操作及Lazy思想(POJ3468解题报告)

就直接那POJ上面的例题来说吧,http://poj.org/problem?id=3468。 此题题意很好懂:  给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C ...
  • Acceptedxukai
  • Acceptedxukai
  • 2011年11月03日 20:37
  • 9706
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1990 线段树
举报原因:
原因补充:

(最多只允许输入30个字)