內網傳送門
今天考 noip 模擬,拿了 270
27027
0 分,我要膨脹了。
主要還是運氣好,t3 做過原題,t2 算是某道題的弱化版,t1 推了個結論用 o(n
log2n
)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∣
3logn
)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
logn)
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 連出...