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或 ...
随机推荐
- MySQL技术内幕(一)
MySQL技术内幕 2. InnoDB存储引擎 2.1 InnoDB存储引擎概述 特点:行锁设计.支持MVCC.支持外键.提供一致性非锁定读 2.2 InnoDB体系架构 2.2.1 后台线程 Inn ...
- 一个简单的javaweb项目模板
Controller包:表现层(视图)层.用来显示数据和接收用户数据 Service包:业务逻辑层,用来处理页面.先写接口,后写实现类 Dao包:持久层(数据访问层).用来操作数据库 其中Dao包处于 ...
- Nginx搭建游戏
目录 一:Nginx搭建<小游戏> 1.上传<象棋游戏>代码 2.编辑配置文件(尾部必须要加 .conf<文件>) 3.测试配置文件是否正常 4.重启Nginx 5 ...
- K8S的安装部署以及基础知识
Kubernetes(K8S)概述 Kubernetes又称作k8s,是Google在2014年发布的一个开源项目. 最初Google开发了一个叫Borg的系统(现在命名为Omega),来调度近20多 ...
- 人口信息普查系统-JavaWeb-五
今天分享人口普查系统删除查询前端代码 <%@ page language="java" contentType="text/html; UTF-8" pa ...
- Spring源码-IOC部分-循环依赖-用实例证明去掉二级缓存会出现什么问题【7】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Nginx 路由转发配置(转)
Nginx 路由转发配置笔记 由于预算有限,只有一台服务器,想要玩的东西不少,所以这个台服务器上会提供多重服务,因此涉及到的nginx转发就必有重要了 由nginx做请求代理,提供多种服务 php搭建 ...
- Java线程--CountDownLatch使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11867656.html Java线程--CountDownLatch使用, 代码里头有详细注释 ...
- 问题描述:Navicat连不上MySQL数据库
发现Navicat连不上MySQL后我首先觉得是MySQL的服务没有打开, 然后再cmd里面 启动MySQL服务 输入: net start mysql 发现没有此服务,然我网上找了一下 先初始化My ...
- CSS3带你实现3D转换效果
前言 在css3中允许使用3D转换来对元素进行格式化,在原本只是2D转化的平面中引入了Z轴.在这之前我们讲解了css3中的2D转换,也就是二维空间变换,本篇的3D转换就是基于原来的2D转换而来,与2D ...