2022高考集训1

相对而言,试题比较水,数据也不强,不过以后数据就强了,毕竟有\(lyin\)大佬卡掉一切

2A ip

简单模拟,有点细节,比如\(000\),可恶,痛失\(20\)

\(long long\)也是可以卡掉的,数字应该只要大于\(255\),就设成\(255\)

懒得改了

\(art\)加了这个\(hack\),然而没有卡掉\(long long\)

这告诉我们不会\(hack\),就不要\(hack\)

$ugly$ $code$
#include<cstdio>
#include<cstring>

using namespace std;

bool flag=0;
int cnt=0,now=0,s;
char c[105];
long long read(){
    long long x=0;
    int i;
    for(i=now;i<s;++i)
      if(c[i]<'0'||c[i]>'9'){
          if(c[i]=='.')++cnt;
          else flag=1;
      }else break;
    int qc=0;
    while(c[i]<='9'&&c[i]>='0'){
        if(c[i]=='0'&&x==0)++qc;
        x=(x<<3)+(x<<1)+c[i]-'0';
        ++i;
    }
    now=i;
    if((qc&&x)||qc>1)flag=1;
    return x;
}

int main(){
    freopen("ip.in","r",stdin);
    freopen("ip.out","w",stdout);
    scanf("%s",c);s=strlen(c);
    long long a=read();
    long long b=read();
    long long c=read();
    long long d=read();
    if(a>255){a=255;flag=1;}
    if(b>255){b=255;flag=1;}
    if(c>255){c=255;flag=1;}
    if(d>255){d=255;flag=1;}
    if(cnt!=3)flag=1;
    if(now!=s)flag=1;
    if(flag)printf("NO\n%lld.%lld.%lld.%lld\n",a,b,c,d);
    else printf("YES\n");
    return 0;
}

2B apstr

开始猜是先删\(AP\)

然后觉得是个栈

最后发现只用加加减减

++水题

code
#include<cstdio>
#include<cstring>

using namespace std;

char c[10005];
int top;
int main(){
    freopen("apstr.in","r",stdin);
    freopen("apstr.out","w",stdout);
    scanf("%s",c);
    int s=strlen(c);
    for(int i=0;i<s;++i){
        if(top&&c[i]=='P')--top;
        else ++top;
    }
    printf("%d\n",top);
    return 0;
}

2C class

本来复杂度不正确的切了,然后\(lyin\)觉得数据太水,造了组数据重测赛时,然后我被\(hack\)

\(rk3->rk4\)

\(lyin\)大佬\(rk4->rk3\)

赞!

哲缟素窝闷,一定要算好时间复杂度,防止毒瘤造数据者大佬卡你

做法就是用\(map\)\(bitset\)(我用的\(bool\)数组)搞,优化在于有派生关系的只需要扫后面那个

code
#include<map>
#include<string>
#include<iostream>
#include<algorithm>

using namespace std;

int n,id;
map<string,int>mp;
string s[1005];
bool b[1005][1005];
int rem[1005],top,v[1005];
bool ls[1005];
bool work(){
    cin>>s[0];
    int cnt=0;
    while(s[cnt]!=";"){++cnt;cin>>s[cnt];if(s[cnt]==":")--cnt;}
    --cnt;
    if(mp[s[0]]!=0)return false;
    for(int i=1;i<=cnt;++i)v[i]=mp[s[i]];
    sort(v+1,v+cnt+1);
    if(cnt&&v[1]==0)return false;
    for(int i=1;i<=id;++i)ls[i]=0;
    for(int i=cnt;i>=1;--i){
        if(ls[v[i]])continue;
        for(int j=1;j<=id;++j)
        if(b[v[i]][j]){
            if(ls[j])return false;
            else ls[j]=1;
        }
    }
    mp[s[0]]=++id;
    for(int i=1;i<=id;++i)b[id][i]=ls[i];b[id][id]=1;
    return true;
}

int main(){
    freopen("class.in","r",stdin);
    freopen("class.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)if(work())printf("ok\n");else printf("greska\n");
    return 0;
}

2D kdgraph

考场并茶几是对的,但是划分等级搞错了

应该用拓扑,但是直接拓扑会挂,本来不会,但是\(lyin\)又双造了两组数据

学弟学妹们大概会感谢\(lyin\)吧,大概

神奇的\(n+m+m\)拓扑,其实就是开桶,我太菜了,不知道怎么讲。

上代码吧。。

code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;
const int maxn=1000005;
const int maxm=2000005;
typedef long long  ll;

int read(){
    int x=0;char c;c=getchar();bool f=0;
    while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    if(f)x=-x;
    return x;
}
int n,m,d[maxn],head[maxn],tot,st[maxn];
ll M,N,B;
struct edge{int to,net;}e[maxm];
void add(int u,int v){
    e[++tot].net=head[u];
    head[u]=tot;
    e[tot].to=v;
    ++d[v];
}
struct SET{
    int f[maxn],dd[maxn],mm[maxn],sd[maxn];
    int ansk;
    int as[maxn],ask;
    ll score=-99999999999999999;
    int fa(int x){return f[x]=f[x]==x?x:fa(f[x]);}
    void hb(int x,int y){
        x=fa(x);y=fa(y);
        if(x==y)return;
        f[x]=y;
        dd[y]+=dd[x];
        mm[y]+=mm[x];
        sd[y]+=sd[x];
    }
    void ad(int x){
        f[x]=x;dd[x]=1;mm[x]=0;sd[x]=d[x];
        int nbian=0;
        for(int i=head[x];i;i=e[i].net){
            int v=e[i].to;
            if(f[v]){++nbian;hb(x,v);}
        }
        x=fa(x);mm[x]+=nbian;
        if(dd[x]>1)as[++ask]=x;
    }
    void ga(int k){
        for(int j=1;j<=ask;++j){
            int i=as[j];if(fa(i)!=i)continue;
            ll sc=M*mm[i]-N*dd[i]+B*(sd[i]-mm[i]-mm[i]);
            if(sc>score){score=sc;ansk=k;}
        }
    }
}S;
int tp[maxn],no[maxn],rem[maxn];
vector<int>v[maxn];
void tpe(){
    for(int i=1;i<=n;++i)v[d[i]].push_back(i),rem[i]=d[i];
    int cnt=n;
    for(int k=1;k<=n;++k){
        int s=v[k].size(),now=0;
        for(int i=0;i<s;++i)no[++now]=v[k][i],--cnt;
        for(int l=1;l<=now;++l){
            if(tp[no[l]])continue;
            tp[no[l]]=k;
            for(int i=head[no[l]];i;i=e[i].net){
                int to=e[i].to;
                if(tp[to])continue;
                --rem[to];
                if(rem[to]<=k)no[++now]=to,--cnt;
                else v[rem[to]].push_back(to);
            }
        }
        if(cnt==0)break;
    }
}
bool cmp(int x,int y){return tp[x]>tp[y];}
signed main(){
    freopen("kdgraph.in","r",stdin);
    freopen("kdgraph.out","w",stdout);
    n=read();m=read();
    M=read();N=read();B=read();
    for(int i=1;i<=m;++i){
        int u,v;u=read();v=read();
        add(u,v);add(v,u);
    }
    for(int i=1;i<=n;++i)st[i]=i;
    tpe();
    sort(st+1,st+1+n,cmp);
    int now=1;
    for(int k=tp[st[1]];k>=tp[st[n]];--k){
        if(k==0)break;S.ask=0;
        while(tp[st[now]]==k&&now<=n){S.ad(st[now]);++now;}
        S.ga(k);
    }
    printf("%d %lld\n",S.ansk,S.score);
    return 0;
}
posted @ 2022-06-05 18:39  Chen_jr  阅读(62)  评论(5编辑  收藏  举报