集训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

浙公网安备 33010602011771号