2016多校聯合第三場 HDU5760

2021-07-15 17:12:00 字數 2385 閱讀 3960

給你個

n ,然後

n個數,你要找到乙個最長的序列

s ,輸出其長度,並且輸出不同的

s的個數。

s 序列必須是回文的,並且中間最小,往兩邊依次增大,可以相等。s1

與s2 不同當且僅當長度不同或者存在某位s1

[i]!

=s2[

i]這個dp比較難。

n範圍比較小,先把

a 陣列離散化。方便之後處理。再預處理兩個陣列pr

e[i]

[j]n

xt[i

][j]

分別表示以

i 起左邊第乙個等於j的數的位置和以

i起右邊第乙個等於j的數的位置。設d

p[l]

[r] 元組表示a[

l]==a

[r] 的時候的最長s串和最長串個數。那麼有dp

[l][

r]=m

ax列舉c再列舉區間的複雜度是n3

顯然超時。

如果固定

l ,逐漸向右掃的時候,dp

值肯定是越來越優的。我們設乙個臨時變數an

s 來表示

l 右邊開始某位置的最優值,然後往右掃的同時就可以直接用此臨時變數更新我們的dp

[l][

r],當然,也需要把an

s 的值也更新。當遇到相同值的時候,要加上數量,然後就是去重

每次更新an

s 的時候,如果發現當前串的長度等於an

s 那麼需要把個數加進an

s 但是如果之前加過一樣的長度,並且二者首尾一樣,那麼說明後者包含了更多的re

s (因為範圍更大)那麼減去原來的,加上後來的,剛好不重不漏。

//

// created by running photon

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define all(x) x.begin(), x.end()

#define ins(x) inserter(x, x,begin())

#define ll long long

#define clr(x) memset(x, 0, sizeof x)

using

namespace

std;

const

int inf = 0x3f3f3f3f;

const

int mod = 1e9 + 7;

const

int maxn = 1e6 + 10;

const

int maxv = 5e3 + 10;

const

double eps = 1e-9;

int a[maxv];

int pre[maxv][maxv], nxt[maxv][maxv];

typedef pair sta;

sta dp[maxv][maxv];

int main()

sort(all(xs));

xs.resize(unique(all(xs)) - xs.begin());

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

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

// puts("");

memset(pre, -1, sizeof pre);

memset(nxt, -1, sizeof nxt);

int big = xs.size();

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

}for(int j = i - 1; j > 0; j--) }}

for(int i = n; i > 0; i--)

if(a[i] >= a[j])

else

if(dp[head][j].first == ans.first) }}

}sta ans(0, 0);

for(int c = 1; c <= big; c++)

else

if(ans.first == dp[head][tail].first)

}printf("%d %d\n", ans.first, ans.second);

}

return

0;}

hdu多校第三場

題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...

2014多校聯合 第三場

1002 redraw beautiful drawings 最大流。用sap gap優化的模版過的。1.源點 每一行對應的點,流量限制為該行的和 2.每一行對應的點 每一列對應的點,流量限制為k 3.每一列對應的點 匯點,流量限制為該列的和 跑一遍最大流。如果流量小於總權值和,那麼說明imposs...

2013第三場多校

第三場多校 至今最慘的一場多校。共作出兩題。1008 狀態壓縮優化的搜尋 0 比賽時候直接狀態壓縮dp,結果tle了。沒有算好時間複雜度,第一次交的時候沒有測大資料。應該多想幾種方法,做到一a才行,不然卡題會卡很久。1 後來直接搜尋,從最後乙個狀態開始搜,每次都用乙個回文串,然後搜另乙個的最小步數。...