中文題有點長,就不誤導大家了...
先預處理出一下量:
f[i][j][k]:從城市 j 出發,k 先走,走
da[i][j][k]:從城市 j 出發,k 先走,走db[i][j][k]:從城市 j 出發,k 先走,走求出上述結果後,我們就可以利用倍增以下面給出上述結果的求解方法.
倒序列舉城市 i,二分可以找出第乙個高度大於等於城市 i 的城市,左右尋找即可.
void init_g()
else if(d < sm)
++j;
}ga[i] = smi, gb[i] = mni;
st.emplace(make_pair(h[i], i));}}
f[i][j][k]:從城市 j 出發,k 先走,走i = 0:f[0][j][0] = ga[j], f[0][j][1] = gb[j];i = 1:f[1][j][k] = f[0, f[0][j][0], 1 - k];
i > 1:f[i][j][k] = f[i - 1][f[i - 1][j][k]][k];
void init_f()
for(int j = 1; j <= n; ++j)
}for(int i = 2; i < n; ++i)}}
}
da[i][j][k]:從城市 j 出發,k 先走,走db[i][j][k]:從城市 j 出發,k 先走,走首先定義函式 get_dist(i, j) = abs(h[i] - h[j]);
i = 0:da[0][j][0] = get_dist(j, ga[j]), da[0][j][1] = 0;
db[0][j][0] = 0, db[0][j][1] = get_dist(j, gb[j]);
i = 1:da[1][j][k] = da[0][j][k] + da[0][f[0][j][k]][1 - k];
db[1][j][k] = db[0][j][k] + db[0][f[0][j][k]][1 - k];
i > 1:da[i][j][k] = da[i - 1][j][k] + da[i - 1][f[i - 1][j][k]][k];
db[i][j][k] = db[i - 1][j][k] + db[i - 1][f[i - 1][j][k]][k];
int get_dist(int i, int j)
void init_d()
for(int j = 1; j <= n; ++j)
}for(int i = 2; i < n; ++i)}}
}
#include using namespace std;
typedef long long ll;
const int m = (int)1e5;
const int n = (int)17;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n;
int h[m + 5];
int ga[m + 5], gb[m + 5];
int f[n][m + 5][2];
ll da[n][m + 5][2], db[n][m + 5][2];
void read()
void init_g()
else if(d < sm)
++j;
}ga[i] = smi, gb[i] = mni;
st.emplace(make_pair(h[i], i));
}}void init_f()
for(int j = 1; j <= n; ++j)
}for(int i = 2; i < n; ++i)}}
}int get_dist(int i, int j)
void init_d()
for(int j = 1; j <= n; ++j)
}for(int i = 2; i < n; ++i)}}
}void init()
void cal(int s, int x, int& la, int& lb)
}}void work()
}printf("%d\n", ans);
int m;
scanf("%d", &m);
while((m--) > 0)
}int main()
《演算法競賽高階指南》 防曬
有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...
《演算法競賽高階指南》蚯蚓
蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...
演算法競賽高階指南筆記
原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 其中,第一位為1是負數 1 0000 0001 原 1 1000 0001 原 因此,8位二進位制數的取值範圍 127,127 補碼正數的補碼是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取...