POJ 3264 Balanced Lineup
| Time Limit: 5000MS | ? | Memory Limit: 65536K |
| Total Submissions: 53629 | ? | Accepted: 25223 |
| Case Time Limit: 2000MS | ||
Description
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
Input
Line 1: Two space-separated integers, N and Q.Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
Output
Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.Sample Input
6 3 1 7 3 4 2 5 1 5 4 6 2 2Sample Output
6 3 0典型RMQ問(wèn)題,目前只會(huì)寫(xiě)數(shù)組類(lèi)線段樹(shù),但這道題需要存最大最小值,結(jié)構(gòu)體類(lèi)型線段樹(shù)不是很熟,所以果斷寫(xiě)了RMQ
時(shí)間:3694ms #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <vector> #include <set> #include <map> #include <algorithm> using namespace std; typedef long long ll; #define N 50006 int maxx[N][25],minx[N][25]; int n,m,x,y; void get_RMQ() {for(int i=1;i<=n;i++){scanf("%d",&x);maxx[i][0]=x;minx[i][0]=x;}for(int j=1;(1<<j)<=n;j++){for(int i=1;i+(1<<j)-1<=n;i++){maxx[i][j]=max(maxx[i][j-1],maxx[i+(1<<(j-1))][j-1]);//存最大值minx[i][j]=min(minx[i][j-1],minx[i+(1<<(j-1))][j-1]);//存最小值 }} } int get_K(int l,int r) {if(l>r) return 0;int k=0;while(1<<(1+k)<=r-l+1) k++;return k;//查找區(qū)間即j } int RMQUPPER(int l,int r,int k) {return max(maxx[l][k],maxx[r-(1<<k)+1][k]); } int RMQLOWER(int l,int r,int k) {return min(minx[l][k],minx[r-(1<<k)+1][k]); } int main() {scanf("%d%d",&n,&m);get_RMQ();while(m--){int k;scanf("%d%d",&x,&y);k=get_K(x,y);printf("%d\n",RMQUPPER(x,y,k)-RMQLOWER(x,y,k));} }
再來(lái)一個(gè)線段樹(shù)代碼,注意必須兩次查詢,一次查最大,一次查最小,我想把最大最小值相減差值保存在結(jié)構(gòu)體中,只查詢一次,但這樣會(huì)wrong answer
見(jiàn)代碼注釋部分
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <vector> #include <set> #include <map> #include <algorithm> using namespace std; typedef long long ll; #define N 50009 #define mod 0x3f3f3f3f int n,m,x,y; struct Node {int mx;int mn;//int mxn; }tree[N*4]; void buildtree(int l,int r,int node) {int mid=(l+r)>>1;if(l==r){scanf("%d",&tree[node].mx);tree[node].mn=tree[node].mx;//tree[node].mxn=tree[node].mx-tree[node].mn;return;}buildtree(l,mid,node<<1);buildtree(mid+1,r,(node<<1)+1);tree[node].mx=max(tree[node<<1].mx,tree[(node<<1)+1].mx);tree[node].mn=min(tree[node<<1].mn,tree[(node<<1)+1].mn);//tree[node].mxn=tree[node].mx-tree[node].mn; } int queryu(int l,int r,int ll,int rr,int node) {int k=0;int mid=(ll+rr)>>1;if(l<=ll && r>=rr) return tree[node].mx;if(l<=mid) k=max(k,queryu(l,r,ll,mid,node<<1));if(r>mid) k=max(k,queryu(l,r,mid+1,rr,(node<<1)+1));return k; } int queryt(int l,int r,int ll,int rr,int node) {int k=mod;int mid=(ll+rr)>>1;if(l<=ll && r>=rr) return tree[node].mn;if(l<=mid) k=min(k,queryt(l,r,ll,mid,node<<1));if(r>mid) k=min(k,queryt(l,r,mid+1,rr,(node<<1)+1));return k; } int main() {scanf("%d%d",&n,&m);buildtree(1,n,1);while(m--){scanf("%d%d",&x,&y);printf("%d\n",queryu(x,y,1,n,1)-queryt(x,y,1,n,1));}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7131824.html
總結(jié)
以上是生活随笔為你收集整理的POJ 3264 Balanced Lineup的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaScript之图片的无缝滚动
- 下一篇: form + iframe 获取表单提