博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组
阅读量:5377 次
发布时间:2019-06-15

本文共 1270 字,大约阅读时间需要 4 分钟。

MooFest 狂欢节 bzoj-3378 Usaco-2004 Open

题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j)$。

注释:$1\le n\le 2\cdot 10^4$。


想法:裙子说了,这种$max$和$min$的题通常要枚举这个$max$和$min$到底是多少。

这样的话我们就将所有点按权值从大到小排序。

往树状数组里插。

查询直接查询即可。

最后,附上丑陋的代码... ...

#include 
#include
#include
#include
using namespace std;const int N=20000;int n,num[N+5],cnt;long long sum[N+5],ans,tot;struct Node{int v,x;}a[N+5]; bool cmp(const Node &x,const Node &y){return x.v>y.v;}inline int lowbit(int x) {return x&(-x);}void add(int x,int v,int k){ for(int i=x;i<=N;i+=lowbit(i)) sum[i]+=v,num[i]+=k;}void query(int x){ for(int i=x;i>0;i-=lowbit(i)) tot+=sum[i],cnt+=num[i];}void work(){ for(int i=1;i<=n;i++) { tot=cnt=0; query(a[i].x); ans+=a[i].v*(cnt*a[i].x-tot); cnt=-cnt,tot=-tot; query(N); ans+=a[i].v*(tot-cnt*a[i].x); add(a[i].x,-a[i].x,-1); } cout << ans << endl ;}void init(){ cin >> n ; for(int i=1;i<=n;i++) scanf("%d%d",&a[i].v,&a[i].x); sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) add(a[i].x,a[i].x,1);}int main(){ init(); work(); return 0;}

小结:裙子有时候想法好$nb$啊!%%%

转载于:https://www.cnblogs.com/ShuraK/p/9551668.html

你可能感兴趣的文章
Yslow-23条规则编辑
查看>>
数据库 - FMDB
查看>>
Centos 与本地终端 上传、下载 文件
查看>>
Mysql 锁粒度
查看>>
Map集合计算字符串中字符出现的次数
查看>>
viewpager的布局代码
查看>>
设置python的默认编码方式为utf-8
查看>>
【转】如何修改Chrome缓存目录的地址
查看>>
关于分享那些事
查看>>
第七章 Hyper-V 2012 R2 授权管理
查看>>
C/C++宏
查看>>
FFmpeg 学习(四):FFmpeg API 介绍与通用 API 分析
查看>>
C# action跳转
查看>>
orm分组,聚合查询,执行原生sql语句
查看>>
C#读写Accsess示例一
查看>>
锁的类型和兼容性
查看>>
C#网络编程之服务客户模式在控制台下的简单交互
查看>>
编译 php-memcache 扩展时提示Cannot find autoconf
查看>>
Linux进程状态
查看>>
炎炎夏日需要一个清凉的地 - 自制水冷系统(八 系统设计篇)
查看>>