usaco 奶牛集会 && 奶牛抗议
奶牛集会
Description
约翰家的N头奶牛每年都会参加“哞哞大会” 。哞哞大会是世界奶牛界的盛事。集会上 的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。当然,哞哞大叫肯定也包括在内。 奶牛们的叫声很大,很多奶牛在参加多年活动之后,实际上已经失去了一部分的听力。
奶牛们已经站在了一条直线上,i号奶牛的坐标为Xi,她只能听到大于Vi的声音。每头奶 牛的位置坐标都是唯一的。
如果i号和j号奶牛想对话,则他们使用的音量为max {Vi, Vj} × |Xi −Xj|
N头奶牛可以组合成N(N − 1)/2对奶牛,假设每对奶牛都使用最小的音量在对话,请计 算所有奶牛产生的总音量是多少。
Input Format
第一行:单个整数:N,1 ≤ N ≤ 20000
第二行到第N + 1行:每行有两个用空格分开的整数,Vi和Xi,1 ≤ Vi ≤ 20000, 1 ≤ Xi ≤ 20000
Output Format
第一行:单个整数,表示最小音量之和
----------------------------------------------------------
正解=线段树(其实用树状数组也可以)
注意到max{vi,vj}中,显然只有大的才有贡献
将 vi 从小到大排序一一进树:
设当前做到 i
先统计当前线段树中比xi大的个数num1及和sum1,ans+=vi*(sum1-num1*xi)
再统计当前线段树中比xi小的个数num2及和sum2,ans+=vi*(num2*xi-sum2)
将 xi 插入线段树
Ps.好像很都存在两个相对大小变量的题,按其中一个变量排序后,题目都会变得很愉悦~
代码如下:
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- #include<string>
- #include<iostream>
- #define INF 9999999
- #define LL long long
- using namespace std;
- struct Point{
- int x;
- long long v;
- }a[];
- bool cmp(const Point&X,const Point&Y){
- return X.v<Y.v;
- }
- int Min=INF,Max=-INF;
- int L,R,o,n;
- long long sum[],num[];
- long long now,ans;
- long long query(int root,int l,int r){
- if(!num[root]) return ;
- if(L<=l&&r<=R)
- return sum[root]-num[root]*now;
- int mid=(l+r)>>;
- long long t=;
- if(mid>=L) t+=query(root<< ,l ,mid);
- if(mid<R) t+=query(root<<|,mid+,r);
- return t;
- }
- void insert(int root,int l,int r,int p){
- sum[root]+=p;
- num[root]++;
- if(l==r) return ;
- int mid=(l+r)>>;
- if(mid>=p) insert(root<<,l,mid,p);
- else insert(root<<|,mid+,r,p);
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- scanf("%lld%d",&a[i].v,&a[i].x);
- Min=min(a[i].x,Min);
- Max=max(a[i].x,Max);
- }
- sort(a+,a++n,cmp);
- LL T=;
- for(int i=;i<=n;i++){
- now=a[i].x;
- L=a[i].x ; R=Max;
- ans+=a[i].v*query(,Min,Max);
- L=Min ; R=a[i].x;
- ans-=a[i].v*query(,Min,Max);
- insert(,Min,Max,a[i].x);
- }
- printf("%lld",ans);
- }
-----------------------------------------------------------------------------------
奶牛抗议
Description
约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动。第i头奶牛的理智度 为Ai,Ai可能是负数。约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组,每个小组内的奶牛的理智度总和都要大于零。由于奶牛是按直线排列的,所以 一个小组内的奶牛位置必须是连续的。
请帮助约翰计算一下,存在多少种不同的分组的方案。由于答案可能很大,只要输出答 案除以1,000,000,009的余数即可。
Input Format
第一行:单个整数:N,1 ≤ N ≤ 10^6
第二行到N + 1行:在第i + 1行有一个整数:Ai,表示第i头奶牛的理智度,−10^5 ≤ Ai ≤ 10^5
Output Format
第一行:单个整数,表示分组方案数除以1,000,000,009的余数
--------------------------------------------------------------------------------------------------
正解=离散化+树状数组,
和上一题有异曲同工之妙~
设f[i] 为到第 i 只奶牛有几种分组,
设sum[i]为奶牛的前缀和
显然 f[i]= ∑f[j](sum[i]-sum[j]>=0)
注意到条件可以转化为 sum[i]>=sum[j],
f[i]=在 i 前 sum[j] 小于 sum[j] 的 f[i] 的和
可以用树状数组求和(由于只有单点修改,用树状数组比较方便 >_<)
sum中显然有许多无用间隔,离散之,
代码如下:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<queue>
- #include<iostream>
- #define INF 999999999999
- #define LL long long
- #define N 1000002
- #define key 1000000009
- //using namespace std ;
- struct Cow{
- LL sum;
- int p;
- }a[N];
- bool cmp(const Cow &x,const Cow &y){
- return x.sum<y.sum;
- }
- int L,R,P,n,p[N];
- LL sum[N];
- int lowbit(int x){
- return x&(-x);
- }
- void update(int x,LL val){
- while(x<=n){
- sum[x]=(sum[x]+val)%key;
- x+=lowbit(x);
- }
- }
- LL cal(int x){
- LL temp=;
- while(x){
- temp=(temp+sum[x])%key;
- x-=lowbit(x);
- }
- return temp;
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- LL val;
- scanf("%I64d",&val);
- a[i].sum=a[i-].sum+val;
- a[i].p=i;
- }
- a[n+].sum=;
- a[n+].p=n+;
- std :: sort(a+,a+n+,cmp);
- int t=;
- for(int i=;i<=n+;i++){
- if(i==||a[i].sum!=a[i-].sum) ++t;
- p[a[i].p]=t;
- }
- update(p[n+],);
- LL temp=;
- for(int i=;i<=n;i++){
- temp=cal(p[i]);
- update(p[i],temp);
- }
- printf("%I64d",temp);
- }
usaco 奶牛集会 && 奶牛抗议的更多相关文章
- 洛谷 P2345 奶牛集会 解题报告
P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...
- AC日记——奶牛集会 洛谷 P2345
奶牛集会 思路: 把奶牛按照v排序: 然后,每次都把奶牛放入一个集合s: 因为奶牛已经排序: 所以,每次第i次放入奶牛起作用的v就是vi: 每次ans+=(xi*sum-sumxl)*vi+(sumx ...
- luogu P2345 奶牛集会
二次联通门 : luogu P2345 奶牛集会 /* luogu P2345 奶牛集会 权值线段树 以坐标为下标, 坐标为值建立线段树 对奶牛按听力由小到大排序 对于要查的牛 每次第i次放入奶牛起作 ...
- [USACO] 2004 Open MooFest 奶牛集会
题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等 ...
- 洛谷P2345 奶牛集会
题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚 ...
- 洛谷 P2345 奶牛集会
https://www.luogu.org/problem/show?pid=2345 题目描述 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅 ...
- 【树状数组】【P2345】 奶牛集会
传送门 Description 约翰的\(N\)头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在 ...
- p2345 奶牛集会
传送门 题目 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶 ...
- P2345 奶牛集会andP2657 低头一族
做法是一样的 题目背景 MooFest, Open 题目描述 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时 ...
随机推荐
- Shell数组
#!/bin/bash#数组的使用#数组赋值方式:#1. user[index]=value index为0,1,2,3,4....数组下标值#2. user=(value0 value1 value ...
- jquery 缓冲加载图片插件 jquery.lazyload
第一:加入jquery 第二:加入jquery.lazy.load.js文件 第三:在网页中加<script> $(document).ready(function(){ $(" ...
- yii2源码学习笔记(十四)
Module类是模块和应用类的基类. yiisoft\yii2\base\Module.php <?php /** * @link http://www.yiiframework.com/ * ...
- PHP图片上传程序(完整版)
从PHP100上搜刮来的,功能很强大.几乎考虑到了每个细节,与大家分享!~~~ <meta http-equiv="Content-Type" content="t ...
- OC 之 const
1. 修饰变量 一般设置传参数的时候 若设置为const, 则在调用过程中不允许修改参数值;(readonly) // *前const: 不能通过指针, 改变p指向的值 const int *p = ...
- aspx、ashx以及cs的关系,viewState
aspx和ashx关系:aspx就是一种特殊的ashx,aspx对应的类是page,它是实现了IHttpHandler接口,所以说aspx是高级的HttpHandler.aspx中帮我们封装了很多操作 ...
- Bootstrap 分页插件 ajax获取数据显示
Bootstrap 分页插件 ajax获取数据显示 标签(空格分隔): bootstrap 文章的内容是使用bootstrap-paginator进行分页,使用ajax获取后台数据.渲染. 1. 版本 ...
- BZOJ 1044
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1393 Solved: 497[Submit][Statu ...
- COGS 577 蝗灾 [CDQ分治入门题]
题目链接 昨天mhr神犇,讲分治时的CDQ分治的入门题. 题意: 你又一个w*w正方形的田地. 初始时没有蝗虫. 给你两个操作: 1. 1 x y z: (x,y)这个位置多了z只蝗虫. 2. 2 x ...
- 偶尔转帖:AI会议的总结(by南大周志华)
偶尔转帖:AI会议的总结(by南大周志华) 说明: 纯属个人看法, 仅供参考. tier-1的列得较全, tier-2的不太全, tier-3的很不全. 同分的按字母序排列. 不很严谨地说, tier ...