ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

狂 人 日 寄 (1)

2022-06-05 21:33:59  阅读:104  来源: 互联网

标签: 10 const int char bool return


Today is a great day

 

 

 

But not so great

希望明天有进步TAT

T1:

 

 

 赛时:啊我最擅长大模拟了!之前还做过一个类似的!!

(30min later)----

我:切完了走人

赛后:麻

死亡回放:

#include <bits/stdc++.h>
using namespace std;
const int M =1e2+10;
const int inf = 2147483647;
inline int read(){
    int x=0,f=0;char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=1;c=getchar();
    }
    do{
        x=(x<<1)+(x<<3)+(c^48);
    }while(isdigit(c=getchar()));
    return f?-x:x;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);putchar(x%10^48);
}
char s[M];
int len;
bool Islegal(char s[]){
    int f=0;
    bool isstart=1;
    int cnt=0;
    for(int i=1;i<=len;i++){
        if(!isdigit(s[i])&&s[i]!='.') return 0;
        if(s[i]=='.'){
            isstart=1;
    //***********死亡回放1********************
            f=0;cnt++;
    //***********死亡回放1********************
            if(f>255) return 0;
        }
        else{
             //***********死亡回放2********************
             if(isstart&&s[i]=='0'&&s[i+1]=='0') return 0;
            //***********死亡回放2********************
             f=f*10+s[i]-'0';
             isstart=0;
        }
    }
    if(cnt>3) return 0;
    return 1;
}
char ip[M];
char q[M];int head;
void cut(char s[]){
    bool isstart=1;
    for(int i=1;i<=len;i++){
        if(isstart&&s[i]=='0'){
            if(s[i+1]=='0'){
                continue;
            }
            else q[++head]=s[i];
        }
        else if(s[i]=='.'){
            isstart=1;
            if(q[head]!='.') q[++head]=s[i];
        }
        else if(isdigit(s[i])){
            isstart=0;
            q[++head]=s[i];
        }
        else{
            if(q[head]!='.') q[++head]='.';
        };
    }
       len=strlen(q+1);
    while(!isdigit(q[len])) len--;
}
int num[M];int tot;
void del(char s[]){
    int f=0;
    for(int i=1;i<=len;i++){
        if(s[i]=='.'){
            if(f>255) f=255;
            num[++tot]=f;
            f=0;
        }
        else f=f*10+s[i]-'0';
    }
    if(f>255) f=255;
    num[++tot]=f;
}
int main(){
    freopen("ip.in","r",stdin);
    freopen("ip.out","w",stdout);
    scanf("%s",s+1);
    len=strlen(s+1);
    if(Islegal(s)){
        printf("YES\n");
        return 0;
    }
    printf("NO\n");
    cut(s);
    // for(int i=1;i<=len;i++){
    //     printf("%c",q[i]);
    // }
    del(q);
    for(int i=1;i<tot;i++){
        printf("%d.",num[i]);
    }
    printf("%d",num[tot]);
    return 0;
}

赛后5分钟就改完了,麻

正解:

#include <bits/stdc++.h>
using namespace std;
const int M =1e2+10;
const int inf = 2147483647;
inline int read(){
    int x=0,f=0;char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=1;c=getchar();
    }
    do{
        x=(x<<1)+(x<<3)+(c^48);
    }while(isdigit(c=getchar()));
    return f?-x:x;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);putchar(x%10^48);
}
char s[M];
int len;
bool Islegal(char s[]){
    int f=0;
    bool isstart=1;
    int cnt=0;
    for(int i=1;i<=len;i++){
        if(!isdigit(s[i])&&s[i]!='.') return 0;
        if(s[i]=='.'){
            isstart=1;
            cnt++;
            if(f>255) return 0;
            f=0;
        }
        else{
             if(isstart){
                 if(s[i]=='0') return 0;
             }
             if(s[i]=='0'&&s[i+1]=='0') return 0;
             f=f*10+s[i]-'0';
             isstart=0;
        }
    }
    if(cnt>3) return 0;
    return 1;
}
char ip[M];
char q[M];int head;
void cut(char s[]){
    bool isstart=1;
    for(int i=1;i<=len;i++){
        if(isstart&&s[i]=='0'){
            if(s[i+1]=='0'){
                continue;
            }
            else q[++head]=s[i];
        }
        else if(s[i]=='.'){
            isstart=1;
            if(q[head]!='.') q[++head]=s[i];
        }
        else if(isdigit(s[i])){
            isstart=0;
            q[++head]=s[i];
        }
        else{
            if(q[head]!='.') q[++head]='.';
        };
    }
       len=strlen(q+1);
    while(!isdigit(q[len])) len--;
}
int num[M];int tot;
void del(char s[]){
    int f=0;
    for(int i=1;i<=len;i++){
        if(s[i]=='.'){
            if(f>255) f=255;
            num[++tot]=f;
            f=0;
        }
        else f=f*10+s[i]-'0';
    }
    if(f>255) f=255;
    num[++tot]=f;
}
int main(){
    freopen("ip.in","r",stdin);
    freopen("ip.out","w",stdout);
    scanf("%s",s+1);
    len=strlen(s+1);
    if(Islegal(s)){
        printf("YES\n");
        return 0;
    }
    printf("NO\n");
    cut(s);
    // for(int i=1;i<=len;i++){
    //     printf("%c",q[i]);
    // }
    del(q);
    for(int i=1;i<tot;i++){
        printf("%d.",num[i]);
    }
    printf("%d",num[tot]);
    return 0;
}

其实就是几个地方:

1.前导零

2.255

3.最后多一个点(1.1.1.1.)

以后这种题还是要多检查

T2:

 

 唯一A的题

赛时刚开始打了个暴力,后来发现还打错了。。。。

后来看出正解了,就是往栈里放字符,遇到相邻两个能消就消

证明:

因为A不能自消,所以必须与P结合

考虑压栈时的4种情况

1.AA不能消拜拜

2.AP,A前只可能是A或P,都不能消,所以消前面

3.PP,由规则2,P前面不可能是A,因为会被消掉,前面是P也一样,所以前面只能为空,直接消无影响

4.PA,同1

没了

#include <bits/stdc++.h>
using namespace std;
const int M =1e5+10;
const int inf = 2147483647;
inline int read(){
    int x=0,f=0;char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=1;c=getchar();
    }
    do{
        x=(x<<1)+(x<<3)+(c^48);
    }while(isdigit(c=getchar()));
    return f?-x:x;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);putchar(x%10^48);
}
char s[M];
bool del[M];
int len;
bool ok(char a,char b){
    if(a=='P'&&b=='P') return 1;
    if(a=='A'&&b=='P') return 1;
    return 0;
}
int ans=1e9;
void violent(){
    int last=1,now=2;
    for(int i=2;i<=len;i++){
        if(del[i]) continue;
        now=i;
        if(ok(s[last],s[now])){
            del[last]=del[now]=1;
            violent();
            del[last]=del[now]=0;
        }
        last=now;
    }
    int res=0;
    for(int i=1;i<=len;i++){
        if(!del[i]) res++;
    }
    ans=min(ans,res);
}
char stk[M];int head;
int spe(char s[]){
    stk[++head]=s[1];
    for(int i=2;i<=len;i++){
        if(ok(stk[head],s[i])){
            head--;continue;
        }
        else{
            stk[++head]=s[i];
        }
    }
    return head;
}
int main(){
    freopen("apstr.in","r",stdin);
    freopen("apstr.out","w",stdout);
    scanf("%s",s+1);
    len=strlen(s+1);
    printf("%d\n",spe(s));
    return 0;
}

T3:

 

 

 

 

 

 用 map维护

判断菱形:

声明x时出现菱形,当且仅当在x的派生集合中存在两个点,使得这两个点有公共祖先,且二者无父子关系

那么维护一个R[i][j[数组表i的所有派生类j,F[i][j]表当一个父亲为i时,另一个父亲不能为j(即满足菱形充要性质的两个点)

用bitset维护

当自己的父亲集合中存在父亲i,j,则为菱形

前排%%%WR大佬

#include <bits/stdc++.h>
using namespace std;
const int M =1e3+10;
const int inf = 2147483647;
inline int read(){
    int x=0,f=0;char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=1;c=getchar();
    }
    do{
        x=(x<<1)+(x<<3)+(c^48);
    }while(isdigit(c=getchar()));
    return f?-x:x;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);putchar(x%10^48);
}
string def,bel,temp;
map<string,int> mp;
vector<int> vec;
bitset<1005> R[M],F[M];
int tot;
int main(){
    freopen("class.in","r",stdin);
    freopen("class.out","w",stdout);
    int n=read();
    while(n--){
        vec.clear();
        bool flag=0;  
        bitset<1005> now;
        cin >> def >> temp >> bel;
        while(bel[0]!=';'){
            if(!mp[bel]) flag=1;
            vec.push_back(mp[bel]);
            cin >> bel;
        }
        for(int i=0;i<vec.size();i++){
            now[vec[i]]=1;
        }
        for(int i=0;i<vec.size();i++){
            if((now&F[vec[i]]).any()) flag=1; 
        }
        if(flag||mp[def]){
            printf("greska\n");
            continue;
        }
        printf("ok\n");
        mp[def]=++tot;
        R[tot][tot]=1;
        for(int i=0;i<vec.size();i++){
            R[tot]|=R[vec[i]];
        }
        for(int i=1;i<tot;i++){
            if(!R[tot][i]&&(R[tot]&R[i]).any()) F[tot][i]=1;
        }
    }
    return 0;
}

 

T4:

 

 

 

 

 

 累了毁灭吧

#include <bits/stdc++.h>
#define rint register int
using namespace std;
typedef long long ll;
struct Node{
    int ns,ms,bs;
    int bel;
};
struct Edge{
    int f,t,next;//怎么着还带卡vector的
};
const int M = 1e6+10;
Node node[M];
Edge e[M<<2];int tou[M<<1],etot;
inline void add(int f,int t){
    e[++etot].f=f;
    e[etot].t=t;
    e[etot].next=tou[f];
    tou[f]=etot;
}
inline ll read(){
    ll x=0,f=0;char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=1;c=getchar();
    }
    do{
        x=(x<<1)+(x<<3)+(c^48);
    }while(isdigit(c=getchar()));
    return f?-x:x;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);putchar(x%10^48);
}
int fa[M],vis[M],tot;
int Find(int x){
    if(fa[x]!=x) return fa[x]=Find(fa[x]);
    return x;
}
inline void Union(int a,int b){
    int x=Find(a),y=Find(b);
    if(x!=y){
        fa[y]=x;
        node[x].ns+=node[y].ns;
        node[x].ms+=node[y].ms+1;
        node[x].bs+=node[y].bs-2;
    }
    else{
        node[x].ms+=1;
        node[x].bs-=2;
    }
}
ll n,m,am,an,ab;
int deg[M];
int q[M],l=1,r=0;
int lastn;
int maxk,cnt;
vector<int> vec[M],num[M];
int del[M];
inline void dele(){
    for(int i=0;i<n;++i){
        for(int j=1;j<=n;++j){
            if(deg[j]==i){
                if(i==0){
                    cnt++;
                }
                else {
                    q[++r]=j;
                }
            }
        }
        if(i==0)continue;
        while(l<=r){
            int u=q[l];
            l++;
            num[i].push_back(u);
            node[u].bel=i;
            cnt++;
            for(int k=tou[u];k;k=e[k].next){
                int v=e[k].t;
                deg[v]--;
                if(deg[v]==i) q[++r]=v;
            }
        }
        l=1,r=0;
        if(cnt==n){
            maxk=i;
            break;
        }
    }
}
signed main(){
    freopen("kdgraph.in","r",stdin);
    freopen("kdgraph.out","w",stdout);
    n=read();m=read();am=read();an=read();ab=read();
    lastn=n;
    for(rint i=1;i<=m;i++){
        int rd=read(),fs=read();
        add(rd,fs);add(fs,rd);
        deg[rd]++;deg[fs]++;
    }
    for(rint i=1;i<=n;i++){
        fa[i]=i;
        node[i].ns=1;
        node[i].bs=deg[i];//初始化每条边都是边界边
    }
    dele();
    ll ans=-1e18,K;
    for(rint i=maxk;i>0;i--){
        for(rint j=0;j<num[i].size();j++){
            for(rint k=tou[num[i][j]];k;k=e[k].next){
                           int v=e[k].t;
                if(i<node[v].bel){
                    Union(num[i][j],v);
                    continue;
                }
                if(i==node[v].bel&&num[i][j]<v){
                    Union(num[i][j],v);
                }
            }
        }
        for(rint j=0;j<num[i].size();j++){
            int dad=Find(num[i][j]);
            ll res=am*node[dad].ms-an*node[dad].ns+ab*node[dad].bs;
            if(ans<res) ans=res,K=i;
        }
    }
    printf("%lld %lld",K,ans); 
    return 0;
}

有时间再来写题解

感觉今天题总体来说还是比较简单的

明天。。。。凶多吉少

 

标签:,10,const,int,char,bool,return
来源: https://www.cnblogs.com/blue-tsg/p/16345146.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有