POJ1990 题解
题目大意:有若干头牛,每个牛有一个音量值,两头牛能互相听见对方说话需要发出两头牛中音量值较大者的音量*两头牛的距离的音量,求使任意两头牛都互相听见对方需要发出的音量总和。每头牛的音量值可以相同,但坐标不会相同。
思路:如果一个牛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 题解的更多相关文章
- POJ1990:MooFest——题解
http://poj.org/problem?id=1990 题目大意:定义一对在树轴上的点,每对点产生的值为两点权值最大值*两点距离,求点对值和. 显然n*n复杂度不行,我们需要用树状数组维护两个东 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- 【webpack4.0】---webpack的基本使用(一)
一.初识webpack 1.什么是webpack? WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss ...
- 沁恒CH32F103C8T6的开发和烧录配置说明
概述 CH32F1系列是沁恒生产的32位Cortex-M3 MCU, 片上集成了时钟安全机制.多级电源管理. 通用DMA控制器等. 此系列具有 2 路 USB2.0接口.多通道 TouchKey. 1 ...
- 这个命令行HTTP客户端工具真不错
程序员专属微信红包封面1000个,兑换码:dWK7fUs2WQG cURL相信很多做开发的.运维的都不陌生,是非常有用的一个终端请求工具,借助于它可以在命令行中进行HTTP.FTP等请求,在Linux ...
- Java中的String,StringBuilder,StringBuffer三者的区别?
package com.aaa.zxf.ajax.test; /** * 弄清楚 string stringBuilder StringBuffer 三者之间的关系? * * * 一. 三者都是用来对 ...
- 计算机网络-5-9-TCP拥塞控制
TCP拥塞控制 拥塞控制的一般原理 在计算机网络中的链路容量(带宽),交换节点中的缓存和处理机等,都是网络的资源,在某段时间,若对网络中某一资源的需求超过该资源所能提供的可用部分,网络性能就会变坏,这 ...
- [HNOI2009]双递增序列
不难发现本题贪心是不好做的,可以考虑 \(dp\). 首先的一个想法就是令 \(dp_{i, j, k, l}\) 表示当前选到第 \(i\) 个位置,当前第一个序列选了 \(j\) 个数,当前第一个 ...
- synchronized、ReentrantLock、volatile
名词解释 synchronized 是Java中的关键字,是一种同步锁,可以修饰代码块,方法,静态的方法,类.synchronized(Object) 不能用String常量.Integer. Lon ...
- java实现跳过证书校验
/** * 跳过证书效验的sslcontext * @return * @throws Exception */ private static SSLContext createIgnoreVerif ...
- js静态成员和实例成员
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- NSArray文件读写
1.NSArray数据写入到文件中 NSArray *arr = @[@"lnj", @"lmj", @"jjj", @"xcq& ...