interesting computer game
題意:給你n對數,然後每對數只能挑乙個數,並且如果這個數在前面被挑過了,那麼就不能被挑選,問最多能挑多少個數
思路:我一開始想到的是拓撲排序,畢竟之前正好刷過這樣類似的幾道題,然並軟,我就是沒有做出來。也有拓撲排序的解法,然而我並沒有想出來。。待補
並查集
先說一下建圖把,雖然說挺簡單的,先對我們得到的數進行離散化,因為數有可能為1e9,這超出我們能開的陣列的範圍,而實際上題目最多能給我們2e5個不同的數,然後就是簡單的建圖了,每個數為乙個節點,邊即為每對出現就相連。
首先要知道這樣乙個性質,一條鏈一旦其中有乙個環,包括自環,那麼他所能選到的數一定是本身的節點個數,反之只能得到為其自身節點個數減一。
並查集**如下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
#define ios std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
#define pi 3.14159265358979323846
const
int inf =
1e9;
const ll onf =
1e18
;const
int maxn =
1e5+10;
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}int fa[maxn*2]
, a[maxn]
, b[maxn]
, c[maxn*2]
, vis[maxn*2]
;int
find
(int x)
inline
voidcf(
)sort
(c, c +
2* n)
;int ans =0;
int x =
unique
(c, c +
2* n)
- c;
for(
int i =
0; i < n; i++
)for
(int i =
1; i <= x; i++
)for
(int i =
0; i < n; i++
)else vis[r1]=1
;//設r1為這個環的頭
}for
(int i =
1; i <= x; i++)}
printf
("case #%d: %d\n"
,z++
, x-ans);}
return;}
signed
main()
牛客多校第八場
簽到題,可真短。題意 給n個數,對於每個連續子串行求區間內不同數字的個數的和。做法 一開始列舉每個區間的右端點i,判斷每個數字在區間左端點為1 i這個範圍內對右端點i的貢獻,然後累加答案,然後超時了。之後想到,每次變化範圍只會變乙個數字,只會改變乙個數字的貢獻,所以開了乙個sum記錄所有數字的貢獻就...
2020暑假牛客多校第八場 I
思路 並查集來入點,進乙個就有ans 當成環時ans也 標記,當兩個標記的並查集合並時不 當乙個標記乙個不標記時,ans 並且標記新的集合,當兩個都不標記的集合合併時,ans 不標記。include include include include include include include in...
2019牛客多校第八場
求所有極大全一矩陣的個數。created by keane on 2019 8 10.include using namespace std typedef long long ll const int n 3050 int a n n int n,m char s n 每個1向下延伸 int dw...