【Google Kickstart Round_H】解題報告
序
Problem A. Big Buttons
題意
一個長度為 的 01串,該字串有 個不能出現的字首,問這樣的字串有多少種?
題解
由於 的範圍很小,直接建一棵表示字首限制條件的字典樹,然後在上面通過限制條件從可能方案中剪去即可。
程式碼
#include <bits/stdc++.h> using namespace std; const int maxn=int(1e5)+11; int n,m,tot; int to[maxn][2], mark[maxn]; char s[maxn]; long long ans=0; int get_id(char ch) {return ch=='B';} void ins(char *s,int len) { int cur=0; for(int i=1;i<=len;++i) { int ch=get_id(s[i]); if(!to[cur][ch]) to[cur][ch]=++tot; cur=to[cur][ch]; } mark[cur]++; return; } void init() { tot=0; for(int i=0;i<maxn;++i) { to[i][0]=to[i][1]=0; mark[i]=0; } return; } void dfs(int k,int dep) { if(mark[k]) { ans-=(1ll<<dep); return; } if(to[k][0]) dfs(to[k][0],dep-1); if(to[k][1]) dfs(to[k][1],dep-1); return; } int cas=0; void work() { init(); scanf("%d%d",&n,&m); register int i; for(i=1;i<=m;++i) { scanf("%s",s+1); ins(s,strlen(s+1)); } ans=(1ll<<n); dfs(0,n); printf("Case #%d: %lld\n",++cas,ans); return; } int main() { #ifndef ONLINE_JUDGE freopen("input1.txt","r",stdin); freopen("output1.txt","w",stdout); #endif int T; for(scanf("%d",&T);T;T--) work(); return 0; }
Problem B. Mural
題意
有一個由 0~9 的數字組成的數列,第一次可以隨便取一個數字,接下來的每一次只能取一個與已取區間相鄰的數字。且每次取出一個數字後,數列兩端的兩個數之一會隨機地變為不可取。問最壞情況下取出數字的最大和是多少。
題解
首先知道我們一定能取出一個長度為 的連續區間;
而且,不管不可取的數字是如何出現在兩端的,對於一個長度為 的區間,一定存在一種方法把它取到。
所以 找出區間和最大的長度為 的連續區間即可。
程式碼
#include <bits/stdc++.h> using namespace std; const int maxn=int(5e6)+11; int n; char s[maxn]; int sum[maxn]; int cas=0; void work() { scanf("%d%s",&n,s+1); register int i; for(i=1;i<=n;++i) sum[i]=sum[i-1]+s[i]-'0'; int ans=0, len=(n+1)/2; for(i=1;(i+len-1)<=n;++i) ans=max(ans,sum[i+len-1]-sum[i-1]); printf("Case #%d: %d\n",++cas,ans); return; } int main() { #ifndef ONLINE_JUDGE freopen("input2.txt","r",stdin); freopen("output2.txt","w",stdout); #endif int T; for(scanf("%d",&T);T;T--) work(); return 0; }
Problem C. Let Me Count The Ways
題意
有 對情侶坐一起,其中的 對情侶中的兩人不能坐相鄰位置,考慮情侶中的二人是不同的。問有多少種安排座位的方法?
題解
處理出 ,表示在那 對不能坐一起的情侶中,至少有 對情侶坐在一起的安排方案數。然後容斥一下出答案。
程式碼
#include <bits/stdc++.h>
using namespace std;
const int moder=int(1e9)+7;
inline int add(int a,int b) {return (a+b<moder)?a+b:a+b-moder;}
inline int mul(int a,int b) {return 1ll*a*b%moder;}
inline int les(int a,int b) {return a>=b?a-b:(a+moder-b);}
const int maxn=int(3e5)+11;
int n,m;
int fact[maxn], inv[maxn];
int C(int m,int n) {
return mul(fact[n],mul(inv[m],inv[n-m]));
}
int fpow(int a,int k) {
int res=1;
for(;k;k>>=1,a=mul(a,a)) if(k&1) res=mul(res,a);
return res;
}
void init() {
fact[0]=inv[0]=1;
for(int i=1;i<maxn;++i) fact[i]=mul(fact[i-1],i), inv[i]=fpow(fact[i],moder-2);
return;
}
int cas=0;
int g[maxn];
void work() {
scanf("%d%d",&n,&m);
for(int i=0;i<=m;++i)
g[i]=mul(C(i,m),mul(fact[2*n-i],fpow(2,i)));
int ans=0;
for(int i=0;i<=m;++i) {
if(i&1) ans=les(ans,g[i]);
else ans=add(ans,g[i]);
}
printf("Case #%d: %d\n",++cas,ans);
return;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input1.txt","r",stdin);
freopen("output1.txt","w",stdout);
#endif
init();
int T;
for(scanf("%d",&T);T;T--)
work();
return 0;
}
相關推薦
【Google Kickstart Round_H】解題報告
序 Problem A. Big Buttons 題意 一個長度為 nnn 的 01串,該字串有 mmm 個不能出現的字首,問這樣的字串有多少種? 題解 由於 n,mn,mn,m 的範圍很小,直接建
2018.3.28【 AtCoder beginner092-C 】解題報告(線性處理)
C - Traveling PlanTime limit : 2sec / Memory limit : 256MBScore : 300 pointsProblem StatementThere are N sightseeing spots on the x-axis,
洛谷 T28312 相對分子質量【2018 6月月賽 T2】 解題報告
字符 pac ... 給定 substr ++ 錯誤 如果 題目 T28312 「化學」相對分子質量 題目描述 做化學題時,小\(F\)總是裏算錯相對分子質量,這讓他非常苦惱。 小\(F\)找到了你,請你來幫他算一算給定物質的相對分子質量。 如果你沒有學過相關內容也沒有關系
【USACO1.4】解題報告
前言 本章主要考的是貪心和一些比較麻煩的模擬。難度相比上一章有很明顯的提升。但是稍微想一下還是可以想出來的(第五題除外,看了一下題解的思路)。 USACO:http://train.usaco.org 1.4.2.Mixing Milk 思路: 很明顯是一道貪心基礎
【USACO1.3】解題報告
前言 這一章主要考察的是一些簡單的數論和思維轉化能力。還是相對來說比較簡單的。 USACO:http://train.usaco.org 1.3.2.Milking Cows 思路: 字首和基礎題。 每次讀到有人在
【USACO1.2】解題報告
前言 以後將會不定期刷USACO的題目。每做完一小章會寫一份解題報告。這一小章裡面較簡單或者並不是很重要的題目就會直接放在裡面。而比較重要的題目就會單獨寫部落格,在這裡面放連結。 這一章很簡單,全部都是很基礎的題目。就直接在這裡面一筆帶過。 USACO:http://train.us
【USACO1.5】解題報告
前言 這章只有兩道題,但是質量都不比上一章低。 第一題正解肯定很難,但是資料神奇般的把 O (
【USACO1.6】解題報告
前言: 這章的三道題目中有兩道是可以用 D F S
【USACO2.1】解題報告
前言 USACO2.1主要內容是圖論。其中有幾道題是要用深搜做的。而另外幾道題則是利用模擬的方法來完成簡單圖論。 總體來說難度還是比較小的,算是最基礎的演算法吧。 UASCO:http://train.usaco.org 2.1.3.The Castle 題解
【USACO2.2】解題報告
前言 然而只有一道動態規劃的題目。。。 其他三道題都是模擬。。。 難度還是有所增加的。至少在洛谷中又有一道藍題了。 USACO:http://train.usaco.org USACO2.2.3.Preface Numbering 思路: 我們會發現羅馬數字中每一位都
【USACO2.3】解題報告
前言 本章主要是動態規劃,但是其中幾道題的方法比較多,我採用了其他的方法。 題目已經開始變難,有幾道題還特別值得思考。已經達到普及 T 3
校內賽 codeforces 827D【最小生成樹】【樹鏈剖分】 解題報告
找不到題面!! 題意 給出一張n(<=2e5)個點 m(<=2e5)條邊無向圖,保證有生成樹。對於每條邊,給出一個最大值maxLength,咦即能夠保證這條邊能夠出現在所有的最小生成樹中,邊權的最大值為maxLength(同時,其他所有邊長度不變
【leetcode 5040. 邊框著色】解題報告
posit 整數 d+ perf src check 網格 orm poi 給出一個二維整數網格 grid,網格中的每個值表示該位置處的網格塊的顏色。 只有當兩個網格塊的顏色相同,而且在四個方向中任意一個方向上相鄰時,它們屬於同一連通分量。 連通分量的邊界是指連通分量中
【leetcode 94. 二叉樹的中序遍歷】解題報告
stack traversal roo tree order targe blank span etc 前往二叉樹的:前序,中序,後序 遍歷算法 方法一:遞歸 vector<int> res; vector<int>
【leetcode 145. 二叉樹的後序遍歷】解題報告
中序 stack mage blank res tor tac 前序 top 前往二叉樹的:前序,中序,後序 遍歷算法 方法一:遞歸 vector<int> res; vector<int> postorderTrave
【leetcode 968. 監控二叉樹】解題報告[待完善...]
由於 camera 需要 spa alt img 狀態 數量 turn 方法一:遞歸 // 0:該節點安裝了監視器 1:該節點可觀,但沒有安裝監視器 2:該節點不可觀 int monitor = 0; int state(TreeNod
【leetcode 106. 從中序與後序遍歷序列構造二叉樹】解題報告
++ amp src 圖片 ima 遍歷序列 tree cto 建立 前往 中序,後序遍歷構造二叉樹, 中序,前序遍歷構造二叉樹 TreeNode* build(vector<int>& inorder, int l1, int r1,
【leetcode 105. 從前序與中序遍歷序列構造二叉樹】解題報告
nullptr treenode ref != 圖片 lan size htm amp 前往 中序,後序遍歷構造二叉樹, 中序,前序遍歷構造二叉樹 TreeNode* build(vector<int>& preorder, int l
【leetcode 239. 滑動窗口最大值】解題報告
urn int 分享 empty 頭部 pty size 圖片 leet 思路:滑動窗口的思想,只要是求連續子序列或者子串問題,都可用滑動窗口的思想 方法一: vector<int> maxSlidingWindow(vector<in
【Google設計衝刺】一種適合於創新小組的協作方式
傳統的產品閉環是1.產品策劃-2.研發-3.上線-4.等待市場反饋,4個步驟。對於一個創新專案來說,試錯成本過高,等待週期過長【註釋1】。那麼,有沒有一種適合創新專案的協作方式呢?谷歌風投傑克·納普發明了一種新型的產品設計方法,從1.產品策劃到4.市場反饋,直接形成閉環,即“Google設計衝刺”。 關鍵點