比較神仙的一道題。
第一問還比較簡單一點:
t是否可行是單調的,考慮二分。
考慮對於兩個人i,j合法的條件,設x(i)
那麼把x離散作為陣列下標,t時間後的位置作為值,合法的最多人數為最長上公升子串行。
將t時間後的位置再次離散,樹狀陣列維護即可。
注意此序列的下標為離散後的x,並不是輸入的『老司機』的id,在求解第二問的時候要特別注意。
只需要判斷最長上公升子串行的長度與k的關係即可。
第二問就比較噁心了:
考慮求解最長上公升子串行的同時記錄前驅,那麼可以找到一種合法的方案。
之後考慮字典序最小這條限制。
問題在於對於點i,之前可能有多個點是最大值,但是需要選擇排序之後字典序最小的乙個轉移。
考慮dp的轉移;乙個點只能有他之前的乙個點轉移過來,所以是乙個樹形結構。
設f[j]=f[k]且都可以轉移到i,那麼考慮轉移的樹形結構,j,k處於同意深度,且lca及以上的序列相同。
當j->lca這條路徑上的最小值小於k->lca這條路徑的最小值時j比k更優。
那麼只要倍增維護前驅及最小值即可。
用樹狀陣列維護,轉移和第一問類似。
#include#include#include#include#include#include#include#define int ll#define ll long long
using namespace std;
struct edge
ed[1000010];
int firs[100010],num_e;
#define f(x) firs[x]
struct node
}a[100010];
int n,k,ans,tx[100010];
bool v[100010];
vectoral1,al2;
struct tree
void add(int x,int y)
ll ask(int x)
}t;double a[200010],b[200010];ll c[200010],id[200010];int f[100010],pre[100010][26],prm[100010][26];
bool xy(int x,int y)
void add(int x,int y,int z) }
pair ask(int x)
return ans;
}}t2;
int solve(int t)
printf("%lld\n",l);
if(ans==2)
memset(f,0,sizeof(f));t2.clear();
for(int i=1;i<=n;i++)a[y(i)]=a[i].dis(l),b[y(i)]=a[y(i)],id[y(i)]=i;
sort(b+1,b+n+1);m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)c[i]=lower_bound(b+1,b+m+1,a[i])-b;
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
if(f[i]>=k)
if(!al1.size())
sort(al1.begin(),al1.end());
sort(al2.begin(),al2.end());
for(int j=0;jal1[j])break;
} sort(al1.begin(),al1.end());
for(int i=0;i'9')
while(a>='0'&&a<='9')
return s*f;
}
老司機 (優先佇列)
題目背景 mjj駕駛著一輛特斯拉跑車,他需要開llkm的路程到a市,跑車上有pp度電,卡車沒開1km就需要1度電,如果在途中電路耗盡,則無法前進到達終點。題目描述 在途中一共有nn個充電樁,第ii個充電樁在距離起點a ikm的位置,最多可以給汽車充b i度電,假設跑車的電瓶容量無限大,請問mjj是否...
bugku 秋名山老司機
這道題,存粹是為了練習python 首先開啟題目鏈結我們可以發現,頁面提示在兩秒內要返回那一串數字的計算結果,顯然,人類是很難做到的 這道題我看了下好多人都是正規表示式直接匹配出來的,不過我對正則不太熟悉,所以就用 requests 加 beautifulsoup4 做的 不太熟悉的可以看下官方文件...
老司機 iOS 週報 3
第三期的週報如願以償的在周一和大家見面了。前兩期的時候因為剛開始做不知道能否做到每週一更。小夥伴們在磨合了兩周之後也互相有了默契。希望我們能夠繼續陪伴大家一起成長。標題已經說明一切,為了照顧強迫症我隨手打幾個字給你。realm 雲服務新版本開始第一 測啦!只需要簡單的配置即可接入,現在就來試試吧 申...