POJ 1990 线段树
题意:
思路:
线段树 (一棵就够啦 不像树状数组,还得用两棵)
先对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);
}
POJ 1990 线段树的更多相关文章
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- POJ——3264线段树
题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ...
- POJ 2828 线段树(想法)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ...
- poj 2528 线段树 离散化的小技巧
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...
- poj 2828 线段树
http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...
- POJ - 1177 线段树
POJ - 1177 扫描线 这道题也算是一道扫描线的经典题目了. 只不过这道题是算周长,非常有意思的一道题.我们已经知道了,一般求面积并,是如何求的,现在我们要把扫描线进行改造一下,使得能算周长. ...
- poj 2886 (线段树+反素数打表) Who Gets the Most Candies?
http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...
- poj 2828(线段树 逆向思考) 插队是不好的行为
http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...
随机推荐
- [MySQL] 查询一段时间记录
24小时内记录(即86400秒) $sql="SELECT video_id,count(id)as n FROM `rec_down` WHERE UNIX_TIMESTAMP(NOW() ...
- Asp.Net Core部署到Linux服务器
从2016年7月, .NET Core1.0 正式发布开始,由于时间问题,我没怎么关注过.NET Core,最近刚抽出点时间研究了下,先讲下如何把ASP.NET Core部署到Linux上吧.这里我用 ...
- pgpool如何对数据库节点进行状态检查及相关数据结构描述
/* * configuration parameters */typedef struct { char *listen_addresses; /* hostnames/ ...
- Oracle学习笔记——常用函数总结
在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...
- HDU 2037 今年暑假不AC【贪心】
解题思路:即为给出一个总长度确定的区间,再输入不同的子区间,求在这个总区间里面包含的不相交的子区间最多有多少个. 可以由最特殊的情况来想,即给出的这些子区间现在都不相交,比如 ----- (1,3) ...
- ZBrush中如何反选遮罩
通过对ZBrush的学习,我们知道了如何手动创建遮罩,手动创建遮罩相对来说是最简单有效的方法,在某些特定的使用场合会起到事半功倍的效果.创建遮罩我们可以结合Ctrl键在物体保持编辑的状态下来执行,您可 ...
- layui动态修改select的选中项
layui动态修改select的选中项:(在layUI下给select设置默认选项) 例: $("select[name='result']").val(11); //重新渲染表单 ...
- 本地启动项目后cookie跨域获取不到的处理方式
问题现象 最近在做Vue项目,很多时候调试代码需要本地访问localhost来进行,然而请求接口是通过代理实现的,那么就会存在一种情况是:代理域名下种植的cookie,在localhost域名下访 ...
- Proxifier安装与使用
Proxifier安装与使用 1.Proxifier官网可能打不开,这是一个下载地址,提取码为p1l8. 用户名随意填 注册码下边 5EZ8G-C3WL5-B56YG-SCXM9-6QZAP G3ZC ...
- v4l2程序实例
#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...