【BZOJ1071】【SCOI2007】組隊 利用單調性的雙指標
連結:
#include <stdio.h>
int main()
{
puts("轉載請註明出處[vmurder]謝謝");
puts("網址:blog.csdn.net/vmurder/article/details/45746089");
}
題解:
三個定義:高度h,v速度,Ah+Bv為s
首先我們在外圈列舉來固定其中一個權值,姑且列舉v吧。每次列舉值大寫為V。
然後在內圈就可以做單調佇列了。
我們列舉讓h遞增,每次為H,然後發現原來的式子要滿足
Ah+Bv<=C+AH+BV
。
然後 H增大會使得右式增大,然後如果我們按s(定義去題解第一句話找)為鍵值從小到大排序,那麼滿足此式的隊員是單調上升的。
然後 我們單調地每次把滿足此式子的隊員加入佇列,判斷如果其v值滿足條件
V<=v<=V+\frac{C}{B}
,則把它計數,即此種列舉情況時的ans++。( v<=V+\frac{C}{B}
為什麼對?如果 v>V+\frac{C}{B}
,則 Bv-BV>C
然後你懂得)【加入環節】
然後 會有一些被計數的隊員身高式子存在
h<H
,我們從前往後單調地把身高不滿足上式的出隊,如果之前被計數了,則此種列舉情況時的ans- -。【彈出環節】
這樣比較一下這
n^2
個答案,我們就在 O(n^2)
的時間複雜度下解決了這道題。
但是?【彈出環節】是否會彈出一些【加入環節】沒有加入的點呢?
讓我來猜一猜,你的答案一定是”不會“吧?
然而答案是會,但是這種點並不會影響答案。
分類討論下
首先如果一個點滿足被計數的條件即
V<=v<=V+\frac{C}{B}
,那麼如果又滿足 h<H
那麼有 0+B(v-V)<=C
,而A(h-H)則一定<0
。 所以
A(h-H)+B(v-V)<=C
。。。。。。所以一定加進來然後被計數過,不會減多了。
然後如果不滿足被計數的條件。23333,都沒有被計數我們管它作甚?
程式碼:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5050
using namespace std;
int n,A,B,C;
int Max,Min,l,r,cnt,ans;
struct KSD
{
int h,v,s;
void keep(){s=A*h+B*v;}
}x[2][N];
inline bool cmph(const KSD &a,const KSD &b){return a.h<b.h;}
inline bool cmps(const KSD &a,const KSD &b){return a.s<b.s;}
inline bool check(int id,int d)
{return x[id][d].v<=Max&&x[id][d].v>=Min;}
int main()
{
int i,j,k;
scanf("%d%d%d%d",&n,&A,&B,&C);
for(i=1;i<=n;i++)
{
scanf("%d%d",&x[0][i].h,&x[0][i].v);
x[0][i].keep(),x[1][i]=x[0][i];
}
sort(x[0]+1,x[0]+n+1,cmph);
sort(x[1]+1,x[1]+n+1,cmps);
for(i=1;i<=n;i++) // 列舉v最小值
{
Min=x[0][i].v,Max=Min+C/B;
l=r=cnt=0;
for(j=1;j<=n;j++) // 列舉h最小值
{
while(r<n&&x[1][r+1].s-A*x[0][j].h-B*x[0][i].v<=C)
cnt+=check(1,++r);//按照s排序取出可行隊員
while(l<n&&x[0][l+1].h<x[0][j].h)cnt-=check(0,++l);
ans=max(ans,cnt);//再幹掉一些當初入隊時計數了的隊員
}
}
printf("%d\n",ans);
return 0;
}
相關文章
- 雙指標指標
- 雙指標法指標
- 雙指標(下標)的應用指標
- 雙指標法相關的題指標
- 雙指標演算法的一個簡單題解指標演算法
- 演算法-雙指標演算法指標
- 滑動視窗與雙指標指標
- 雙指標維護筆記指標筆記
- 力扣之迴文數(雙指標中的對撞指標公式模板)力扣指標公式
- 工程團隊的10大評估指標指標
- 衡量銷售團隊的12個指標指標
- Linus:利用二級指標刪除單向連結串列指標
- 雙指標相關演算法指標演算法
- 6.12.雙指標專題指標
- 雙指標習題:Kalindrome Array指標
- 雙指標妙解三數之和指標
- 簡單4步,利用Prometheus Operator實現自定義指標監控Prometheus指標
- 函式指標簡單的列子函式指標
- 圖解兩數之和:雙指標法圖解指標
- 組織計量學--指標學指標
- 【指標】-簡單回顧指標
- 利用指標實現strncmp函式功能指標函式
- 顯示你個性的滑鼠指標(轉)指標
- 第八章 善於利用指標指標
- NULL 指標、零指標、野指標Null指標
- 藍橋杯-遞增三元組(三種解法,二分, 雙指標, 字首和)指標
- 單調佇列雙端佇列佇列
- C++中的可見性 指標 筆記C++指標筆記
- 常見演算法技巧之——雙指標思想演算法指標
- 「LeetCode Top100」之雙指標LeetCode指標
- 決策單調性DP
- 利用順序儲存結構實現雙端佇列的入隊和出隊操作佇列
- DevOps 團隊必備的 3 種指標儀表板dev指標
- 如何高效利用 Grafana 監控分析 TiDB 指標GrafanaTiDB指標
- C++智慧指標簡單剖析C++指標
- 如何更好地利用git lab組織團隊開發Git
- 野指標 空指標指標
- 利用人工智慧提升團隊包容性人工智慧