點此看題
賽場上掛了是因為不知道每個操作能無限次使用,後來發現這道題挺簡單的。
首先我們可以把a
aa變成0
00,b
bb變成b−a
b-ab−
a 。然後對於t=2
t=2t=
2的操作,我們可以直接連邊,在同一連通塊裡的點權值可以互相轉化,我們把每乙個連通塊看作乙個點。
對於t =1
t=1t=
1的操作,如果我們把它看作點(連通塊)連的邊,那麼如果兩個點之間的路徑長為偶數,那麼他們的權值可以互相轉化,我們可以對這個圖黑白染色,如果染色不成功(某個點有兩種顏色),說明這一片的權值和只要為偶數就行。如果染色成功,考慮每個點內部是否有邊,如果有邊和上述判斷方法一樣,否則看黑點和白點的權值是否相等即可。
讀題不仔細,報零兩行淚
#include
#include
#include
using
namespace std;
#define ll long long
const
int m =
100005
;int
read()
int t,n,m,k,p,a[m]
,x[m]
,y[m]
,bel[m]
,col[m]
,tag[m]
;ll sum[m]
,sa,sb,tg;vector<
int> g[m]
,h[m]
;void
dfs1
(int u,
int c)
}int
dfs2
(int u,
int c)
return f;
}int
main()
for(
int i=
1;i<=n;i++
) a[i]
=read()
-a[i]
;for
(int i=
1;i<=m;i++)}
memset
(bel,0,
sizeof bel)
;memset
(sum,0,
sizeof sum)
;memset
(tag,0,
sizeof tag)
;for
(int i=
1;i<=n;i++)if
(!bel[i]
)dfs1
(i,++p)
;for
(int i=
1;i<=k;i++)if
(bel[x[i]
]==bel[y[i]])
tag[bel[x[i]]]
=1;else
memset
(col,-1
,sizeof col)
;bool f=1;
for(
int i=
1;i<=p;i++)if
(col[i]==-
1)else f&
=(sa+sb)%2
==0;}
puts
(f?"yes"
:"no");
}}
NOI Online 1 提高組 序列
luogu p6185 noi online 1 序列 將其轉化為圖論題。定義 u,v 為 a i 所代表的點 u v 為 b i 所代表的點 對於操作 2 將其視為一種權值搬運的操作,從 u 到 v 或者反過來轉移點權。那麼我們對 u,v 和 u v 連一條無向邊,顯然對於乙個連通塊內的所有點都可...
NOI Online 3 提高組 優秀子串行
點此看題 首先有乙個樸素dpdp dp,因為每個數字都只會最多出現1 11次,而且出現數字相同的不同情況最後也可以一起算答案 和一定 那麼我們只需要統計出方案數,dp i dp i dp i 為二進位制位出現的裝壓為i ii,轉移列舉包含i ii的狀態j jj,設a i a i a i 為值i ii...
NOI Online 2 提高組 子串行問題
給定乙個長度為 n 的正整數序列 a 定義乙個函式 f l,r 表示 序列中下標在 l,r 範圍內的子區間中,不同的整數個數。現在,請你求出 sum n sum n f l,r 2 由於答案可能很大,請輸出答案對 10 9 7 取模的結果。挺有意思的題目。比如乙個數 a i 它對哪些 f 是有貢獻的...