奶牛集會 luogu p2345

2021-09-25 15:06:54 字數 1141 閱讀 8303

題目描述

約翰的n 頭奶牛每年都會參加「哞哞大會」。哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆乾草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的座標為xi,沒有兩頭奶牛的座標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max×|xi − xj | 的音量,其中vi 和vj 分別是第i 頭和第j 頭奶牛的聽力。

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

輸入格式

• 第一行:單個整數n,1 ≤ n ≤ 20000

• 第二行到第n + 1 行:第i + 1 行有兩個整數vi 和xi,1 ≤ vi ≤ 20000; 1 ≤ xi ≤ 20000

輸出格式

• 單個整數:表示所有奶牛產生的音量之和

輸入輸出樣例

輸入 #1 複製

43 1

2 52 6

4 3輸出 #1 複製

57說明/提示

樸素o(n2)

類似於歸併排序的二分o(n logn)

樹狀陣列o(n logn)

為避免v重複而計算錯誤,需要寫兩個樹狀陣列

陣列a記錄個數,陣列b紀錄數本身,以便統計和

#include #include#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int n=50010;

ll a[n],b[n];//a為個數,b為和

ll n,m=0;

struct sa

p[n];

void update(ll *p,ll x,ll y)

ll sum(ll *p,ll x)

int cmp(sa a,sa b)

int main()

sort(p+1,p+n+1,cmp);//按v從小到大排序

ll ans=0;

for(int i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

Luogu P2345 奶牛集會

傳送門 這道題可以用分治的方法解決。lbgxld說是線段樹,但是我覺得分治快而且好寫.暴力列舉是 o n 2 想要優化,就不能一對一對列舉,最好能用乙隻奶牛一次計算一群其他的貢獻。這就需要考慮聽力 v 和座標大小 x 的關係,可以把它轉化為乙個二維偏序問題。首先把聽力 v 從大到小排序,控制一維。然...

luogu P2345 奶牛集會 排序 樹狀陣列

題目描述 約翰的n 頭奶牛每年都會參加 哞哞大會 哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆乾草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的座標為xi,沒有兩頭奶牛的座標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max xi xj 的音量,其中vi ...

P2345 奶牛集會

約翰的n 頭奶牛每年都會參加 哞哞大會 哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆乾草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的座標為xi,沒有兩頭奶牛的座標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max xi xj 的音量,其中vi 和vj 分...