JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Input
Output
Sample Input
3 5 3
1
3
5
Sample Output
1
2
3
Data Constraint
Solution
首先我們二分答案 mid ,那么可以發現這個 mid 排序后的位置最右為:
S=∑i=1n?midi?其實就是將小于等于它的數的個數相加。但是這樣復雜度為 O(N?log?N) ,顯然會超時。
于是我們想到這個的經典解法——分塊。
由于上式中 ?midi? 事實上有很多值是相同的,且值的數量不超過 O(n√) 。
所以我們跳著跳著地一段一段加,每次 i 跳到 ?mid?midi??+1
統計時就整個區間統計。時間復雜度 O(n√?log?n) 。
Code
#include<cstdio> #include<algorithm> using namespace std; const int N=5001; int n,m,k; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline int min(int x,int y) {return x<y?x:y; } inline bool check(int x) {long long pos=0;//for(int i=1;i<=n;i++) pos+=x/i;for(int i=1,p,mx=min(n,x);i<=mx;i=p+1){p=x/(x/i);pos+=(long long)(p-i+1)*(x/i);}return pos>=k; } int main() {n=min(read(),read());int q=read();while(q--){int l=1,r=k=read(),ans;while(l<=r){int mid=(l+r)>>1;if(check(mid)) ans=mid,r=mid-1; else l=mid+1;}printf("%d\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5434. 【NOIP2017提高A组集训10.30】Matrix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5435. 【NOIP2017
- 下一篇: JZOJ 5436. 【NOIP2017