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...