遠古離散題

2022-10-09 06:54:08 字數 2471 閱讀 9332

因為之前做法假了或者**寫太醜了,還不如重寫一遍。

之前csdn過河的**會被洛谷的hack資料hack掉qwq。

有一條河,起點為 \(0\),終點為 \(l(l\leq 10^9)\),其中一些位置有石頭。

有乙隻青蛙一次可以跳 \([l,r](r\leq 10)\) 的距離,如果它想從起點跳到 \(\geq l\) 的點,至少需要越過多少個石頭。

有乙個很簡單的方法,設 \(dp[i]\) 表示跳到 \(i\) 時至少需要越過多少個石頭,

那麼 \(\large dp[i]=\min_^r\+stone[i]\),其中 \(stone[i]\) 表示第 \(i\) 個點是否為石頭。

最後的答案就是 \(\large \min_^dp[l+j]\),這樣時間複雜度為 \(o(r(l+r))\),主要是要將 \(l\) 的複雜度變小。

考慮將石頭的位置離散,並且只要跳過所有的石頭就可以隨便跳,所以答案只與石頭的位置有關。

可以發現不小於 \(72\) 的步數都能被表示出來,那麼只要步數超過 \(72\) 就可以縮成 \(72\)。

具體可以沿用小凱的疑惑的結論,不能表示的最大數為 \(r*(r-1)-r-(r-1)\)。

那麼這樣 \(l\) 就被縮小成了 \(o(mr^2)\) 量級,那麼最後的時間複雜度就是 \(o(mr^3)\)

#include #include using namespace std;

const int n=111,lim=72; int ans=0x3f3f3f3f;

int l,l,r,n,a[n],stone[n*72],dp[n*72];

int main()

for (int i=a[n];i多組資料,有若干個變數,\(n\) 條限制,形如 \(x_i\neq x_j\) 或者 \(x_i=x_j\),問這些變數是否能滿足所有限制。

\(n\leq 10^6,i,j\leq 10^9\)

先考慮 \(x_i=x_j\) 的限制,再考慮 \(x_i\neq x_j\) 的限制,按照 \(x_i=x_j\) 的限制將 \(i,j\) 縮成乙個連通塊,

那麼實際上只需要在 \(x_i\neq x_j\) 的時候判斷 \(i,j\) 是否不在同一連通塊,如果在同一連通塊就無解。

然而 \(i,j\) 的範圍比較大,不過實際上可用的 \(i,j\) 不超過 \(2n\) 個,那麼直接將編號離散即可。

#include #include using namespace std;

const int n=1000011;

int x[n],y[n],opt[n],b[n<<1],rk[n],n,test,flag,f[n],m;

bool cmp(int x,int y)//把xi=xj的限制放在前面

int find_root(int u)

int main()

sort(b+1,b+1+n*2),sort(rk+1,rk+1+n,cmp);

m=unique(b+1,b+1+n*2)-b-1;//將xi,xj離散

for (int i=1;i<=m;++i) f[i]=i;

for (int i=1;i<=n;++i)

//如果xi不等於xj且在同一連通塊則無解

} if (flag) cout<<"no"《有乙個長度為 \(n\) 的 \(01\) 串 \(a\),現在有 \(m\) 條限制形如 \(a[l\sim r]\) 中有奇數個 \(1\) 或者偶數個 \(1\),

是否存在第 \(i\) 條限制不符合要求,並且前 \(i-1\) 條限制均能符合要求。

\(n\leq 10^9,m\leq 5*10^3\)

限制其實就是 \(s[r]-s[l-1]\) 的奇偶性,可以考慮邊帶權並查集,處理出每個位置到並查集根的奇偶性 \(s'[x]\),那麼每次合併的時候實際上 \(x\) 的根節點到 \(y\) 的根節點的奇偶性就是 \(s'[x]\)

\(xor\)

\(s'[y]\)

\(xor\)

\(z\)。

然後路徑壓縮的時候同樣維護到根節點的奇偶性,但是 \(n\) 太大,考慮可用的位置不超過 \(2m\) 個,直接離散即可。

#include #include #include using namespace std;

const int n=10011; string s;

int n,m,b[n],x[n],y[n],z[n],f[n],s[n];

int find_root(int u)

int main()

sort(b+1,b+1+m*2),n=unique(b+1,b+1+m*2)-b-1;//離散

for (int i=1;i<=n;++i) f[i]=i;

for (int i=1;i<=m;++i)

}else f[fx]=fy,s[fx]=s[x[i]]^s[y[i]]^z[i];//fx到fy的奇偶性

} cout

}

遠古文明的算術題

time limit 1000 ms memory limit 65536 kb 考古人員發現地球在一億年以前曾經存在乙個高階文明叫做delta,而且發現這個文明的具有文字和語言。經過艱苦卓絕的工作,專家們破譯了其中的一些文字和表示方法。他們使用 表示加運算,表示減運算,表示乘運算,表示整數除運算,...

cinema(全程離散化A題)

cinema 簡化題意 給定n nn個數字,每個數字在n nn個數字 現的次數是數字的價值。之後給定兩串m mm個數字的序列,上下一一對應,對於每乙個i,i 1,m i,i 1,m i,i 1 m 而言,求出上面數字價值最大的i ii,若有多個上面數字相同,給出下面數字價值最大的編號。因為給的a,b...

ACM遠古文明的算術題 (C語言實現)

遠古文明的算術題 description 考古人員發現地球在一億年以前曾經存在乙個高階文明叫做delta,而且發現這個文明的具有文字和語言。經過艱苦卓絕的工作,專家們破譯了其中的一些文字和表示方法。他們使用 表示加運算,表示減運算,表示乘運算,表示整數除運算,表示取模運算,但算術式的表示和我們不同,...