一次考試的簡單T3

2022-04-01 05:40:08 字數 1563 閱讀 8770

我的第乙個想法其實是毫無頭緒

根本就想不到dp,直接就寫了爆搜

後來講了才知道。。。

這種dp的狀態好像是一類dp的模型,他們的狀態都有這樣的一維:以第i個數結尾。

這樣的dp有什麼樣的標誌呢?

以第i個數為結尾,說明這個狀態和第i個數是有關係的,一般是選擇數列中的數字

這種狀態在於他的狀態出來了,轉移一般也能夠直接顯示出來,然後在轉移中會列舉前面的狀態進行轉移,然後就可以在列舉中進行優化。

最後一般是o(n)或者o(n log n)的複雜度.

這裡有一道這樣的dp題目

這道題目呢,不要去考慮每乙個數的大小,在我們的眼裡,它應該是只能是乙個大小的關係,至於到底是幾,在每乙個狀態裡面根本就沒有考慮的必要。也沒有意義

設f[i][j]為選到了第i個數,目前以j結尾的可能性。

轉移就很明顯了

這裡就不講了

這道題目和這個t3是一樣的,狀態中都有一維是以i結尾。

因為在目前,我們的決策只是取決於上乙個數的大小,所以只用記錄一下就行了

這道題目呢,我們發現這是異或。

異或有乙個奇妙的性質,兩個數之間如果他們差的絕對值越小,他們的異或值越小。

這個是我寫上乙個t3時發現的。。。

艹那麼,我們先拍個序,就可以發現,如果要滿足這個任意兩個數的異或都要大於x,那就是要滿足,任意乙個數和其他的數異或的最小值都要大於x

上面已經講了,乙個數異或的最小值就是和它最近的數的異或,在排序後就是他左右的數

所以我們只需要保證目前這個階段在轉移的時候合法即可,這個階段的決策完全不會影響到其他任何的決策.這其實是我應該想到的。

唉所以就有了o(n^2)暴力

//¼óóí

#include#define ll long long

using namespace std;

int f[100001],n,a[100001],x;

inline ll read()

int main()

sort(a+1,a+1+n);

f[1]=0;

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

}} int ans=0;

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

cout真不戳

我們發現這個轉移中,每一次都要用o(n)去查詢a[j]使a[i]^a[j]比x大。

我們需要乙個東西來快速查詢比x大的a[i]^a[j],這時我們想到了trie樹.

我們把每乙個f[j]都先放進trie數中,每次就是在詢問a[i]^a[j]>x的f[j]之和,這個可以直接在trie樹上維護子樹和。

時間複雜度o(n log max(a[i]))

0926考試T3 容斥原理 組合數學

題目大意 容斥原理 組合數學。一開始看到這題很蒙啊,根本不知道從哪去想,於是就寫了個爆搜。我就直接粘題解吧,稍微解釋一下。把集合根據大小分類那個式子 當 i 0 時,f h 不就是所有 x 0 的時候嗎,那相當於沒有任何限制,是所有情況。當 i 1 時,f h 是乙個數一定不滿足的情況,給他減去,然...

YCH的模擬賽 T3

暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...

T3 顯示隱藏的行業性質

t3顯示隱藏的行業性質 執行sql查詢,輸入以下sql語句 use ufsystem update gl btrade set ctrade name ctrade name where ctrade name in 行政 普通事業 科學事業 建設單位 國家物資儲備 中小學校 高校 社會保險 醫療 ...