日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GDKOI2015 Day2

發(fā)布時(shí)間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDKOI2015 Day2 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1

題目描述:

  給出一個(gè)二分圖,選擇互不相交的邊,使得邊覆蓋的點(diǎn)權(quán)和最大。

solution:

  簡(jiǎn)單DP,用樹狀數(shù)組維護(hù)最大值。

  時(shí)間復(fù)雜度:$O(n \log n) $

P2

題目描述:

  給出N個(gè)或黑或白的元素,每個(gè)元素有與A集合和B集合相對(duì)應(yīng)的A,B兩個(gè)值,將N個(gè)元素分成A,B兩個(gè)集合,使每個(gè)集合的前K大中的黑色元素的總和最大。

solution:

  因?yàn)槊總€(gè)元素都有兩個(gè)關(guān)鍵字,而且每個(gè)關(guān)鍵字只對(duì)對(duì)應(yīng)的集合有用,所以必須對(duì)其中一個(gè)關(guān)鍵字進(jìn)行固定。枚舉A集合的第K大是哪個(gè)元素(i),因?yàn)橹恍枰谏乜偤妥畲?#xff0c;所以A值比A[i]大的黑色元素都?xì)w到A集合,A值比A[i]小的白色元素也歸到A集合(防止該元素是B集合的前K大)。然后對(duì)黑色元素和剩下的白色元素進(jìn)行DP,狀態(tài)f[p][q]表示到前p個(gè)元素有q個(gè)元素分到了A集合的最大值。

  時(shí)間復(fù)雜度:$ O(n^3) $

P3

題目描述:

  給定一棵樹。在線求路徑點(diǎn)序列u -> ... -> v1,連續(xù)子序列a1,a2 ... ak滿足a1<a2< ... <aj>aj+1 >aj+2 >.....>ak或者a1>a2>... >aj< aj+1<aj+2<.... <ak,1<=j<=k,求最大的 \(k\)

solution:

  關(guān)于樹的算法不多,這題LCA就可以了,只是如何實(shí)現(xiàn)合并而已,我們對(duì)于LCA的每個(gè)區(qū)間記12個(gè)域:

  區(qū)間左端:

  - 遞增
  - 遞減
  - 先增后減
  - 先減后增

  區(qū)間右端:
- 遞增
- 遞減
- 先增后減
- 先減后增
- 區(qū)間左端編號(hào)
- 區(qū)間右端編號(hào)
- 區(qū)間長(zhǎng)度
- 最大值

  至于轉(zhuǎn)移方程嘛……,自己推。

  時(shí)間復(fù)雜度:$ O(n \log n) $

P4

題目描述:

  給出一個(gè)一開始為0的無窮棧,每次從棧頂拿出一個(gè)數(shù)\(top\),并把棧里剩下的元素最低位變成$ (Y+1) \mod K \((Y為之前的最低位),然后用top與L相比,如果\) top < L \(,那么X減一,否則把\)top+AK\(復(fù)制K份放入棧中。當(dāng)\)X=0$時(shí),結(jié)束操作,輸出top。

solution:

  這題的數(shù)據(jù)很大,因此應(yīng)該是找規(guī)律的題目。觀察可得,棧里面的數(shù)的變化只與出棧次數(shù)有關(guān),如果要把棧里的某一個(gè)元素出棧,必須經(jīng)歷s次出棧,而( s%K=1).

  令$ L=cAK+d \(,而棧里的數(shù)i只可能是\) i=pAK+p,(0\leq p\leq c+1, 0\leq q\leq d) \(因此我們可以尋找循環(huán)節(jié)。例如\)K=5,L=21,A=2$

  這表格包含了所有可能的數(shù)字,從縱向來看,它代表某一個(gè)數(shù)加AK的值,橫向來看,它代表每個(gè)數(shù)的變化。紅色為死亡瀕臨線。對(duì)于第二行(從下向上數(shù))的數(shù)來說,必須死13次才能將其出棧,對(duì)于第一行來說,必須要死135次才能將其出棧。如果要將第一行的全部出棧,必須死$ 135^2 $次。

再舉一個(gè)例子:\(K=5,L=26,A=2\)

對(duì)于第三行要5次,第二行(5^2),第三行(5^3),……

再利用第一個(gè)例子研究答案:

30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 * 31 32 33 34 30 * 22 23 24 * 30 31 32 33 34 * 22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 2331 32 33 34 30 * 22 23 24 * 30 31 32 33 34 * 22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 23 30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 *22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 23 30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 * 31 32 33 34 30 * 22 23 24 * 30 31 32 33 34 *……

  規(guī)律顯得,

  當(dāng)d<K時(shí),每行有( (d+1)K+(K-d-1) )個(gè)元素,每一部分為一行出棧的死亡情況,所以答案的循環(huán)節(jié)(即整個(gè)表格死一次)為( ((d+1)K+(K-d-1))K^c )

  算答案時(shí)令( t=(d+1)K+(K-d-1) ),把X拆成( X=a_{0}+\sum_{i=1}^{c}a_{i}tK^{i-1} ),通過( (\sum_{i=1}^{c}a_{i})%K )算出答案所在行,再利用( a_{0} )確定列。

  當(dāng)d>=K時(shí),每行有K個(gè)元素,所以答案的循環(huán)節(jié)為( K^(c+2) ),計(jì)算答案就想一想好了。

  廢話不說(我也解釋不清),上代碼(和鏈接)

  wck

  lyl

#include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <ctime> #include <queue> #include <deque> #include <map> #include <vector> using namespace std; typedef long long LL; const LL oo=1e18;int T; LL X, K, L, A;int main() {freopen("avenger.in", "r", stdin);freopen("avenger.out", "w", stdout);scanf("%d", &T);while (T--){scanf("%I64d%I64d%I64d%I64d", &X, &K, &L, &A);LL AK=A*K;LL c=L/AK, d=L-AK*c;LL ans=0;if (d>=K-1){--X;for (int i=1; X && i<=c+2; X/=K, ++i)ans=(ans+X%K)%K;printf("%I64d\n", (c+1)*AK+ans);}else{LL t=(d+1)*K+(K-d-1);--X;LL a0=X%t;X/=t;for (int i=1; X && i<=c; X/=K, ++i)ans=(ans+X%K)%K;if (ans<d+1)//the last is in the front最后一行在前{if (a0<(d-ans+1)*K)//the last{LL tmp=a0%K;a0/=K;printf("%I64d\n", (c+1)*AK+(ans+a0+tmp)%K);}else//the last but one倒數(shù)第二行{a0-=(d+1-ans)*K;if (a0<K-1-d) printf("%I64d\n", c*AK+d+1+a0);else//the last最后一行{a0-=(K-1-d);printf("%I64d\n", (c+1)*AK+(a0%K+a0/K)%K);}}}else//the last but one is in the front倒數(shù)第二行在前{if (a0<(K-d-1)-(ans-d)+1)printf("%I64d\n", c*AK+a0+ans);else//the last最后一行{a0-=(K-d-1)-(ans-d)+1;if (a0<K*(d+1))printf("%I64d\n", (c+1)*AK+(a0/K+a0%K)%K);else//the last but one倒數(shù)第二行{a0-=K*(d+1);printf("%I64d\n", c*AK+d+1+a0);}}}}}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/GerynOhenz/p/4361184.html

總結(jié)

以上是生活随笔為你收集整理的GDKOI2015 Day2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。