t1:
題目大意:有一張有向無環圖,第$x$次經過邊$i$的代價為$a_ix+b_i$,最多經過$c_i$次,起點為1,$s$個點可作為終點,求走$k$次的最小代價。
我們新建乙個匯點,將所有可做為終點的邊到匯點連邊,那麼本題便成為了費用流模型。
貪心策略為:每次走最短路。
證明:路徑的順序是可以改變的,設每次走的路徑代價是遞增的,如果當前不走最短路,那麼以後不可能有一條路能將代價追回,所以當前走最短路一定最優。
但是每次增廣代價是不同的,我們只能進行完一次增廣之後立即修改邊權。
考慮ek,每次用spfa找一條代價最小的增廣路,並更新費用即邊權,若當前邊是正向邊,則將正向邊權加$a_i$,反向邊權減$a_i$,反之將正向邊權減$a_i$,反向邊權加$a_i$。正向邊初始權值為$a_i+b_i$,由於反向邊退流退的是上一層的費用,所以初值應賦為$-b_i$。
然後增廣k次,若流量不能達到k,輸出-1。
spfa複雜度視為$o(nm)$時,時間複雜度$o(nmk)$,但遠遠達不到。
code:
1 #include2 #include3 #include4t1t2:using
namespace
std;
5const
int n=1010;6
const
int m=20010;7
const
int inf=1e9+10;8
int n,m,k,s,nm=1,ans=0;9
intfi[n],p[n],d[n];
10bool
v[n];
11struct
edgee[m+n<<1
];15 queueq;
16int
read()
1724
return
s;25}26
void add(int x,int y,int z1,int z2,int
z3)27
33bool
spfa()
3438
while(!q.empty()) q.pop();
39 d[1]=0;v[1]=true;q.push(1
);40
while(!q.empty())51}
52}53}
54if(d[n]return
true;55
else
return
false;56
}57void
update()
5867}68
intmain()
6976
for(int i=1;i<=m;i++)
80int tot=0;81
while(totspfa())
84if(tot!=k) printf("
-1\n");
85else printf("
%d\n
",ans);
86return0;
87 }
題目大意:有兩串數字x和y,以及n串數字段,求$[x+1,y]$內至少含有n個數字段的數的個數,對$1e9+7$取模。
乙個數字段可以被包含多次,重複的數字段也要重複計算。
由區間可以看出此題為數字dp,然後發現字串包含,於是想ac自動機。
然後這道題變為了ac自動機上的數字dp。
按照數字dp方法,我們先求出$[1,y]$中合法解的個數,再減去$[1,x]$中合法解的個數,即為答案。
建出ac自動機,每個點的權值為以該節點為結尾的串的數量,用trie圖優化,注意每個節點要繼承fail的資訊。
設$dp[i][j][k][0/1]$,代表匹配到第i位,在節點j,匹配了k個子串的方案數,1代表有限制,0代表無限制。
對於每個數,有無字首0與其大小無關,於是我們可以帶著字首0進行dp轉移。
設$s$為指向$x$的點集,$w[i]$為節點i的權值,$t[i]$為節點i的型別,$a$為較大的邊界,則:
$dp[i][x][j][0]= \sum _ dp[i-1][y][j-w[x]][0]+[t[x]
$dp[i][x][j][1]=[t[x]==a[i]]* \sum _ dp[i-1][y][j-w[x]][1]$
由於沒有考慮字首0影響,統計答案時只累加長度等於原串的答案即可。
時間複雜度$o(nsk)$,$s$為子串總長。
code:
1 #include2 #include3 #includet24 #include5 #include6
#define ll long long
7using
namespace
std;
8const ll mod=1e9+7;9
int n,k,rt=0,cnt=0;10
string
s;11
int a[2][510
];12 ll dp[510][210][20][4
];13
bool v[510][210][20][4
];14
struct
triet[210
];18 queueq,q1,q2,q3,q4;
19void
insert()
2028 t[now].e++;29}
30void
build()
3135
while(!q.empty())
43else t[x].ch[i]=t[t[x].fail].ch[i];44}
45}46}
47 ll work(int
id)48
54 dp[0][rt][0][3]=1;v[0][rt][0][3]=true
;55 q1.push(0);q2.push(rt);q3.push(0);q4.push(3
);56
while(!q1.empty())71}
72else78}
79}80else87}
88else94}
95}96}
97}98 ll ans=0;99
for(int j=0;j<=cnt;j++)
103return
ans;
104}
105int
main()
106115
build();
116 ll ans=work(1
);117 ans-=work(0
);118 ans=(ans%mod+mod)%mod;
119 printf("
%lld\n
",ans);
120return0;
121 }
2018省選訓練29 A
線段樹妙題,題意是給定乙個數列,操作有區間與 或乙個值,和查詢區間最大值。維護乙個same表示,區間內的數哪些位是全部相同的,以及bit,表示相同的是什麼,修改操作本質是將乙個區間某些位強制賦為1 0,如果修改的位是當前區間same的子集,直接用一些奇奇gaygay的位運算,最後發現,相當於區間加乙...
考試反思 0822NOIP模擬測試29 延續
想保持優秀很困難 但是想持續墊底卻很簡單 但是你不想墊底的話持續墊底也很容易。分ab卷,a卷共15人。skyh205,yxm175,tdcp170,kx155,b哥145。我 35,倒數第一。板子專題,爆零快樂!連續兩場倒數第一了。要穩第二機房了?那好吧。沒辦法。水平不夠吧。開考先看題。t1想暴力跑...
牛客小白月賽29 A 進攻
題目位址 一 題目內容 二 解題思路 scimoon 率領的反叛軍已經做好了準備 他的手下有 n 個戰機,每架戰機有乙個破壞力 ai 帝國有 m 個基地,每個基地有乙個防禦值 di,基地有乙個價值 vi 若乙個戰機的攻擊力嚴格大於基地的防禦值,則可以破壞該基地,得到這個基地的價值 v 帝國的後備資源...