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,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...
随机推荐
- UESTC--1262--Memory(dfs)
Memory Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu SubmitStatus De ...
- Spring《三》ref 引用其他bean
local属性 1.被引用id必须在同一个xml中. 2.被引用id必须使用id命名. 优点提前检查所使用的bean id是否正确. Bean属性 1.Bean指定的id可以在不同的xml中. 2.B ...
- 【转自网络】JS实现保存当前网页HTML到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Edge浏览器+微软小娜
- vue <router-view>没有渲染
将routes中的components换成component
- Generic programming-泛型编程
Generic programming is a style of computer programming in which algorithms are written in terms of t ...
- java真实面试题(1)
2019年春杭州邦盛科技java面试题. 1,java基本类型 byte,char,short,int,long,float,double,boolean. 2,重写重载 重写,子类重写父类的方法,方 ...
- 【Django】遇到的问题
目前的Django版本是Django version 2.0.4 Python使用的版本是Python 3.6.4 以下会将遇到的问题和各种报错信息记录 报错信息:NameError: name 'u ...
- html+css居中问题
一.行级元素水平居中对齐(父元素设置 text-align:center) <div style="width: 200px; height: 100px;border: 1px so ...
- linux中一次创建多个目录
linux中创建目录当然使用命令工具mkdir == (make directory),联想记忆法能让你记得牢固. 如果你要创建几个目录,例如:dir1目录,dir2目录,dir3目录可以这样 mkd ...