[題解/考試]國王飲水記

前言:今日又考試了,一道斐波那契的入門題因為沒有特判0錯了一個點,兩道不會,結果連rk7、8都沒拿到,

前天把鉛筆盒丟掉了,裡面有筆,耳機和U盤。U盤裡有做過的題,一些模板,寒假講的東西和課件,6個遊戲,一些安裝包和一些網址。

發現丟掉以後就變得特別絕望,極度悲傷,可是這就是命運啊,你不接受那就去死好了。

人活著本來就沒有什麼意義可言,尋找意義自然也是不可能尋找到的了。

意義什麼的都是小孩子的事情,所以只能這樣活著了。

與其如此那還不如把U盤裡的東西裝到腦子裡,也不必擔心什麼了。



n個點,按順序有m條邊,每次詢問最大的最小生成森林的邊權和以及1號所在的聯通塊點數(包括自己)。

輸入:第一行n,m。 接下來m行,每條邊的u,v,w。

輸出:m行,每行 權值之和、1所在聯通塊的點數。

數據規模:60% n,m<=1000

     100%n,m<=5000,1<=u,v<=n,u!=v,0<w<=10^5.

對於圖G=(V,E),選取E‘ 屬於E,不產生重邊和環,并使|E‘|最大,在這個前提下,使得總邊權最小,那麼G‘=(V,E‘)就是最大的最小生成森林。



要想拿到100分還不知道怎麼寫,不過對我來說60分的解法都不會......

60%思路:

每讀進來一條邊就可以用并查集亂搞,如果這兩點沒有聯通,那麼直接連上就行,sum加一下w就行

如果已經聯通,那麼這條邊就有可能更新sum值,這裡可以每次都跑一次最小生成樹,重置sum再把選中的邊加上,但是複雜度有點高。

dalao的代碼:(我的還沒改出來)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define R register int
using namespace std;
struct edge {
    int u,v,w;
    bool operator < (const edge& y)const{return w<y.w;}
}e[5001],tmp[5001];
int n,m,f[5001],s[5001],cnt=1,ans,cntw,lst;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch==‘-‘?-1:fix;
    do ret=(ret<<1)+(ret<<3)+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
inline void init(int k) {
    for(R i=1;i<=k;i++) f[i]=i,s[i]=1;
}
int getf(int x) {
    return x==f[x]?x:f[x]=getf(f[x]);
}
inline bool merge(int u,int v) {
    R uf=getf(u),vf=getf(v); if(uf==vf) return true;
    else {
        if(uf==1) {
            f[vf]=uf; s[uf]+=s[vf];
        }
        else if(vf==1) {
            f[uf]=vf; s[vf]+=s[uf];
        }
        else {
            f[vf]=uf; s[uf]+=s[vf];
        }return false;}
}
//    inline void kruskal(int k){
//        for(R i=lst+1;i<=k;i++) tmp[i].u=e[i].u,tmp[i].v=e[i].v,tmp[i].w=e[i].w; ans=0;
//        sort(tmp+1,tmp+k+1); init(k);
//        for(R i=1;i<=k;i++){
//            if(!merge(tmp[i].u,tmp[i].v)) ans+=tmp[i].w;
//        }
//    }
namespace krusk{
    int fa[5001];
    inline void init(int k) {for(R i=1;i<=k;i++) fa[i]=i;}
    int getf(int x) {
        return x==fa[x]?x:fa[x]=getf(fa[x]);
    }
    inline bool merge(int u,int v) {
        R uf=getf(u),vf=getf(v); if(uf==vf) return true;
        else {fa[vf]=uf; return false;}
    }
    inline void kruskal(int k){
        for(R i=lst+1;i<=k;i++) tmp[i].u=e[i].u,tmp[i].v=e[i].v,tmp[i].w=e[i].w; ans=0;
        sort(tmp+1,tmp+k+1); init(n);
        for(R i=1;i<=k;i++){
            if(!merge(tmp[i].u,tmp[i].v)) ans+=tmp[i].w;
        }
    }
}
signed main() {
    n=g(),m=g(); for(R i=1;i<=n;i++) f[i]=i,s[i]=1;
    for(R i=1;i<=m;i++) e[i].u=g(),e[i].v=g(),e[i].w=g();
    for(R i=1;i<=m;i++) {
        R u=e[i].u,v=e[i].v,w=e[i].w;
        if(merge(u,v)) {
            krusk::kruskal(i);
            cntw=min(cntw,ans);
        }
        else {
            cntw+=w;
        }
        printf("%d %d\n",cntw,s[1]);
    }
    return 0;
}

以後可能會更新的吧

原文地址:https://www.cnblogs.com/superminivan/p/10486988.html

时间: 2024-10-09 01:56:15

[題解/考試]國王飲水記的相关文章

香港小學一年級入學考試題

據說小学生几秒就做出:高中生几分钟:大学生半小时以上:博士可能要一辈子...... What takes an elementary school student just seconds to do; takes a high school student several minutes; takes a college student half and hour and up; and takes a Ph.D a lifetime- 請看題: the question is: 來源: ch

[題解](水/數學)luogu_P1147連續自然數和

尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时, 可以列一个二元一次方程组 R-L+1=K1 L+R=K2 解得L=(K2-K1+1)/2, R=(K1+K2-1)/2 当K1,K2一奇一偶时,L,R才有自然数解. 不过有一种特殊情况,就是L=R的情况,这种情况是不允许的 即(K2-K1+1)/2≠(K1+K2-1)/2,解得K1≠1 尺取

DevExpress的GridControl控件更新數據問題解決辦法

開發WPF程序時,使用Devexpress的GridControl控件用ItemSource綁定數據,在頁面進行編輯時,當屬性繼承INotifyPropertyChanged接口時會同步更新後臺數據.今天在開發時遇到一種情況,當通過GridControl中Row上Button[Command]改變行內數據,也就是binding的Detail數據已改變,這時NotifyPropertyChanged有觸發,但改變的行數據不會同步更新到UI上,目前測試有兩種方式進行解決. 1.直接new 一個新的行

[題解]51nod_1515_明辨是非

好久沒有話多了,是覺得有點浪費時間,今天考試和一中用的一樣的題,結果反而考得不好,不過Jackpei一句知恥而後勇點醒夢中人偷偷@Jackpei 就是這樣吧 還有我極度懷疑我的鍵帽打油了......我買了假的PBT還是我的手實在是太油了...... 強制在線,因為不等關係沒有傳遞性,於是用set維護不等關係,并查集維護相等關係, 合併時把set也合併掉,具體就是直接複製合併,複雜度可以接受,雖然並不會算 於是大力瞎搞,我調了半天錯在了合併set搞錯了,it本來就是s[xx]的迭代器,怎麼能和自己

[題解](二分答案/單調隊列)luogu_P1419尋找段落

果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有更大的平均數, 求子串和最大值可以用單調隊列維護, #include<bits/stdc++.h> using namespace std; const int maxn=100010; int n,s,t; double a[maxn],sum[maxn]; int b[maxn],q[maxn

[題解](狀壓/水)luogu_P1879玉米田

大水題然而因為智障的錯誤调了半天......n,m别反着输入啊......內外循環和狀態數都不等價 别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可 #include<bits/stdc++.h> using namespace std; const int mod=100000000; int n,m,tot; int f[15][1<<12+1],c[1<<12+1]; int can[15]; int main() { scanf("%

[題解](貪心/堆)luogu_P2107小Z的AK計劃

清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不選前面那個選當前這個,應該是比較好的思想 這道題還有一個就是如果最優解要你走到那個點,那麼中間的路程是不可省略的,所以貪心時大可不考慮 反正實質上是個dp,取的是最大值 #include<bits/stdc++.h> #define ll long long using namespace std

软件工程03—亚瑟王の十三水1.0

1.结对情况 031702544钟伟颀 031702540陈锦鸿 2.原型分析 原型设计实现工具:Axure RP 8 需求分析: 本次任务是设计一套纸牌游戏"福建十三水"的自动化出牌系统.设计的界面主要包括: 1)用户的登录与注册 2)开启一场游戏,并且能进行自动分墩,自动亮牌 3)能查看每局的结果及收益 4)能查看全服排行 5)能查看用户个人的各种信息,包括昵称,积分,往期的对战记录 原型贴图分析: 首先是游戏整体的流程图: 游戏的初始界面: ????单击页面任意位置便可以进入游戏

V - 不容易系列之(4)――考新郎(第二季水)

Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:         首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;         然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.         最后,揭开盖头,如果找错了对象就要当众跪搓衣板...         看来做新郎也不是容易的事情...         假设一共有