並查集+樹狀陣列離散化
要點一、由於題目中給出的對於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 然後...