日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

luoguP4755 Beautiful Pair

發布時間:2023/12/6 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luoguP4755 Beautiful Pair 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.luogu.org/problemnew/show/P4755

考慮分治,在 [l, r] 區間中用線段樹找到最大的一個點,處理經過它的可行數對的個數,統計個數可以離線樹狀數組處理

因為最多被分成 2n 個區間(像線段樹一樣),對于每個區間使用類似于啟發式合并的思想將要處理的區間放到 vector 里面,最多有 n log n 個查詢,復雜度 n log^2 n

#include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) using namespace std;typedef unsigned long long ull; typedef long long ll;template <typename _T> inline void read(_T &f) {f = 0; _T fu = 1; char c = getchar();while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}f *= fu; }const int N = 1e5 + 5;int Max[N << 2], wz[N << 2], a[N], pre[N], f[N]; long long ans; int n, len;void build(int u, int l, int r) {if(l == r) {Max[u] = a[l];wz[u] = l;return;}int mid = (l + r) >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);if(Max[u << 1] > Max[u << 1 | 1]) Max[u] = Max[u << 1], wz[u] = wz[u << 1];else Max[u] = Max[u << 1 | 1], wz[u] = wz[u << 1 | 1]; }int Q1, Q2;void query(int u, int l, int r, int L, int R) {if(l <= L && R <= r) {if(Max[u] > Q1) {Q1 = Max[u];Q2 = wz[u];}return;}int mid = (L + R) >> 1;if(mid >= l) query(u << 1, l, r, L, mid);if(mid + 1 <= r) query(u << 1 | 1, l, r, mid + 1, R); }int lowbit(int x) {return x & -x;} void add(int x) {for(int i = x; i <= n; i += lowbit(i)) f[i]++;} int query(int x) {int ans = 0; for(int i = x; i; i -= lowbit(i)) ans += f[i]; return ans;}struct ele {int l, r, v;bool operator < (const ele A) const {return v < A.v;}ele (int a, int b, int c) : l(a), r(b), v(c) {}ele () {} };vector <ele> Q; vector <int> t[N];void solve(int l, int r) {if(l > r) return;Q1 = 0; query(1, l, r, 1, n);int L = Q2 - l, R = r - Q2; int tmp = Q2;if(L < R) for(int i = l; i <= Q2; i++) { Q.push_back(ele(Q2, r, pre[Q1] / pre[a[i]])); }else for(int i = Q2; i <= r; i++) Q.push_back(ele(l, Q2, pre[Q1] / pre[a[i]]));solve(l, tmp - 1); solve(tmp + 1, r); }int main() {cin >> n;for(int i = 1; i <= n; i++) { read(a[i]), pre[i] = a[i]; };sort(pre + 1, pre + n + 1); len = unique(pre + 1, pre + n + 1) - pre - 1;for(int i = 1; i <= n; i++) a[i] = lower_bound(pre + 1, pre + len + 1, a[i]) - pre;build(1, 1, n); solve(1, n);for(vector <ele> :: iterator it = Q.begin(); it != Q.end(); it++) it -> v = upper_bound(pre + 1, pre + len + 1, it -> v) - pre - 1;for(int i = 1; i <= n; i++) t[a[i]].push_back(i);sort(Q.begin(), Q.end()); int LEN = Q.size(), now = 0;for(int i = 0; i <= len; i++) {for(vector <int> :: iterator it = t[i].begin(); it != t[i].end(); it++) add(*it);while(Q[now].v == i && now < LEN) {ans += (long long)(query(Q[now].r) - query(Q[now].l - 1));now++;}}cout << ans << endl;return 0; }

轉載于:https://www.cnblogs.com/LJC00118/p/9712365.html

總結

以上是生活随笔為你收集整理的luoguP4755 Beautiful Pair的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。