1. 程式人生 > >USACO 2004 MooFest 奶牛集會

USACO 2004 MooFest 奶牛集會

i++ cmp 當前 大會 const con 交流 數組 int

題目

問題描述

約翰的n 頭奶牛每年都會參加“哞哞大會”。哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆幹草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的坐標為Xi,沒有兩頭奶牛的坐標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max{Vi;Vj}×|Xi?Xj| 的音量,其中Vi和Vj分別是第i 頭和第j 頭奶牛的聽力。

假設每對奶牛之間同時都在說話,請計算所有奶牛產生的音量之和是多少。

輸入文件

第1行:一個整數n(1n20,000)

第2..n+1行:第i+1行有兩個整數Vi(1Vi20,000)和Xi(1Xi20,000)

輸出文件

僅一行:一個整數表示所有奶牛產生的音量之和。

樣例輸入輸出

moofest.in

4
3 1
2 5
2 6
4 3

moofest.out

57

分析

樸素暴力枚舉:枚舉i,j,O(n2)。N最大到20000,放棄吧。

首先來觀察一下這個音量的計算公式:首先在兩只牛的聽力v當中取較大值,然後和兩者的坐標差相乘。

既然取較大的v,我們不妨把所有奶牛按照v從大到小排序。這樣每次取出的奶牛和它右邊的奶牛計算即可。

然後再來看如何處理坐標差。因為當前選出的這頭奶牛一定是和它右邊,也就是較小的奶牛進行計算,所以公式的第一部分是一個定值。那麽我們不難想到在這裏可以合並同類項。對於一個奶牛它所對應的左半邊音量之和的公式就是:當前奶牛聽力*(左邊奶牛的個數*當前奶牛的坐標-左邊所有奶牛的坐標和)。右邊也就不難同理得出了。

要計算坐標和,那就樹狀數組唄。

程序

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 20000 + 1;
 4 struct node
 5 {
 6     int x,v,id;
 7 }cow[MAXN];
 8 struct Tree
 9 {
10     long long sum,num;
11 }c[MAXN];
12 int n;
13 bool cmpv(node a,node b)
14 {
15     return a.v>b.v;
16 }
17 bool comp(node a,node b)
18 { 19 return a.x<b.x; 20 } 21 long long ans=0; 22 int main() 23 { 24 freopen("moofest.in","r",stdin); 25 freopen("moofest.out","w",stdout); 26 scanf("%d",&n); 27 for(int i = 1; i <= n; i++) 28 scanf("%d%d",&cow[i].v,&cow[i].x); 29 sort(cow+1,cow+n+1,comp); 30 for(int i = 1; i <= n; i++) 31 { 32 cow[i].id = i; 33 for(int j = i; j <= n; j += j&-j) 34 { 35 c[j].sum+=cow[i].x; 36 c[j].num++; 37 } 38 } 39 sort(cow+1,cow+n+1,cmpv); 40 long long ans=0; 41 for (int i = 1; i <= n; i++) 42 { 43 long long sum = 0, num = 0; 44 for(int j = cow[i].id; j > 0; j -= j&-j) 45 { 46 sum += c[j].sum; 47 num += c[j].num; 48 } 49 ans += (num*cow[i].x-sum)*cow[i].v; 50 sum =- sum, num=-num; 51 for (int j = n; j > 0; j -= j&-j) 52 { 53 sum += c[j].sum; 54 num += c[j].num; 55 } 56 ans += (sum-num*cow[i].x)*cow[i].v; 57 for(int j = cow[i].id; j <= n; j += j&-j) 58 { 59 c[j].sum -= cow[i].x; 60 c[j].num--; 61 } 62 } 63 printf("%lld",ans); 64 return 0; 65 }

USACO 2004 MooFest 奶牛集會