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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[蓝桥杯][2018年第九届真题]日志统计(树状数组)

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][2018年第九届真题]日志统计(树状数组) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
小明維護著一個程序員論壇。現在他收集了一份"點贊"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts時刻編號id的帖子收到一個"贊"。

現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少于K個贊,小明就認為這個帖子曾是"熱帖"。

具體來說,如果存在某個時刻T滿足該帖在[T, T+D)這段時間內(注意是左閉右開區間)收到不少于K個贊,該帖就曾是"熱帖"。

給定日志,請你幫助小明統計出所有曾是"熱帖"的帖子編號。
輸入
第一行包含三個整數N、D和K。
以下N行每行一條日志,包含兩個整數ts和id。

對于50%的數據,1 <= K <= N <= 1000
對于100%的數據,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000
輸出
按從小到大的順序輸出熱帖id。每個id一行。
樣例輸入
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
樣例輸出
1
3
思路:將每一個帖子出現的時間保存起來,將每一個時間更新到樹狀數組中,然后遍歷每一個時間,判斷這個時間之后d時間內的帖子個數。這道題目有一個地方,就是d的大小不知道,因此d有可能很大,有可能超出界限,如果超出界限直接取最大值再計算就好了。(超出界限有可能爆內存,因為這個錯了好多次,yyy)
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e5+100; int c[maxx]; vector<int> p[maxx]; int n,d,k;inline int lowbit(int x){return x&-x;} inline void update(int x,int v) {while(x<maxx){c[x]+=v;x+=lowbit(x);} } inline ll query(int x) {ll ans=0;while(x){ans+=(ll)c[x];x-=lowbit(x);}return ans; } int main() {scanf("%d%d%d",&n,&d,&k);int ts,id;memset(c,0,sizeof(c));set<int> s;s.clear();for(int i=1;i<=n;i++){scanf("%d%d",&ts,&id);s.insert(id);p[id].push_back(ts+1);}vector<int> ans;ans.clear();for(set<int> ::iterator it=s.begin();it!=s.end();it++){id=*it;for(int i=0;i<p[id].size();i++) update(p[id][i],1);for(int i=0;i<p[id].size();i++){ll zz=query(min(p[id][i]+d-1,maxx-1))-query(p[id][i]-1);if(zz>=k){ans.push_back(id);break;}}for(int i=0;i<p[id].size();i++) update(p[id][i],-1);}sort(ans.begin(),ans.end());for(int i=0;i<ans.size();i++) printf("%d\n",ans[i]);return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的[蓝桥杯][2018年第九届真题]日志统计(树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。

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