1 条题解

  • 0
    @ 2025-8-24 21:49:27

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 封禁用户
    None

    搬运于2025-08-24 21:49:27,当前版本为作者最后更新于2024-12-04 20:43:17,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Gossip

    模拟赛一道难过到我的题!——P2377 原题面

    双倍经验:P2377

    这个双倍经验一看就是 UNowen 当年(2015)遇到的原题!

    Algorithm

    本题和 P2377 的不同点是:

    • 不需要再检验整个图形是否内陷。也就是说,P2377 中题目描述中 k=3k=3 的修改在本题中合法。(但本题依然不允许出现 P2377 中的 #\texttt{\#}
    • 对于 N\texttt{N} 询问,从单个三角形(eee\texttt{eee})开始暴力拓展即可。

    My Accepted Code (R192823783)

    #include <bits/stdc++.h>
    using namespace std;
    char cv(int x)
    {
        return '0'+(x+600000)%6;
    }
    string mod(string s,int k)
    {
        int n=s.size()-1;
        char x=cv(s[k]+1),y=cv(s[k]-1);
        char xx,yy;
        if(k==1) xx=s[n];
        else xx=s[k-1];
        if(k==n) yy=s[1];
        else yy=s[k+1];
        if(abs(xx-x)==3&&abs(yy-y)==3)
        {
            s[k]=' ';
            if(k==1) s[n]=' ';
            else s[k-1]=' ';
            if(k==n) s[1]=' ';
            else s[k+1]=' ';
        }
        if(abs(xx-x)==3&&abs(yy-y)!=3)
        {
            s[k]=y;
            if(k==1) s[n]=' ';
            else s[k-1]=' ';
        }
        if(abs(xx-x)!=3&&abs(yy-y)==3)
        {
            s[k]=x;
            if(k==n) s[1]=' ';
            else s[k+1]=' ';
        }
        if(abs(xx-x)!=3&&abs(yy-y)!=3)
        {
            s[k]=y;
            string z=" ";
            z[0]=x;
            s.insert(k,z);
        }
        int p=s.size()-1;
        string res="";
        for(int i=0;i<=p;i++)
            if(s[i]!=' ') res+=s[i];
        return res;
    }
    bool check(string s)
    {
        int cur=0;
        int n=s.size();
        s=' '+s;
        for(int i=1;i<=n;i++)
        {
            switch(s[i])
            {
                case '0': {cur++;break;}
                case '1': {cur+=1001;break;}
                case '2': {cur+=1000;break;}
                case '3': {cur--;break;}
                case '4': {cur-=1001;break;}
                case '5': {cur-=1000;break;}
            }
        }
        return (cur==0);
    }
    string diff(string s)
    {
        int n=s.size();
        string res="";
        for(int i=1;i<=n-1;i++)
            switch(cv(s[i-1]-s[i]))
            {
                case '4': {res+='a';break;}
                case '5': {res+='b';break;}
                case '0': {res+='c';break;}
                case '1': {res+='d';break;}
                case '2': {res+='e';break;}
            }
        switch(cv(s[n-1]-s[0]))
        {
            case '4': {res+='a';break;}
            case '5': {res+='b';break;}
            case '0': {res+='c';break;}
            case '1': {res+='d';break;}
            case '2': {res+='e';break;}
        }
        return res;
    }
    string mins(string s)
    {
        string res=s;
        int n=s.size();
        for(int i=1;i<=n;i++)
        {
            char c=s[0];
            s.erase(0,1);
            s+=c;
            if(s<res) res=s;
        }
        return res;
    }
    bool ok(string S)
    {
        int n=S.size();
        S=' '+S;
        string s="0";
        int now=0;
        for(int i=2;i<=n;i++)
        {
            switch(S[i-1])
            {
                case 'a': {now+=2;break;}
                case 'b': {now++;break;}
                case 'c': {break;}
                case 'd': {now--;break;}
                case 'e': {now-=2;break;}
            }
            s+=cv(now);
        }
        return check(s);
    }
    int man(string S)
    {
        int n=S.size();
        S=' '+S;
        string s=" 0";
        int now=0;
        for(int i=2;i<=n;i++)
        {
            switch(S[i-1])
            {
                case 'a': {now+=2;break;}
                case 'b': {now++;break;}
                case 'c': {break;}
                case 'd': {now--;break;}
                case 'e': {now-=2;break;}
            }
            s+=cv(now);
        }
        map<string,int> mp;
        priority_queue<string,vector<string>,greater<string> > pq;
        for(int i=1;i<=n;i++)
        {
            string rr=mod(s,i);
            if(!check(rr)) continue;
            string rr1=diff(rr);
            string rr2=rr1;
            reverse(rr2.begin(),rr2.end());
            string res1=mins(rr1);
            string res2=mins(rr2);
            string res=res1;
            if(res2<res1) res=res2;
            if(!mp.count(res1)&&!mp.count(res2)&&ok(res)) pq.push(res);
            mp[res1]=1;
            mp[res2]=1;
        }
        cout<<pq.size()<<endl;
        while(!pq.empty())
        {
            cout<<pq.top()<<' ';
            pq.pop();
        }
        cout<<endl;
        return 0;
    }
    priority_queue<string,vector<string>,greater<string> > pq,qp;
    map<string,int> mp;
    int mans1()
    {
        string S=qp.top();
        qp.pop();
        int n=S.size();
        S=' '+S;
        string s=" 0";
        int now=0;
        for(int i=2;i<=n;i++)
        {
            switch(S[i-1])
            {
                case 'a': {now+=2;break;}
                case 'b': {now++;break;}
                case 'c': {break;}
                case 'd': {now--;break;}
                case 'e': {now-=2;break;}
            }
            s+=cv(now);
        }
        for(int i=1;i<=n;i++)
        {
            string rr=mod(s,i);
            if(!check(rr)) continue;
            string rr1=diff(rr);
            string rr2=rr1;
            reverse(rr2.begin(),rr2.end());
            string res1=mins(rr1);
            string res2=mins(rr2);
            string res=res1;
            if(res2<res1) res=res2;
            if(!mp.count(res1)&&!mp.count(res2)&&ok(res)) pq.push(res);
            mp[res1]=1;
            mp[res2]=1;
        }
        return 0;
    }
    int mans2()
    {
        string S=pq.top();
        pq.pop();
        int n=S.size();
        S=' '+S;
        string s=" 0";
        int now=0;
        for(int i=2;i<=n;i++)
        {
            switch(S[i-1])
            {
                case 'a': {now+=2;break;}
                case 'b': {now++;break;}
                case 'c': {break;}
                case 'd': {now--;break;}
                case 'e': {now-=2;break;}
            }
            s+=cv(now);
        }
        for(int i=1;i<=n;i++)
        {
            string rr=mod(s,i);
            if(!check(rr)) continue;
            string rr1=diff(rr);
            string rr2=rr1;
            reverse(rr2.begin(),rr2.end());
            string res1=mins(rr1);
            string res2=mins(rr2);
            string res=res1;
            if(res2<res1) res=res2;
            if(!mp.count(res1)&&!mp.count(res2)&&ok(res)) qp.push(res);
            mp[res1]=1;
            mp[res2]=1;
        }
        return 0;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            string T,S;
            cin>>T>>S;
            if(T=="K") man(S);
            else
            {
                stringstream ss;
                ss<<S;
                int x;
                ss>>x;
                pq.push("eee");
                for(int i=1;i<=x-1;i++)
                {
                    if(i%2) while(!pq.empty()) mans2();
                    else while(!qp.empty()) mans1();
                    mp.clear();
                }
                if(x%2)
                {
                    cout<<pq.size()<<endl;
                    while(!pq.empty())
                    {
                        cout<<pq.top()<<' ';
                        pq.pop();
                    }
                    cout<<endl;
                }
                else
                {
                    cout<<qp.size()<<endl;
                    while(!qp.empty())
                    {
                        cout<<qp.top()<<' ';
                        qp.pop();
                    }
                    cout<<endl;
                }
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2561
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者