题解三角形

这题……真的是省选吗?


首先,有一个很重要的性质!!!

观察这幅图(题目里的):

每个三角形最多与个三角形相邻!!!

理论解释:

首先我们知道,

如果B不包含A,且A的某一条完整的边是B的某条边的一部分,则我们说A靠在B的边上
     ---P4536 [CQOI2007]三角形

解读这句话:的某一条完整的边是B的某条边的一部分

对于三角形

有三条边(废话)

每条边都(可能)有一个三角形相邻,根据定义,B的边长≥A的边长。所以A的这条边上不可能再有别的与相邻的三角形(重要!!)

那么就是说每条边上最多只有1个三角形与它相邻

那么最多只有个三角形与它相邻啊!!!

这样一分析,哇!水题!!


再分析第二步:

还是这张图:

相邻,然后没了(有个了,掉结束)

相邻。

还有一种特殊情况:有的三角形一条或两条边在边界上(像)就会少于三个。

于是乎如果有一个数字出现多次,就掉了

#include<algorithm>
#include<bitset>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
inline ll rr() {
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    if(c=='-')f=-1,c=getchar();
    while(isdigit(c))x=x*10+c-'0',c=getchar();
    return x*f;
}
#define d rr()
ll cmp;
bool fl[5]; 
string s[100010],k;
char opt;
int main() {
    char c;
    cin>>c>>k;
    while(k.size()){
        if(cmp==3){
            break;
        }
        string qqq;
        if(k[k.size()-1]!='4'){
            if(!fl[k[k.size()-1]-'0']){
                cmp++;
                s[cmp]+='T';
                s[cmp]+=k;
                s[cmp][s[cmp].size()-1]='4';
            }
        }
        else{
            cmp++;
            s[cmp]+='T';
            s[cmp]+=k;
            s[cmp][s[cmp].size()-1]='1';
            cmp++;
            s[cmp]+='T';
            s[cmp]+=k;
            s[cmp][s[cmp].size()-1]='2';
            cmp++;
            s[cmp]+='T';
            s[cmp]+=k;
            s[cmp][s[cmp].size()-1]='3';
            sort(s+1,s+cmp+1);
            cout<<s[1];
            for(int i=2;i<=cmp;i++)cout<<endl<<s[i];
            return 0;
        }
        fl[k[k.size()-1]-'0']=1;
        for(int i=0;i<k.size()-1;i++)qqq+=k[i];
        k=qqq;
    }
    sort(s+1,s+cmp+1);
    cout<<s[1];
    for(int i=2;i<=cmp;i++)cout<<endl<<s[i];
    return 0;
}

谢谢!!