計蒜之道複賽 B D F

2022-09-17 13:45:20 字數 3571 閱讀 5427

b題是乙個簡單的模擬

求一下兩個點中間每過deta的整數點

然後更新一下每個點的最後一次經過就好了

1 #include2

#define cl(a,b) memset(a,b,sizeof(a))

3#define debug(x) cerr<<#x<<"=="<<(x)<4

using

namespace

std;56

const

int maxn=300+10;7

8int gcd(int a,int b)

9int abs(int a)

1011

inta[maxn][maxn];

1213

intmain()

1433}34

intq;

35 scanf("

%d",&q);

36while(q--)

3742

return0;

43 }/*

4445

5 846

2 5 5 2

475 2 3 8

488 4 1 4

492 2 5 8

508 7 4 1514

523 4

535 2

546 4

553 5

5657

*/

d是乙個最短路

而且用到了虛點的操作

每個城市群都是乙個虛點

也就是對每個城市群需要加兩個點 u'和u''

在每個群內的城市連自己的城市群是

u'->v

v->u''

然後每個城市群之間

u'->v''

v'->u''

直接跑一遍spfa就行

需要注意的是:

1.n和m沒有規定誰大誰小 所以加點的時候n*2+i和n+i是會衝突的

2.因為最大的值是2e5*2e6>2^31-1 所以ans要用ll存

3.由於上一點的存在 inf也要改……

1 #include2

#define cl(a,b) memset(a,b,sizeof(a))

3#define debug(x) cerr<<#x<<"=="<<(x)<4

using

namespace

std;

5 typedef long

long

ll;6

7const

int maxn=4e5+10;8

const ll inf=2e12;910

struct

edge

1115

};16

17 vectore[maxn];

1819

void addedge(int u,int v,int

w)20

2324

bool

vis[maxn];

25int

cnt[maxn];

26ll dist[maxn];

27int

n,m;

28int

start,over;

2930 ll spfa(int start,int

n)31

37 vis[start]=true

;38 dist[start]=0

;39 queueque;

40while(!que.empty())que.pop();

41que.push(start);

42 memset(cnt,0,sizeof

(cnt));

43 cnt[start]=1;44

while(!que.empty())

4561}62

}63}64

return

dist[over];65}

6667

intmain()

6881}82

intm1;

83 scanf("

%d",&m1);

84for(int i=0;i)

8591

intm2;

92 scanf("

%d",&m2);

93for(int i=0;i)

94100 scanf("

%d%d

",&start,&over);

101 ll ans=spfa(start,n);

102 printf("

%lld\n

",ans>=inf?-1

:ans);

103return0;

104 }/*

105106

5 4107

2 5 1

1082 2 4

1091 3

1102 3 4

1112

1121 2 9

1131 5 18

1142

1151 2 6

1161 3 10

1171 5

118119

*/

f是乙個狀壓dp

(雖然沒有16這麼**的數字 但是18也很明顯了~

第一維表示當前狀態 01表示是否刪除

第二維表示已經刪除的步數

用l r來列舉區間

資料範圍不是很大(2^n)*n*n是可以容忍的

(也是調了好久啊……

1 #include2

#define cl(a,b) memset(a,b,sizeof(a))

3#define debug(x) cerr<<#x<<"=="<<(x)<4

using

namespace

std;

5 typedef long

long

ll;6

7const

int maxn=20;8

const

int mod=1000000007;9

10int gcd(int a,int

b)11

1415

bool check(int x,int

y)16

1920

intn,k;

21int

a[maxn];

22int dp[(1

<2324

void

solve()

2545}46

}47}48

}49}50

}5152int

main()

5360 dp[0][0]=1;61

solve();

62 ll ans=0;63

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

6468 printf("

%lld\n

",ans);

69return0;

70 }/*

7172

4 173

1 1 1 1

7475

*/

2019 計蒜之道 複賽 D 「星雲系統」

現在給定你乙個字串s以及乙個整數k,請求出s的字典序最小的長度為k的子串行。題目鏈結 第一行乙個由小寫英文本母構成的字串s,第二行乙個正整數k。一行乙個字串ans,表示答案。0helloworld 5ellld 設串長為n,則只需刪掉n k個字元。用乙個單調棧維護,依次將字串的每個字元插入,如果當前...

2019 計蒜之道 複賽 D 「星雲系統」

全世界的中心傳輸節點和各地的網路節點組成的這個 星雲系統 何其複雜。我們現在只考慮一條支線上的網路節點,每乙個網路節點比作乙個字元的話,這條支線就是乙個字串。現在給定你乙個字串 ss 以及乙個整數 kk,請求出 ss 的字典序最小的長度為 kk 的子串行。第一行乙個由小寫英文本母構成的字串 ss,第...

計蒜之道2018 複賽 G(排列組合)

思路 沒注意串的大小有1e5,寫了發列舉並線性匹配發現超時了。這種問題往往要逆推!題目讓我們考慮str的去重全排列串中pattern的匹配次數,我們可以發現,只要str中有pattern的字母,那麼,str在排列的過程中至少會出現1次的pattern。於是,根據乘法分步原理,我們優先把str中湊成p...