題目:
簡單說明題意:
給出a陣列,v[i]為滿足a[i] == a[j] && i < j的最小的j。
然後多次給出l, r,求區間l~r間最小的v[i]。
我們第乙個想法是遍歷,很好,可以排除掉它了。
接下來開始分析。
a沒有被修改過,也就是說可以預處理一下。
那麼分塊怎麼樣?
先找乙個k,隨意地把它設為塊的大小。
然後離散化(通俗的說就是把a陣列的數編個號拿出來),排序。
然後就可以簡單易懂地搞出來任意兩塊之間的答案了。
查詢的時候只要查一下有沒有被完全覆蓋的幾個塊,先更新一次答案。
兩邊剩下的零頭就遍歷一遍好了。
怕tle?都分好塊了怎麼會t?每次查詢複雜度最多2k吧。。。
接下來上**
#include
#include
#include
using namespace std;
const int maxn = 500500;
const int inf = 2147483647;
const int k = 150;
const int maxks = 3500;
int a[maxn], b[maxn], t[maxn], v[maxn], next[maxn], f[maxks][maxks];
bool cmp(int
x, int
y) int min(int a, int b, int c)
int main()
sort(b+1, b+n+1, cmp);
int ks = (n/k) + 1;
memset(f, 0x7f, sizeof(f));
for(int i = 2; i <= n; i++)
if(a[b[i]] == a[b[i-1]])
for(int i = 1; i <= ks; i++)
for(int j = i+1; j <= ks; j++)
f[i][j] = min(f[i][j-1], f[j][j], f[i][j]);
int ans = 0;
while(m--)
else
}return
0;}
最後提一下,k,一般來說取n的二分之一次方,三分之一好像更快,所以說5s的時限確實挺長的。。
相信玄學150, 1s穩穩過!
解碼base64 Base64原理
一 為什麼會產生base64編碼?因為有些老的通訊協議 比如smtp 只支援傳遞可見字元,無法傳輸像回車 空格等不可見的控制字元,像這種二進位制檔案,其中可能含有不可見字元,那老的傳輸協議為了能夠傳輸,就需要有個編碼規則,把二進位制檔案中的不可見字元全部編碼成可見字元,所以就誕生了base64編碼規...
iOS工程如何支援64 bit arm64
詳細訊息位址為 關於xcode build setting 中的architectures引數問題 關於指令集如下參考 armv8 arm64 iphone 6 plus iphone 5s,ipad air 2 retina ipad mini 2,3 armv7s iphone 5,iphone...
64位記憶體
64位系統最顯著的優點是它可以使用超過4gb的記憶體。為什麼32位的系統只能顯示3g記憶體 實際上是3.25g 呢?這是由於系統本身的限制所造成的。32位系統對於記憶體的定址能力總共就4g,而4g裡還要放其他東西 比如系統 bios,輸入輸出裝置的位址和設定,各類介面的設定和位址等等,這些位址和設定...