Educational Codeforces Round 65 (Rated for Div. 2)

A

签到

Educational Codeforces Round 65 (Rated for Div. 2)
#include<bits/stdc++.h>
using namespace std;
int T,n;
char s[10001];
int main()
{
    scanf("%d",&T);while(T--)
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        int ans=0;
        for(int i=1;i+10<=n;i++)
        if(s[i]=='8'){ans=1;break;}
        if(ans)puts("YES");else puts("NO");
    }
}
View Code

B

交互开始打错个地方WA了一发。不知道为什么给6个数,实际上能给7个两两乘积互不相同的数的。就是“? 1 2”“? 2 3”可以求解一个三元组,讨论一下即可,后一个三元组同理。

Educational Codeforces Round 65 (Rated for Div. 2)
#include<bits/stdc++.h>
using namespace std;
int a[7]={0,4,8,15,16,23,42},ax[1100],ay[1100],b[7];
int main()
{
    for(int i=1;i<6;i++)
    for(int j=i+1;j<=6;j++)
    ax[a[i]*a[j]]=i,ay[a[i]*a[j]]=j;
    int x,y;
    puts("? 1 2"),fflush(stdout);
    cin>>x;
    puts("? 2 3"),fflush(stdout);
    cin>>y;
    b[1]=ax[x],b[2]=ay[x];
    if(ax[y]==b[1]||ay[y]==b[1])swap(b[1],b[2]);
    if(ax[y]==b[2])b[3]=ay[y];else b[3]=ax[y];
    puts("? 4 5"),fflush(stdout);
    cin>>x;
    puts("? 5 6"),fflush(stdout);
    cin>>y;
    b[4]=ax[x],b[5]=ay[x];
    if(ax[y]==b[4]||ay[y]==b[4])swap(b[4],b[5]);
    if(ax[y]==b[5])b[6]=ay[y];else b[6]=ax[y];
    printf("!");
    for(int i=1;i<=6;i++)printf(" %d",a[b[i]]);
}
View Code

C

签到

Educational Codeforces Round 65 (Rated for Div. 2)
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int n,m,fa[N],sz[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)fa[i]=i;
    while(m--)
    {
        int cnt,x,y,u,v;
        scanf("%d",&cnt);
        if(!cnt)continue;
        scanf("%d",&x);
        for(int i=1;i<cnt;i++)
        {
            scanf("%d",&y);
            u=find(x),v=find(y);
            if(u!=v)fa[u]=v;
        }
    }
    for(int i=1;i<=n;i++)sz[find(i)]++;
    for(int i=1;i<=n;i++)printf("%d ",sz[find(i)]);
}
View Code

D

读错了题意WA了N发,耽误大量时间,甚至影响了写E的心态。看成了使两串尽可能等长,还在那找性质。实际上就是个SB贪心题。希望THUSC和NOI都别出贪心吧。我最讨厌贪心了。

Educational Codeforces Round 65 (Rated for Div. 2)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,ans,sl,sr;
char s[N];
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
    if(s[i]=='(')
    {
        if(sl<sr)printf("0"),sl++;
        else printf("1"),sr++;
    }
    else if(sl>sr)printf("0"),sl--;
    else printf("1"),sr--;
}
View Code

E

写D写得心态爆炸,然后又WA无穷发。然后特判原数列递增的情况,就是怎么删都可以。其余的情况,对于每个值,直接记录前缀最大位置和后缀最小位置,two-pointer扫一遍即可。不过要注意讨论值域内没出现的值的情况,我因为这个调了+WA了好多发。

Educational Codeforces Round 65 (Rated for Div. 2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int n,lim,a[N],mn[N],mx[N],suf[N];
long long ans;
int main()
{
    scanf("%d%d",&n,&lim);
    for(int i=1;i<=lim;i++)mn[i]=n+1;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        mn[a[i]]=min(mn[a[i]],i);
        mx[a[i]]=max(mx[a[i]],i);
    }
    int L=lim,R=1,pre=mx[1];
    for(int i=1;i<lim;i++)
    {
        pre=max(pre,mx[i]);
        if(pre>mn[i+1]){L=i;break;}
    }
    if(L==lim){cout<<1ll*lim*(lim+1)/2;return 0;}
    pre=mn[lim];
    for(int i=lim;i>1;i--)
    {
        pre=min(pre,mn[i]);
        if(mx[i-1]>pre){R=i;break;}
    }
    ans=lim-R+2;
    suf[lim]=mn[lim];
    for(int i=lim-1;i>=R;i--)suf[i]=min(suf[i+1],mn[i]);
    pre=mx[1];
    for(int i=1,j=R;i<=L;i++)
    {
        pre=max(pre,mx[i]);
        if(j<=i)j=i+1;
        while(j<=lim&&pre>suf[j])j++;
        ans+=lim-j+2;
        if(j==i+1)ans--;
    }
    cout<<ans;
}
View Code

F

貌似是个线段树?反正我心态炸了,太热了不写了。

G

太热了不讲了。

result:用小小号(OIerDb)打的,rank159,rating+=29,罚时共8发,感觉是个5题的人名次都在我上面,这竟然都能涨rating?

上一篇:高等数学学习笔记


下一篇:【题解】space