二分查詢最近乙個比h小的數
1 #include2 #include3 #include4 #include5 #include6 #include7using
namespace
std;
8#define for0n for(i=0;i9
#define for1n for(i=1;i<=n;i++)
10#define for0m for(i=0;i11
#define for1m for(i=1;i<=m;i++)
12#define cl(a) memset(a,0,sizeof(a))
13#define w12 while(scanf("%d%d",&n,&m)!=eof)
14#define s12 scanf("%d%d",&n,&m);
15#define sa scanf("%d",a[i]);
16#define sb scanf("%d",b[i]);
17#define qq printf("*****\n");
18const
int maxn=1005;19
intn,m,tt;
20const
int maxn = 100010;21
int tree[20][maxn];//
表示每層每個位置的值
22int sorted[maxn];//
已經排序好的數
23int toleft[20][maxn];//
toleft[p][i]表示第i層從1到i有數分入左邊
24void build(int l,int r,int
dep)
2543
else
44 tree[dep+1][rpos++] =tree[dep][i];
45 toleft[dep][i] = toleft[dep][l-1] + lpos -l;46}
47 build(l,mid,dep+1
);48 build(mid+1,r,dep+1
);49}50
//查詢區間第k大的數,[l,r]是大區間,[l,r]是要查詢的小區間
51int query(int l,int r,int l,int r,int dep,int
k)52
62else
6368}69
int solve(int n,int s,int t,int
h)70
83else r=mid-1;84
}85return
ans;86}
87int
main()
88105 sort(sorted+1,sorted+n+1
);106 build(1,n,0
);107
ints,t,k;
108 printf("
case %d:\n
",ca);
109while(m--)
110116
}117
return0;
118 }
HDU4417(主席樹計數)
解題思路 如果說用排序,那麼複雜度就是o mnlogn 會超時。用主席樹的空間複雜度是o nlogn 時間複雜度是o max nlogn,mlogn 這道題稍微修改一下query函式即可。include include include include define n 100009 using na...
HDU 4417 (二分 區間第k大)
查詢區間 l,r 中有多少數 比給定的 h 小。我們可以這麼想,h 一定會比 區間的第 x 大 第 x 1 小。怎麼確定 x。這是乙個單調的問題,所以二分 區間第 k 大就可以確定了。include include include include using namespace std const ...
HDU 4417 水題 樹狀陣列
題目大意 給n個數字,m個詢問 每次詢問 l,r 區間的數字,比k小的數字有多少個。下標從0 n 1 直接離線後樹狀陣列,聽說劃分樹也能過 略微更新的我的破爛離散化小板子 include using namespace std define pr x cout x vectormp maxn voi...