2019牛客多校訓練(五)

2022-05-01 01:36:14 字數 2179 閱讀 3150

求出類似斐波那契數列的第$n$項

$n\leq  10^}$

我想著尤拉降冪。。。其實尤拉降冪並不適用於矩陣的運算

隊友看了題之後立馬想到十進位制的矩陣快速冪,太強了

和普通的矩陣不同的是,這個每次乘十前進,但這不是問題

對矩陣快速冪的時間複雜度認識得不深,潛意識以為$n$是乙個無窮大的數

#include #define ll long long

using namespace std;

const int maxn = 1e6 + 5;

struct maritx

s;int mod,x0,x1;

char in[maxn];

maritx mul(maritx a,maritx b)

int main()

}printf("%d\n",(ans.num[2][1]*x1%mod+ans.num[2][2]*x0%mod)%mod);

return 0;

}

給出$s$和$t$兩個字串,計算$s$的子串數量,十進位制形式大於$t$字串

定義$dp[i][j][k]$,考慮$s$的$i$個字元,組成長度為$j$的子串中,$k=0$小於$t$的前$j$位,$k=1$等於$t$的前$j$位,$k=2$大於前$j$位的數量

#include #define ll long long

using namespace std;

const int maxn = 3e3 + 5;

const ll mod = 998244353;

ll dp[maxn][maxn][3];

char s[maxn],t[maxn];

int main()

}}int main()

return 0;

}

給出一些數,選出最多的數,所有數對中,不能出現只差一位的情況

對於只差一位的數,我們可以建立一條雙向邊,這題轉化為,求乙個最大的沒有邊連線的點集

也就是二分圖的最大獨立子集

根據題目的描述,肯定不存在奇數環,可以根據1的數量的奇偶來劃分二部圖,同為奇數的數字不可能只相差一位,所以這是個合理的二分圖

只有圖中點可以被分成兩個部分,相同部分的點之間沒有連邊時,才可以使用二分圖匹配

最大獨立子集+最小頂點覆蓋=v

最小頂點覆蓋=最大匹配

找獨立子集的方法是,從左邊所有沒有匹配的點出發,去找到一條沒匹配,匹配,沒匹配,匹配的路徑,並且標記路徑上的點

選出左邊標記點和右邊未標記的點作為獨立子集

證明:

#include#include#include#define ll long long

using namespace std;

const int maxn = 5e3+7;

int vis[maxn];

int l[maxn],r[maxn],cnt1,cnt2,n,num[maxn],match[maxn];

int head[maxn],edge_num;

struct edgeedge[30*maxn];

bool check(int x)

return 0;

}void dfs1(int x,int fla)

}void add_edge(int a,int b)

bool dfs(int x)}}

return 0;

}int main()}}

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

if(vis[i]==0)dfs1(i,1);

int ans=n;

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

printf("%d\n",ans);

for(int j=1;j<=n;j++)vis[j]=0;

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

if(match[l[i]]==0)dfs(l[i]);

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

if(vis[l[i]])printf("%d ",num[l[i]]);

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

if(vis[r[i]]==0)printf("%d ",num[r[i]]);

printf("\n");

return 0;

}

2019牛客多校訓練(四)

給出一顆樹 讓所有染色點到某個點的最大距離最小 結果為最遠點對的距離除二向上取整 假設有最遠點對的路徑上的中間點 如果有某個點它到這個中間點要遠,那麼最遠點對就不是最遠點對了,產生矛盾 利用樹上點對路徑唯一性,兩次 dfs 求出染色點直徑 include define ll long long de...

2019牛客暑期多校訓練1

equivalent prefixes 這個是乙個用單調棧的題目,至於為什麼可以用單調棧?把兩個陣列同時跑單調棧,如果每次進棧最多乙個,當然在這個進棧之前肯定會有數出棧,如果存在乙個數進棧了,然後這個時候判斷一下進棧的這個數的位置是不是相同,如果不相同就說明肯定是不對的。為什麼說這個時候只要考慮這個...

2019牛客暑假多校訓練營(第五場)

矩陣快速冪,a n,n特別大,想到求某數sum sum 10 s i 0 可以把n一位一位拆開,ans ans 10 st s i 0 指數相加所以分開相乘 十進位制優化類似快速冪!includeusing namespace std typedef long long ll const ll ma...