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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Educational Codeforces Round 41(已补D,E)

發布時間:2024/6/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Educational Codeforces Round 41(已补D,E) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

D. Pair Of Lines

題目大意:

\(n\)個點,問是否存在兩條直線(可以為同一條)能覆蓋所有的點。

解題思路:

首先一個或者兩個或者三個點都是肯定可以用兩條線覆蓋的。
如果點的個數大于等于三個,那么我們已經可以確定至少一條線的:
點1和點2可能在一條線上,點2和點3可能在一條線上,點3和點1可能在一條線上。
我們試著確定其中一條線后,去掉在線上的所有點,剩下的點肯定在另一條線上,這樣利用剩下的點就可以確定另一條直線。
用到一個公式:\(abc\)三點共線\((c - a)\times(c - b)=0\)

E. Tufurama

題目大意:

\(n\)個數的數列\(a\),問有多少對下標\(x,y(x<y)\),使得\(a[x]\geq y,a[y]\geq x\)

解題思路:

大體思路是先遍歷一遍數組,求出\(a[y]\geq x\)中最大的下標\(x\)
然后再遍歷一遍數組,用樹狀數組求出\(a[x]\geq y\)的所有\(x\)
最大可能下標可以這樣求:\(x=max\{a[y],y-1\}\)
為什么要求最大呢?因為是為了配合樹狀數組的求和,這樣就不會重復。
每次求到的最大下標\(x\)對應的\(y\)可以用\(vector\)保存。
因為每個\(y\)只能出現一次,所以時間復雜度為\(O(nlogn)\)

#include <bits/stdc++.h> #define N 200010int n, a[N];struct bit {static const int maxn = N;int f[maxn];inline void init() { std::fill(f, f + maxn, 0); }bit() { init(); }inline void add(int pos, int inc) {for (; pos < maxn; pos += (pos & -pos)) f[pos] += inc;}inline int sum(int rg) {if (rg < 1) return 0;int ans = 0;for(; rg; rg -= (rg & -rg)) ans += f[rg];return ans;}inline int sum(int l, int r) {return sum(r) - sum(l - 1);} }mybit;std::vector<int> mpos[N];int main() {while (std::cin >> n) {for (int i = 0; i <= n; i++) mpos[i].clear();for (int i = 1; i <= n; i++) {std::cin >> a[i];a[i] = a[i] > n ? n : a[i];mpos[std::min(a[i], i - 1)].push_back(i);}mybit.init();long long ans = 0;for (int i = 1; i <= n; i++) {mybit.add(a[i], 1);for (int x: mpos[i]) ans += mybit.sum(x, n);}std::cout << ans << '\n';}return 0; }

轉載于:https://www.cnblogs.com/ZengWangli/p/8804837.html

總結

以上是生活随笔為你收集整理的Educational Codeforces Round 41(已补D,E)的全部內容,希望文章能夠幫你解決所遇到的問題。

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