集训Day13~15总结

专题:

Day \(13\) 数据结构(一):

1.专题结束前做了 \(3\)

Day \(14\) 数据结构(二):

1.专题结束前做了 \(5\)

2.补题 \(1\)

\(E\) 题的代码我觉得题解写的都太麻烦了

我的代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int f[N],st[N];
struct Node{
    int l,r;
}a[N];
bool cmp(Node a,Node b){
    return a.l<b.l;
}
int find(int x){
    if(f[x]!=x) return f[x]=find(f[x]);
    return f[x];
}
void merge(int x,int y){
    int rx=find(x),ry=find(y);
    if(rx!=ry) f[ry]=rx; 
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        merge(x,y);
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        int ff=find(i);
        if(!st[ff]){
            a[++cnt]={i,i};
            st[ff]=cnt;
        }
        else{
            a[st[ff]].l=min(a[st[ff]].l,i);
            a[st[ff]].r=max(a[st[ff]].r,i);
        }
    }
    sort(a+1,a+cnt+1,cmp);
    int ans=0,r=a[1].r;
    for(int i=2;i<=cnt;i++){
        if(a[i].l<r) ans++;
        r=max(r,a[i].r);
    }
    printf("%d",ans);
    return 0;
}

直接按照左端点排序,然后合并就可以了

Day \(15\) 数据结构(三):

1.专题结束前做了 \(2\)

2.补题 \(1\)

模拟赛五游记

总分:\(200pts\) 排名:\(15\)

挂分\(100pts\)

赛前听说很难,已经准备好了打 \(4\) 个暴力的准备

\(T1\)\(100pts\)

\(T1\) 很简单,大概 \(30min\) 左右做出来的,需要发现的就是 \(0\) 的相对顺序不会变,就非常好做了

\(T2\)\(100pts\)

\(T2\) 相比于 \(T1\) 细节较多,因为挂了太多次 \(T2\),所以检查了好几遍,贪心的去想要先染后面的,因为前面的可以覆盖,需要注意的有两点。一是要注意如果当前要染的颜色和上一个颜色相同的话,那么只能染到上一个颜色前,二就是染色中间可能会遇到相同颜色,需要减掉。

\(T3\)\(0pts\)

这是一道很悲惨的题

\(0pts\) 代码 \(VS\) \(100pts\) 代码:

\(0pts\)

printf("%lld\n",ss[l*i]-1ll*l*s);

\(100pts\)

printf("%lld\n",ss[min(n,l*i)]-1ll*l*s);

爆零原因是,因为题中说:如果最后剩余的元素不足 \(k\) 个,则这些元素单独组成最后一组。

最后前缀和算答案的时候 \(check\) 里面和 \(n\)\(min\) 了,输出忘了,因为前缀和只算到了 \(n\),后面都是 \(0\),导致减成了负数,喜提 \(0pts\)

样例太水了,没测出来,自己出的样例也没测出来。

\(T4\)\(0pts\)

\(T4\) 时大概还剩下 \(20min\) 左右,随便写了一些看起来就很不对的代码就交上去了,但是 \(freopen\) 居然屏蔽了!不过删掉屏蔽也是 \(0pts\)。。

总结:要多试一些样例

补题:3/4

模拟赛六游记

总分:\(330pts\) 排名:\(4\)

这是目前为止第一场没有挂分的模拟赛

\(T1\)\(100pts\)

\(T1\) 不是很难,先瞪眼瞪出来个结论,然后简单证明一下,就 \(A\) 了。

\(T2\)\(100pts\)

\(T2\) 也不是很难,只需要枚举有多少个 \(1\),然后再枚举位数,求出有 \(i\)\(1\) 且位数为 \(j\) 的最小值,然后把后面的空位都赋成 \(9\),和 \(n\)\(min\),减去最小值再加一,就可以。

最开始写的有一些问题,不过对拍对出来了!👏👏👏

让对拍程序跑到 \(1e6\),一直跑到比赛结束,还差 \(100000\) 没有跑完

\(T3\)\(100pts\)

\(T3\) 感觉试第三次遇到这种题了,图论(一)的 \(E\) 和图论(三)的 \(D\) 都很像,不过需要建双向边去跑,答案就是 \(C_n^1+C_n^2+...+C_n^n\) 也就是 \(2^n-1\)

\(T4\)\(30pts\)

\(T4\)\(30pts\) 暴力很好打,因为不知道是不是捆绑,还打了几个特判骗分,但是是捆绑,所以都没用。。

这是赛时的骗分代码:

for(int i=1;i<=n;i++){
	double len=1.0*s/(n-i+1); 
	ans=max(ans,len*(ss[n]-ss[i-1]));
}

当时想到可以这样求,如果 \(len>m\),就把剩下的 \(s\)\(i\) 的前面去找,想写一个递归,直到找到 \(len<=m\),但是当时没什么时间了,就去检查 \(freopen\) 了。

成功稳妥的拿到 \(30pts\)

总结:发挥还不错的一场模拟赛

补题:4/4

posted @ 2026-08-11 08:41  yushihan  阅读(11)  评论(0)    收藏  举报