2019 10 12 校內模擬

2021-09-28 14:10:52 字數 4191 閱讀 1809

內網傳送門

今天考 noip 模擬,拿了 270

27027

0 分,我要膨脹了。

主要還是運氣好,t3 做過原題,t2 算是某道題的弱化版,t1 推了個結論用 o(n

log⁡2n

)o(n\log^2n)

o(nlog2n

) 水過了 106

10^6

106 的資料。

這題其實挺簡單的,把圖的點雙求出來之後,合法的情況就是點數 =

== 邊數的點雙,直接統計答案即可。

時間複雜度 o(n

+m

)o(n+m)

o(n+m)

#include

using

namespace std;

const

int n=

1e6+5;

int n,m,t=

1,tot,top,bcc;

int first[n]

,v[n<<1]

,nxt[n<<1]

;struct edgee[n]

;inline

void

add(

int x,

int y)

int low[n]

,dfn[n]

,stk[n]

,in[n]

,point[n]

,size[n]

,val[n]

;inline

void

tarjan

(int x,

int pre)}}

else

if(dfn[to]

) low[x]

=min

(low[x]

,dfn[to]

),stk[

++top]

=i/2;}

}int

main()

tarjan(1

,0);

int ans=0;

for(

int i=

1;i<=bcc;

++i)

if(point[i]

==size[i]

) ans^

=val[i]

;printf

("%d\n"

,ans)

;return0;

}

前面的部分就是奧術神杖這題的弱化版吧。

但是有個問題就是 n≤1

012

n\le10^

n≤1012

的資料顯然是不能直接 dpdp

dp的,由於轉移的方程始終相等,考慮矩陣快速冪優化。

注意一下過載矩陣的乘法以及矩陣的初始化即可。

時間複雜度 o(∣

∑si∣

3log⁡n

)o(|\sum s_i|^3\log n)

o(∣∑si

​∣3logn)

#include

#define n 205

#define ll long long

#define inf 1e15

using

namespace std;

ll n,ans;

int m,tot,a[n]

;char s[n]

;struct triet[n]

;struct matrix

}friend matrix operator*(

const matrix &a,

const matrix &b)

friend matrix operator

^(matrix a,ll b)

}a,b;

void

insert

(int v)

t[p]

.val+

=v;}

void

get_fail()

else t[x]

.son[i]

=t[t[x]

.fail]

.son[i];}

}}void

init()

}}intmain()

我記得我做過這道題的原題。

直接用線段樹優化建圖然後跑拓撲排序,注意一下一開始就確定的點即可。

時間複雜度 o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

using

namespace std;

const

int n=

1e6+

5,m=

5e6+

5,lim=

1e9;

int n,s,m,t,tot,flag;

int a[n]

,p[n]

,in[n]

,f[n]

,first[n]

,v[m]

,w[m]

,nxt[m]

;void

add(

int x,

int y,

int z)

void

file()

intread()

#define mid ((l+r)>>1)

void

build

(int root,

int l,

int r)

p[root]

=++tot;

build

(root<<

1,l,mid)

,build

(root<<1|

1,mid+

1,r)

;add

(p[root<<1]

,p[root],0

),add(p[root<<1|

1],p[root],0

);}void

edge

(int root,

int l,

int r,

int x,

int y,

int point)

if(x<=mid)

edge

(root<<

1,l,mid,x,y,point);if

(y> mid)

edge

(root<<1|

1,mid+

1,r,x,y,point);}

#undef mid

stack<

int>stk;

void

topsort()

while

(!stk.

empty()

)if(a[to]

&&f[to]

>a[to])if

(!(--in[to]

)) stk.

push

(to);}

}for

(int i=

1;i<=n;

++i)

}int

main()

tot=n,

build(1

,1,n);

while

(m--

) x=

read()

,add

(point,x,1)

;if(x-1

>=last)

edge(1

,1,n,last,x-

1,point);if

(x+1

<=r)

edge(1

,1,n,x+

1,r,point);}

flag=1,

topsort()

;if(!flag)

puts

("possible");

for(

int i=

1;i++i)

printf

("%d "

,f[i]);

printf

("%d"

,f[n]);

puts(""

);return0;

}

校內模擬 鎖

沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...

2019 10 03 校內模擬

內網傳送門 很明顯的乙個網路流。轉換一下題意,相當於求保留航線的最大值。所以我們把邊權取負跑最小費用流。有乙個坑點,就是我們只需要費用最小,不要求流量最大,所以不應該用最小費用最大流。有兩個解決辦法 用最小費用可行流。連 i,t,1,0 i,t,1,0 i,t,1 0 的邊,表示不選 i ii 連出...