題目傳送門
給出乙個圖,保證每個點有且僅有乙個出邊,對於每個點把它走 \(k\) 步這條路徑上的所有的點答案加 1 ,問最後每個點的答案。
\(n\le 5\times 10^5\)
考試的時候 sb 了,沒想出來怎麼做。
首先你可以發現這其實是個基環樹森林,對於不在環上的點,它答案其實就是子樹內深度與它相差不超過 \(k\) 的點的數量。考慮在環上的點,顯然它們還要考慮環上其他點對該點產生的貢獻。
具體實現的話我們可以斷開一條邊使得變成森林,然後求點的數量可以用樹狀陣列解決,然後如果每次都需要清空的話時間複雜度就會降到 \(\theta(n^2)\) ,所以我們可以只考慮增長量。時間複雜度 \(\theta(n\log n)\) 。
vector e[maxn];
int n,k,cutu,cutv,f[maxn],sum[maxn],vis[maxn],lim[maxn],ans[maxn];
int lowbit (int x)
void modify (int x)
int query (int x)
void dfs (int u,int dep)
signed main()
for (int i = 1;i <= n;++ i) write (ans[i]),putchar ('\n');
return 0;
}
題目傳送門
一開始有 \(n\) 個點,每個點都兩個權值 \(a,b\) ,如果存在集合 \(s\) 使得對於 \(k\) 存在 \(a_i\+b_k\ge h\) ,那麼我們就可以把答案加 1,但是後面的集合就不能包含該點。
問答案的最大可能值。\(n\le 2\times 10^5\)
考試的時候像個弱智一樣,寫了乙個偽貪心,然後寫了乙個平衡樹,結果只把後面比較水的資料騙過去了,還沒有亂搞得的分多。。。
正解其實是個反悔貪心,我們按照 \(a+b\) 排序,然後你發現如果我們把滿足的點存下來,每次如果當前點可以那麼,那就直接加進去,否則就把最強的拉下來,把這個救上去。
時間複雜度 \(\theta(n\log n)\) 。
int n,h,ans;ll suma;
priority_queue q;
struct node
}peo[maxn];
signed main()
write (ans),putchar ('\n');
return 0;
}
題目傳送門
定義 \(\\) 合法,當且僅當 \(\sum_^a_i=n\),定義 \(\\) 合法,當且僅當 \(\sum_^b_i=m\),定義 \(\\) 的權值為 \(\prod_^\min(a_i,b_i)\),問所有合法 \(\\) 的權值之和。
有 \(t\) 次查詢,每次給出 \(n,m,k\) 。\(t\le 100,n,m,k\le 5\times 10^5\)
考試的時候隨便推了一下,騙了 \(60\) 分就沒有想了,主要是因為沒想到二元生成函式,想到了之後就很簡單了,直接推式子就可以了。
你發現,其實答案就是 :
\[(\sum_\min(a,b)x^ay^b)^k[x^ny^m]
\]證明顯然。
然後你把上面那個東西寫出來,你發現其實就是:
\[1xy+1xy^2+1xy^3+...\\1x^2y+2x^2y^3+2x^2y^4+...\\1x^3y+2x^3y^2+3x^3y^3+3x^3y^4+...
\]然後你用等差比公式推一下發現其實就等價於:
\[\frac
\]然後求這個東西的 \([x^ny^m]\) 可以直接用隔板法,具體來說就是列舉 \(xy\) 的次數。
時間複雜度 \(\theta(tn)\) (假設 \(n,m\) 同階)。
read (n,m,k);
int ans = 0;
for (int i = 0;i <= n - k && i <= m - k;++ i)
ans = add (ans,mul (binom (k + i - 1,i),mul (binom (n - i - 1,n - k - i),binom (m - i - 1,m - k - i))));
write (ans),putchar ('\n');
嘗試了頭鐵打法然後**了。。。
給出乙個 \(n\) 個點,\(m\) 條帶權邊的圖,需要依次訪問 \(2k\) 個點,你有兩個傳送門,傳送門放置時必須保證為當前位置,傳送門之間可以瞬間傳送,問訪問完所有點的最小路徑長度。
\(n\le 300,m\le 4000,k\le 300\)
考試的時候猜到了乙個顯然的結論結果沒想到用 dp ,然後。。。
首先有乙個顯然的結論,就是說有乙個傳送門肯定就在我的腳下,然後我們可以設 \(dp[i][j]\) 表示訪問了前 \(i\) 個點,另外乙個傳送門在 \(j\) 的最小路徑長度。顯然,\(dp[0][1]=0\)。轉移式的話我們可以想到肯定只會在 \(dp[i-1][k]\) 之間轉移,其中 \(k\) 是上一次的傳送門的位置,然後你列舉一下情況就可以得到轉移式了,具體見**。
dp[0][1] = 0,a[0] = 1;
for (int i = 1;i <= k * 2;++ i)
}int ans = dp[k * 2][1];
for (int i = 1;i <= n;++ i) ans = min (ans,dp[k * 2][i]);
write (ans),putchar ('\n');
有乙個 \(n\) 個點的邊帶權的樹,你每次可以加邊或者刪邊,但需要保證任意時刻存在的環上的權值異或之值為 \(0\)。問最後 \(n-1\) 條邊的最小邊權之和。
\(n\le 10^5\)
被wxk和llsw騙了,實際上這道題目沒有很難(也有可能是因為自己沒做)
我們可以發現如果兩個點之間要加邊,那麼,邊權一定是固定的,因為如果構成的環上的不管怎麼變邊權都是相同的(異或值為 \(0\)),可以想到如果定義 \(p[u]\) 表示 \(1\to u\) 的路徑異或值,那麼 \(u,v\) 之間的邊權就是 \(p[u]\otimes p[v]\)。於是我們就可以對 \(n^2\) 條邊做最小生成樹。
但是這樣顯然很慢。我們可以想到,如果從高到低位考慮,那麼對於當前位而言,我們應該盡量邊相鄰兩點該位分別為 \(0,1\) 的邊的數量最少,那顯然就只連 \(1\) 條邊,而且這裡很方便的是不需要考慮不連通的問題(有 \(n^2\) 條邊)。那我們可以直接分治,每次把該位為 \(0\) 的分治構成一棵樹,該位為 \(1\) 的構成一棵樹,然後兩棵樹之間連一條邊權最小的邊。於是問題就是如何找到邊權最小的邊,然後你發現這個東西直接用 01trie 樹解決就好了。
時間複雜度 \(\theta(n\log^2 n)\)
ll ans;
int n,tot,p[maxn],rt[maxn],cnt[maxn * 31],son[maxn * 31][2];
void ins (int a,int b,int t,int x)
int query (int a,int b,int t,int x)
int toop = 1,to[maxn << 1],wei[maxn << 1],nxt[maxn << 1],head[maxn];
void add_edge (int u,int v,int w)
void dfs (int u,int fa)
}void dfs (int t,int l,int r)
dfs (t - 1,l,pos - 1),dfs (t - 1,pos,r);
if (pos - 1 >= l && pos <= r)
}signed main()
c 考試題目
一 專案提問 題 1 實現根號,要求最終與目標值的精度不大於0.0001 2 原題,求集合的子集c 的虛函式?innodb引擎的索引結構?為什麼是b 樹?三條查詢語句是否命中聯合索引?同步非同步阻塞非阻塞?為什麼是三次握手 四次揮手?timewait的意義?二 專案提問tcp ip5層協議 列舉協議...
Python考試題目記錄
考試時沒能完全寫出來,題目記不太清了,記錄一下,不知道答案對不對。僅做參考,不保證 的正確性!給出乙個列表l,找出支配元組 支配元組 列表l中有兩個元組t1,t2,if t1 0 t2 0 and t1 1 t2 1 and 至少有乙個元素,小於對應位置的元素 t1支配t2,要找t1 分析 1 先排...
經理人考試題目
1.你新到這家公司,公司上下都講人事部主管是 老闆的人 人事部主管的權利很大,也很有號召力,你調動不了的人和事他都可以調動得了,你明顯的感覺到這位主管對你在這家企業的發展是個 絆腳石 某天,人事部主管向你報告,人事部的公章在他的抽屜裡不翼而飛,丟了。你將會如何處理公章事件和人事部主管這個難題?2.你...