NOI Online 提高組 序列

2021-10-04 07:04:51 字數 1682 閱讀 8169

點此看題

賽場上掛了是因為不知道每個操作能無限次使用,後來發現這道題挺簡單的。

首先我們可以把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 是有貢獻的...