[USACO 04OPEN]MooFest
阿新 • • 發佈:2018-01-20
sample swa putc pre include write time 整數 blog
Description
約翰的N 頭奶牛每年都會參加“哞哞大會”。哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆幹草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的坐標為Xi,沒有兩頭奶牛的坐標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max{Vi; Vj}×|Xi − Xj | 的音量,其中Vi 和Vj 分別是第i 頭和第j 頭奶牛的聽力。假設每對奶牛之間同時都在說話,請計算所有奶牛產生的音量之和是多少。
Input
• 第一行:單個整數N,1 ≤ N ≤ 20000
• 第二行到第N + 1 行:第i + 1 行有兩個整數Vi 和Xi,1 ≤ Vi ≤ 20000; 1 ≤ Xi ≤ 20000
Output
• 單個整數:表示所有奶牛產生的音量之和
Sample Input
4
3 1
2 5
2 6
4 3
Sample Output
57
題解
開四個樹狀數組。
第一個為以 $V$ 為關鍵詞,牛個數的前綴;
第二個為以 $V$ 為關鍵詞, $X$ 的前綴;
第三個為以 $V$ 為關鍵詞, $V$ 的前綴;
第四個為以 $V$ 為關鍵詞, $X\times V$ 的前綴。
然後掃一遍隨便亂搞就好了。
1 //It is made by Awson on 2018.1.20 2 #include <set> 3 #include <map> 4#include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15#define LL long long 16 #define Abs(a) ((a) < 0 ? (-(a)) : (a)) 17 #define Max(a, b) ((a) > (b) ? (a) : (b)) 18 #define Min(a, b) ((a) < (b) ? (a) : (b)) 19 #define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b)) 20 #define writeln(x) (write(x), putchar(‘\n‘)) 21 #define lowbit(x) ((x)&(-(x))) 22 using namespace std; 23 const int N = 20000; 24 void read(int &x) { 25 char ch; bool flag = 0; 26 for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == ‘-‘)) || 1); ch = getchar()); 27 for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar()); 28 x *= 1-2*flag; 29 } 30 void write(LL x) { 31 if (x > 9) write(x/10); 32 putchar(x%10+48); 33 } 34 int n; 35 struct tt { 36 int v, x; 37 bool operator < (const tt &b) const {return x < b.x; } 38 }a[N+5]; 39 struct bittree { 40 LL c[N+5]; 41 void add(int x, int val) {for (; x <= N; x += lowbit(x)) c[x] += val; } 42 LL query(int x) { 43 LL ans = 0; 44 for (; x; x -= lowbit(x)) ans += c[x]; 45 return ans; 46 } 47 }T1, T2, T3, T4; //T1 tol, T2 tolx, T3 tolt, T4 tolx*t 48 49 void work() { 50 read(n); for (int i = 1; i <= n; i++) read(a[i].v), read(a[i].x); 51 sort(a+1, a+n+1); LL ans = 0; 52 for (int i = 1; i <= n; i++) { 53 ans += (T1.query(a[i].v)*a[i].x-T2.query(a[i].v))*a[i].v; 54 ans += (T3.query(N)-T3.query(a[i].v))*a[i].x-(T4.query(N)-T4.query(a[i].v)); 55 T1.add(a[i].v, 1), T2.add(a[i].v, a[i].x), T3.add(a[i].v, a[i].v), T4.add(a[i].v, a[i].x*a[i].v); 56 } 57 writeln(ans); 58 } 59 int main() { 60 work(); 61 return 0; 62 }
[USACO 04OPEN]MooFest