NOIP模擬測試29 A

2022-05-06 20:54:12 字數 3432 閱讀 6193

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 #include4

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 }

t1t2:

題目大意:有兩數字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 #include

4 #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 }

t2

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 帝國的後備資源...