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,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...
随机推荐
- Linux就该这么学 20181011(第十五章邮件)
参考链接:https://www.linuxprobe.com. https://www.linuxprobe.com/chapter-15.html 电子邮箱系统 foxmail MUA 发送 MT ...
- Noip蒟蒻专用模板
目录 模板 数论 线性筛素数 线性筛欧拉 裴蜀定理 卢卡斯定理 矩阵快速幂 逆元 高斯消元 图论 割点 最小生成树 倍增 SPFA 负环 堆优化迪杰斯特拉 匈牙利 数据结构 树状数组 ST表 线段树 ...
- CZLayer的阴影
CALayer有一个shadow属性 意思是阴影 shadowcolor //颜色 shadowoffset //偏移 shadowOpacity //透明度 layer有一个方法 mas ...
- java中拦截器 过滤器 监听器都有什么区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts2的action进行业务逻辑,比如过滤掉非法u ...
- signature验证/salt验证/token验证的作用
1.salt验证: salt是随机生成的一串字符,salt验证的作用是将生成的salt与加密的密码密文拼接后再次加密存储 这样可以是存储在数据库中的密码更加安全 2.signature验证: I.将 ...
- POJ.grids.2980
题目链接:http://bailian.openjudge.cn/practice/2980 解题思路:先将对应位相乘的积累加,最后再来处理进位问题:如 835*49: 先做 835*9: 得到 i ...
- GridBagLayout使用案例+获取目录下所有的文件+获取创建时间及最后修改时间
package vvv; import java.awt.Dimension;import java.awt.GridBagConstraints;import java.awt.GridBagLay ...
- iproute2+tc notes
iproute2+tc notes The iproute2+tc package allows access to the variety of neat new networking featur ...
- shell脚本切割tomcat日志文件
转自:http://www.cnblogs.com/lishun1005/p/6054816.html 鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割to ...
- React中的setState(obj)
1.setState(obj) 只能浅merge obj,对于复杂对象结构的不行 比如: this.state = { data:{ idx:1 } } this.setState( ...