「2019紀中集訓Day7」解題報告

T1、小L的數列

給一個數列 \(\{f_i\}\)
\[ f_i = \prod_{j = 1}^{j \leq k} f_{i - j}^{b_j}, \ (i > k) \]
現在給定數列的前 \(k \ (k \le 200)\) 項及 \({b_i}\),求第 \(n\) 項。

\(Sol\)
注意到數列的任意一項 \(f_i \ (i > k)\),都是前 \(k\) 項若干次冪的乘積,只需分別計算每一項對第 \(n\) 項的貢獻。
\(dp_i\) 表示第 \(i\) 項的指數,則不難得出:
\[ dp_i = \sum_{j = i - k}^{j \leq i - 1} b_{i - j} \times dp_j \]

顯然可以用矩陣乘法來優化,因為要枚舉前 \(k\) 項,時間復雜度 \(O(k ^ 4 \ \log_2 n)\)
每一項的轉移矩陣是一樣的,所以可以以 \(O(k ^3 \ \log_2 n)\) 的時間復雜度解決。

代碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
int in() {int x = 0; char c = getchar(); bool f = 0;while (c < '0' || c > '9')f |= c == '-', c = getchar();while (c >= '0' && c <= '9')x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();return f ? -x : x;
}
template<typename T>inline void chk_min(T &_, T __) { _ = _ < __ ? _ : __; }
template<typename T>inline void chk_max(T &_, T __) { _ = _ > __ ? _ : __; }const int M = 205, mod = 998244353;
int n, m, f[205], y[205], a[205], b[205], res;struct matrix {int a[M][M];matrix(int t = 0) {memset(a, 0, sizeof(a));if (t > 0)for (int i = 1; i <= m; ++i)a[i][i] = t;}inline int* operator [] (int x) {return a[x];}inline matrix operator * (matrix &b) const {matrix ret;for (int k = 1; k <= m; ++k)for (int i = 1; i <= m; ++i)if (a[i][k])for (int j = 1; j <= m; ++j)if (b[k][j]) {ret[i][j] += 1ll * a[i][k] * b[k][j] % (mod - 1);if (ret[i][j] >= mod - 1)ret[i][j] -= mod - 1;}return ret;}
} ;matrix matrix_qpow(matrix base, int b) {matrix ret(1);for (; b; b >>= 1, base = base * base)if (b & 1)ret = ret * base;return ret;
}
int qpow(int base, int b, int ret = 1) {for (; b; b >>= 1, base = 1ll * base * base % mod)if (b & 1)ret = 1ll * ret * base % mod;return ret;
}int main() {//freopen("in", "r", stdin);freopen("seq.in", "r", stdin);freopen("seq.out", "w", stdout);matrix trans;n = in(), m = in();for (int i = 1; i <= m; ++i)y[i] = in();for (int i = 1; i <= m; ++i)f[i] = in();if (n <= m) {printf("%d\n", f[n]);return 0;}for (int i = 1; i <= m; ++i)trans[i][i - 1] = 1;for (int i = 1; i <= m; ++i)trans[i][m] = y[m - i + 1];res = 1;trans = matrix_qpow(trans, n - m);for (int i = 1; i <= m; ++i) {for (int j = 1; j <= m; ++j)b[j] = a[j] = 0;b[i] = 1;for (int k = 1; k <= m; ++k)for (int j = 1; j <= m; ++j) {a[j] += 1ll * b[k] * trans[k][j] % (mod - 1);if (a[j] >= mod - 1)a[j] -= mod - 1;}res = 1ll * res * qpow(f[i], a[m]) % mod;}printf("%d\n", res);return 0;
}

T2、夢境

數軸上給定 \(n\) 條線段 \(\{l_i,r_i\}\)\(m\) 個點 \(\{t_i\}\),每個線段選擇一個未匹配且包含于該線段的一個點進行匹配,求最大匹配數。

\(70pts\)
線段樹優化建圖求二分圖最大匹配。

\(100pts\)
\(Sol1\)
點從小到大排序,線段按左端點從小到大排序;
從小到大枚舉所有點,把左端點在該點左邊的線段放入堆 (右端點為關鍵字的小根堆) 中;
檢查堆頂的右端點是否在當前枚舉到的點的右邊,若是,將改點與堆頂線段匹配;否則, 重復上述過程,直至條件成立或堆為空。
對于第 \(i\) 個點,只有在它右邊的點會被影響,為了使右邊的點有更多線段可以選擇,所以選右端點最靠左的。
\(Sol2\)
線段按右端點從小到大排序,點放入樹狀數組;
枚舉每一條線段,每條線段選擇盡量靠左的點。
\(Sol1\) 一樣。

代碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
int in() {int x = 0; char c = getchar(); bool f = 0;while (c < '0' || c > '9')f |= c == '-', c = getchar();while (c >= '0' && c <= '9')x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();return f ? -x : x;
}
template<typename T>inline void chk_min(T &_, T __) { _ = _ < __ ? _ : __; }
template<typename T>inline void chk_max(T &_, T __) { _ = _ > __ ? _ : __; }const int N = 2e5 + 5;
struct node {int l, r;inline bool operator < (const node &b) const {return this->r > b.r;}
} a[N];
int n, m, t[N];inline bool cmp(const node &i, const node &j) {return i.l < j.l;
}int main() {//freopen("in", "r", stdin);freopen("dream.in", "r", stdin);freopen("dream.out", "w", stdout);n = in(), m = in();for (int i = 1; i <= n; ++i)a[i] = (node){in(), in()};for (int i = 1; i <= m; ++i)t[i] = in();std::sort(a + 1, a + 1 + n, cmp);std::sort(t + 1, t + 1 + m);std::priority_queue <node> q;int pos = 1, res = 0;for (int i = 1; i <= m; ++i) {while (pos <= n && a[pos].l <= t[i]) {if (a[pos].r >= t[i])q.push(a[pos]);++pos;}while (!q.empty() && q.top().r < t[i])q.pop();if (!q.empty() && q.top().r >= t[i])++res, q.pop();}printf("%d\n", res);return 0;
}

T3、樹

一棵 \(n\) 個點的樹,給定 \(m \ (m \leq 10 ^ 5)\) 個點對(保證兩個點不同),求不包含上述點對且點數大于一的簡單路徑。

\(Sol\)
考慮求至少包含一組點對的路徑數量。
把一條路徑的端點放在二維平面上,一個點就可以代表一條路徑;
對于一個點對 \(u, v\)
若兩點有祖先-后代關系(\(u\)\(v\) 的祖先),則可選的路徑兩端點范圍分別為 \(v\) 的子樹、除了 \(u\) 包含 \(v\) 的子樹的其它所有點。
若兩點沒有祖先-后代關系,則可選的路徑兩端點范圍分別為 \(u\) 的子樹、\(v\)的子樹。
\(dfs\) 序放在平面上,變成一個掃描線求矩形覆蓋面積的題,線段樹維護即可。
線段樹的維護:可以 \(push \_ down\) 也可以不用,前者可擴展性更強,由于掃描線刪除的線段一定加入過,所以并不用 \(push \_ down\)

代碼如下:

//#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
int in() {int x = 0; char c = getchar(); bool f = 0;while (c < '0' || c > '9')f |= c == '-', c = getchar();while (c >= '0' && c <= '9')x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();return f ? -x : x;
}
template<typename T>inline void chk_min(T &_, T __) { _ = _ < __ ? _ : __; }
template<typename T>inline void chk_max(T &_, T __) { _ = _ > __ ? _ : __; }const int N = 1e5 + 5;struct edge {int next, to;
} e[N << 1];
int ecnt = 1, head[N];inline void jb(const int u, const int v) {e[++ecnt] = (edge){head[u], v}, head[u] = ecnt;e[++ecnt] = (edge){head[v], u}, head[v] = ecnt;
}//heavy-light deposition begin
int siz[N], hson[N], fa[N], dep[N], fro[N], dfn[N];
void dfs_h(const int u) {siz[u] = 1;for (int i = head[u]; i; i = e[i].next) {int v = e[i].to;if (v == fa[u])continue;fa[v] = u, dep[v] = dep[u] + 1;dfs_h(v);siz[u] += siz[v];if (siz[v] > siz[hson[u]])hson[u] = v;}
}void dfs_f(const int u, const int tp) {dfn[u] = ++dfn[0], fro[u] = tp;if (hson[u])dfs_f(hson[u], tp);for (int i = head[u]; i; i = e[i].next)if (e[i].to != fa[u] && e[i].to != hson[u])dfs_f(e[i].to, e[i].to);
}
int lca(int u, int v) {while (fro[u] != fro[v]) {if (dep[fro[u]] > dep[fro[v]])std::swap(u, v);v = fa[fro[v]];}return dep[u] < dep[v] ? u : v;
}
int find_son(int u, int v) {while (fro[v] != fro[u]) {v = fro[v];if (fa[v] == u)return v;v = fa[v];}return hson[u];
}
//heavy-light deposition endint n, m;typedef std::pair<int, int> pii;
std::vector<pii> a[N][2];struct segment_tree {int sum[N << 2], cnt[N << 2];void push_up(int p, int tl, int tr) {if (cnt[p])sum[p] = tr - tl + 1;else if (tl == tr)sum[p] = 0;elsesum[p] = sum[p << 1] + sum[p << 1 | 1];}void modify(int l, int r, int k, int tl = 1, int tr = n, int p = 1) {if (l <= tl && tr <= r) {cnt[p] += k;push_up(p, tl, tr);return ;}int mid = (tl + tr) >> 1;if (mid >= l)modify(l, r, k, tl, mid, p << 1);if (mid < r)modify(l, r, k, mid + 1, tr, p << 1 | 1);push_up(p, tl, tr);}
} T;int main() {//freopen("in", "r", stdin);freopen("tree.in", "r", stdin);freopen("tree.out", "w", stdout);n = in(), m = in();for (int i = 1; i < n; ++i)jb(in(), in());dfs_h(3), dfs_f(3, 3);for (int i = 1, u, v, w; i <= m; ++i) {u = in(), v = in(), w = lca(u, v);if (dfn[u] > dfn[v])std::swap(u, v);if (w == u) {w = find_son(u, v);a[1][0].push_back(pii(dfn[v], dfn[v] + siz[v] - 1));a[dfn[w]][1].push_back(pii(dfn[v], dfn[v] + siz[v] - 1));a[dfn[v]][0].push_back(pii(dfn[w] + siz[w], n));a[dfn[v] + siz[v]][1].push_back(pii(dfn[w] + siz[w], n));} else {a[dfn[u]][0].push_back(pii(dfn[v], dfn[v] + siz[v] - 1));a[dfn[u] + siz[u]][1].push_back(pii(dfn[v], dfn[v] + siz[v] - 1));}}long long res = 1ll * n * (n - 1) / 2;for (int i = 1; i < n; ++i) {for (unsigned j = 0; j < a[i][0].size(); ++j)T.modify(a[i][0][j].first, a[i][0][j].second, 1);for (unsigned j = 0; j < a[i][1].size(); ++j)T.modify(a[i][1][j].first, a[i][1][j].second, -1);res -= T.sum[1];}printf("%lld\n", res);return 0;
}

轉載于:https://www.cnblogs.com/15owzLy1-yiylcy/p/11321993.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我想擁有一座莊園:“ 暮春三月,江南草長,雜花生樹,群鶯亂飛 ... ”

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 // 或許這個心愿是緣于少時讀的詩&#xff1a;其中大多是對于自然的期許和神往 ... // 亦或許是想太多的人大多都有這樣的心愿 ... 我想…

安裝Ubuntu 14.04后要做的5件事情

Ubuntu最新版本Ubuntu 14.04已經發布&#xff0c;它是一個長期支持版本&#xff08;LTS&#xff09;&#xff0c;提供軟件包和安全更新的服務周期為5年。本文為大家簡單介紹了Ubuntu 14.04版本新特性和安裝Ubuntu 14.04后需要做的5件事情&#xff0c;以供參考。Ubuntu目前是世界…

昨天,我的大學學習[2]

昨天&#xff0c;我的大學學習[2] 曾毅 誰能改變我的命運[大學二年級] 如果說大學一年級的時候是一種被動學習狀態&#xff0c;對計算機科學不能攬其全貌&#xff0c;那么進入大學二年級以后的學習便是比較有針對性的了&#xff0c;但這種轉變并非偶然&#xff0c;同樣也是經過…

VUE 項目 去除 input 框值 所有空格、vue 組件去除空格、input 去除空格

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.以下所有方法 我都試過&#xff1a;不行。 str.trim(); //去掉首尾空格 str.replace(" ",""); //去除所有空格&…

性能優化之節流、防抖

1. 防抖&#xff1a; 由于dom操作極其昂貴&#xff0c;所以嘗試過多的dom操作有可能會將瀏覽器搞崩潰&#xff0c;比如onresize、onscroll這類事件操作&#xff1b;為了解決這個問題&#xff0c;引出防抖的概念&#xff08;某些代碼不可以在沒有間斷的情況下連續重復執行&#…

百萬用戶規模的系統如何擴展

摘要&#xff1a;系統擴展一直是個讓人頭疼的事情&#xff0c;MatinKleppmann通過本文分享了他自己的6條經驗&#xff0c;外加網友的一條建議&#xff0c;這些經驗對于擴展Twitter這樣規模的系統或許幫助不大&#xff0c;但是對于百萬用戶級別的系統擴展就另當別論了。 【編者…

springboot 項目輸出 sql 到控制臺、 SpringBoot 中 Mybatis 打印 sql

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件&#xff0c;加入如下配置&#xff1a; logging.level.com.ex…

JS流程圖解決方案GoJS

GoJs簡介 一個實現交互類圖表&#xff08;比如流程圖&#xff0c;樹圖&#xff0c;關系圖&#xff0c;力導圖等等&#xff09;的JS庫 GoJS依賴于HTML5&#xff0c;所以請保證您的瀏覽器版本支持HTML5&#xff0c;當然還要加載這個庫。 首先個人建議先下載官方實例的 離線版本【…

VUE.JS 組件化開發實踐

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前言 公司目前制作一個H5活動&#xff0c;特別是有一定統一結構的活動&#xff0c;都要碼一個重復的輪子。后來接到一個基于模板的活動…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou轉載于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升開發效率的十個工具

Git 之前也有過不少版本控制的工具。有好的&#xff0c;也有糟糕的。不過它們都或多或少地誤入歧途了。 這時候Git出現了。一旦你用上了這個神奇的工具&#xff0c;很難相像你還會碰到比它更好的了。 還沒用過Git&#xff1f;試一下吧。 Stack Overflow 真的&#xff0c;我沒…

Virtual Villagers 攻略

和大家分享一下這個游戲的攻略心得,希望對大家有幫助~~Puzzle 1 清潔水井&#xff08;難度&#xff1a;簡單&#xff09;將一個擁有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建設&#xff08;難度&#xff1a;簡單&#xff09;一開始會由一個掌握Building技能的村民…

input 框 去掉下面的提示文字、提示選項

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 我的一個輸入框總是有提示文字&#xff1a; 2. 去掉方法&#xff0c;給 input 加一個屬性&#xff1a; autocomplete"off"…

科學合理的減肥

1、科學安排一日三餐    在正常生理情況下&#xff0c;一般人習慣于一日三餐。人體最大消耗是在一天中的上午。由于胃經過一夜消化早已排空&#xff0c;如果不吃早飯&#xff0c;那么整個上午的活動所消耗的能量完全要靠前一天晚餐提供&#xff0c;這就遠遠不能滿足營養需要。…

解決: VUE 項目中表單提交中文亂碼、接口請求參數中文亂碼

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 表單提交出現亂碼&#xff1a; 接口請求亂碼同于上圖。 2. 解決&#xff1a; 在出現亂碼的內容外面加函數&#xff1a;decodeURI()…

大數據 — Hadoop

HDFS Hadoop 1.0: 3個組件&#xff1a; NamenodeSecondNamenodeDatanodenamenode&#xff08;主節點&#xff0c;master&#xff0c;只有一個&#xff0c;單點故障的風險&#xff09;中間存儲信息&#xff08;元數據&#xff09; 2種映射關系&#xff1a; path -> blockid l…

VUE:兄弟組件間傳參

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、定義一個中間 eventBus.js &#xff0c;只有 2 行代碼&#xff0c;用于傳參&#xff1a; // 此頁面是vue 巴士&#xff0c;用于兄…

C++的歷史

本文由 伯樂在線 - honpey 翻譯自 Albatross。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。C的歷史可以追溯到1979年&#xff0c;當時Bjarne Stroustrup&#xff08;譯者注&#xff1a;C之父&#xff09;正在準備他的博士畢業論文&#xff0c;他有機會使用一種叫做Si…

asp.net ajax的學習第一篇

自己理解的asp.net ajax的核心思想&#xff1a; javascript 調用web service <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />由于工作的原因&#xff0c;要在自己的網頁上使用無刷新技術&#xff0c;增加客戶體驗。開始學習asp…

insertSelective 和 insert 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、selective的意思是&#xff1a;選擇性。 2、insertSelective--選擇性保存數據&#xff1b; 比如User里面有三個字段:id&#xff0c;n…