2020牛客暑期多校訓練營(第八場)

2022-08-05 11:45:16 字數 2028 閱讀 6796

並查集+樹狀陣列離散化

要點一、由於題目中給出的對於a陣列的資料範圍在1~1e9,直接利用陣列是不現實的,所以我們用陣列a下標開陣列,這個範圍是1~1e5,開陣列是能夠接受的。

要點二、之前讀取的資料存在重複,則需要對其進行去重操作。

要點三、查詢連通塊,如果是,輸出連通塊中的節點個數;否則節點數減一。

#include #define t int t ;cin >> t;while(t--)

using

namespace

std ;

typedef

long

long

ll;const

int maxn = 2e5 + 10

;ll vis[maxn],a[maxn],b[maxn],c[maxn],pre[maxn];

//vis陣列表示的是當前的節點是否被訪問過

//pre陣列表示的是合併路徑

inline ll find(ll x)

inline

void

merge(ll u,ll v)

pre[x]=y;//

表示x,y的祖宗合併,即兩者為同一祖先

if(vis[x])vis[y]=1;//

該節點表示已被訪問

}int

main()

for(ll i=0; i<=maxn; i++)//

初始化操作

sort(c+1,c+tot+1);//

公升序排序,便於接下來的去重

int cnt=unique(c+1,c+tot+1)-(c+1);//

去重,方便編號

for(ll i=1; i<=n; i++)

int ans=tot;

for(ll i=1; i<=tot; i++)

cout

<<"

case #

"<": "

}}

題意:第一天的人數就是最多人數,目標是為了獲得利潤最大化,期間不得中斷,不管第一天是不是負利潤的,則會酒店會繼續運營下去,且必須全部賣出,如果之後某一天遇到負利潤只取乙份菜,接下去最多只能取乙份菜,直到利潤最大。

要點:字首和,在每個**讀入後,均計算其字首和

注意點:輸出的資料型別要麼採用__int128或者是long double,否則會wa

#include#define inf 0x3f3f3f3f

#define n 50050

using

namespace

std;

typedef

long

long

ll;const ll maxn=1e5+5

;template

inline void read(_tp&x);

inline

void

print(__int128 x);

template

inline void read(_tp&x)

inline

void

print(__int128 x)

if(x>9) print(x/10

); putchar(x%10+'0'

);}ll a[maxn],b[maxn];

intmain()

scanf(

"%lld

",&b[0

]);

for(ll j=1; j)

long

double max1=a[0

];

long

double max_profit=0

; b[n]=0

; a[n]=a[n-1

];

for(ll j=1; j<=n; j++)

printf(

"case #%lld: %lld %.0lf\n

",i,b[0

],max_profit);

}}

2020牛客暑期多校訓練營(第八場)

題意 給出n對數,對於每一對,其中如果有沒有選過的數那麼就可以選,就可以選擇那乙個數,ans 需要求最大的ans 思路 隊友很強,思路秒出,十分鐘 一發ac可以把這些數對想成一條邊上的兩個點,可以想像一下如果我要最多的選擇這上面的點,假如這些點構成的邊是一棵樹的話,我們最多在這n個點中能選擇的只有n...

2020牛客暑期多校訓練營(第八場)

總結 這次做的不好,爆零了,雖然確實本場題比較難,但是沒做出來確實問題很大,考慮問題不夠全面仔細。kg 待定給出n對數字a,b。有三種操作。第一種,什麼也不做。第二種,如果ai在在前面沒有被選過,可以選擇ai。第三種,如果bi在前面沒有被選過,可以選擇bi。求最多可以選擇多少種不同的數字。對數字進行...

2020牛客暑期多校訓練營(第八場)

題目鏈結 a all star game 題意 有n個運動員與m個球迷,現給你n個運動員各自的球迷編號,現在問你若要m名球迷都看比賽,至少需要多少名運動員上場?滿足球迷看比賽的條件 1 該球迷喜歡的運動員有上場 2 球迷i與球迷j都有相同的喜歡球員,則球迷j喜歡運動員k,則球迷i也喜歡運動員k 然後...