生活随笔
收集整理的這篇文章主要介紹了
[蓝桥杯][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年第九届真题]日志统计(树状数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。