题目大意:有若干头牛,每个牛有一个音量值,两头牛能互相听见对方说话需要发出两头牛中音量值较大者的音量*两头牛的距离的音量,求使任意两头牛都互相听见对方需要发出的音量总和。每头牛的音量值可以相同,但坐标不会相同。

思路:如果一个牛a的音量值,对总体所做的贡献为(音量值比它小的在它左侧的牛的数量*Xa-音量值比它小的在它左侧的牛的坐标和)*a的音量值+(音量值比它小的在它右侧的牛的坐标和-音量值比它小的在它右侧的牛的数量*Xa)*a的音量值。

先按每头牛的音量值进行排序,就可以统计出音量值比某头牛小的牛的个数,以及这些牛的坐标值之和。搞两个树状数组,第一个树状数组用来维护在一只牛左侧的音量值比它小的牛的个数,右侧的根据左侧的也容易求出。第二个树状数组维护一只牛左侧的音量值比它小的所有牛的坐标值之和,右侧的根据左侧的也容易求出。

按音量值从小到大遍历所有牛,对每个牛a,第一个树状数组更新add(Xa,1),表示第Xa位置多了1个牛,求音量值比它小的在它左侧的牛的数量则sum(Xa-1),第二个树状数组更新add(Xa,Xa),表示第Xa位置为坐标值和贡献了Xa,音量值比它小的在它左侧的牛的坐标和则sum(Xa-1)即可。

代码:

//POJ.1990
//Author: Prgl
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) typedef long long ll;
typedef pair<int, int>P;
typedef vector<int>vec; #define INF 0x3f3f3f3f
const double EPS = 1e-18;
const int MOD = 1e9 + 7;
const int maxn = 2e4 + 1; struct BIT {
ll bit[maxn + 1] , n;
void init(int k) { memset(bit, 0, sizeof(bit)); n = k; }
ll sum(ll i)
{
ll s = 0;
while (i > 0)
{
s += bit[i];
i -= i & (-i);
} return s;
}
void add(ll i, ll x)
{
while (i <= n)
{
bit[i] += x;
i += i & (-i);
}
}
}; struct C {
C() = default;
C(int a, int b, int c = -1) :vol(a), x(b), id(c) { }
int vol, x, id;//id为按音量排序后的序号
}; int N;
C cow[20001];
BIT bt1, bt2;
ll xsum[20001]; bool cmp1(C a, C b)
{
return a.vol < b.vol;
} bool cmp2(C a, C b)
{
return a.x < b.x;
} void solve()
{
bt1.init(20001);
bt2.init(20001);
ll res = 0;
sort(cow, cow + N, cmp1);//按音量排序,序号即为所有音量小于它的牛的数量
cow[0].id = 0;
xsum[0] = 0;
for (int i = 1; i <= N; i++)
{
cow[i].id = i;//音量值相同的两头牛id会不同,从而所有音量小于它们的牛的数量也不同,不会出现重复统计的情况
xsum[i] = xsum[i - 1] + cow[i - 1].x;//所有音量小于牛i的所有牛的坐标之和
}
for (int i = 0; i < N; i++)
{
ll x = cow[i].x, vol = cow[i].vol, id = cow[i].id;
ll l = bt1.sum(x - 1);//该牛左侧音量小于它的牛的数量
ll r = id - l;//右侧的
bt1.add(x, 1);//坐标x位置更新1牛
bt2.add(x, x);//坐标x位置更新1牛的坐标值
ll sumf = bt2.sum(x - 1), sumb = xsum[id] - bt2.sum(x - 1); //sumf:该牛左侧音量小于它的牛的坐标之和,sumb:右侧的
res += (l - r) * x * vol + (sumb - sumf) * vol;
}
cout << res << endl;
} int main()
{
IOS;
cin >> N;
for (int i = 0; i < N; i++)
{
int vol, x;
cin >> vol >> x;
cow[i] = C(vol, x);
}
solve(); return 0;
}

POJ1990 题解的更多相关文章

  1. POJ1990:MooFest——题解

    http://poj.org/problem?id=1990 题目大意:定义一对在树轴上的点,每对点产生的值为两点权值最大值*两点距离,求点对值和. 显然n*n复杂度不行,我们需要用树状数组维护两个东 ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. 集合框架-工具类-Collections-排序

    1 package cn.itcast.p2.toolclass.collections.demo; 2 3 import java.util.ArrayList; 4 import java.uti ...

  2. Python 使用 Windows10 桌面通知

    前言 Win10 没有提供简单命令行方式来触发桌面通知,所以使用 Python 来写通知脚本. 一番搜索,找到 win10toast .但这开源仓库已无人维护,通过 github fork 的关系图, ...

  3. Windows 10 Version 21h1安装

    好久没安装过Windows 10系统了,这两天在下载电脑管家时,使用bing搜索,没注意就选择了第一个,安装后,噩梦就来了,非法广告.各种软件的推送,怎么也清不干净. 没办法,到PCBeta下载了最新 ...

  4. 学习Java第3天

    今天所做的工作: 1.循环结构 2.字符串 3.数组 4.面向对象概述 明天工作安排: 1.类和对象 2.包装类 所遇到的问题及解决方法: 1.循环foreach语句 2.字符串初始化与c++的差异 ...

  5. Spring源码-IOC部分-容器初始化过程【2】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  6. 当Hobject类型出现内存泄漏爆炸增长的问题,怎么处理

    尝试使用get,和set(在拍照之后,调用set,在obj使用前释放资源的思想来完成) HObject Get_inputImage() { return inputImage; } void Set ...

  7. 为什么要配置path环境变量

    因为在jdk下bin文件夹中有很多我们在开发中要使用的工具,如java.exe,javac.exe,jar.ex等,那么我们在使用时,想要在电脑的任意位置下使用这些java开发工具,那么我们就需有把这 ...

  8. listview界面显示

    1.布局写listview      2.找到listview           3.封装新闻数据到list集合中 ,目的是为adapter提供数据展示.     4.封装一个Adapter类继承B ...

  9. 通过导入Jar包的方式使用JSONObject

    如果想要在Java中使用JSONObject,而且只想通过导入jar包的方式下,那么仅仅导入Json的jar包还是不够的. 不然会报:java.lang.ClassNotFoundException: ...

  10. autorelease注意事项

    1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...