社区讨论

被hack求条,悬2关

B4211[常州市赛 2022] 可能的三角形参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mkb4kl9t
此快照首次捕获于
2026/01/12 20:14
上个月
此快照最后确认于
2026/01/16 19:45
上个月
查看原帖
暴力枚举,有点长,虽然我也没指望能有人帮我条
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int x[10];
bool ist(int a,int b,int c){
    return a+b>c&&a+c>b&&b+c>a;
}
struct node{int a,b,c;}ans[50];
int cnt;
map<int,map<int,map<int,bool> > >mp;
void psh(int a,int b,int c){
    if(!mp[a][b][c]){
        mp[a][b][c]=1;
        ans[++cnt]={a,b,c};
    }
}
bool cmp(node x,node y){
    if(x.a!=y.a) return x.a<y.a;
    if(x.b!=y.b) return x.b<y.b;
    return x.c<y.c;
}
signed main(){
    cin>>x[1]>>x[2]>>x[3]>>x[4];
    sort(x+1,x+5);
    //区区35种而已
    int a,b,c;
    a=x[1],b=x[2],c=x[3];
    if(ist(a,b,c)) if(a+b==x[4]||b+c==x[4]||c+a==x[4]||a+b+c==x[4]) psh(a,b,c);
    a=x[1],b=x[2],c=x[3]-a;
    if(ist(a,b,c)&&a<=b&&b<=c) if(b+c==x[4]||a+b+c==x[4]) psh(a,b,c);
    c=x[3]-b;
    if(ist(a,b,c)&&a<=b&&b<=c) if(a+b+c==x[4]) psh(a,b,c);
    if(a+b==x[3]){
        c=x[4]-a;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
        c=x[4]-b;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
        c=x[4]-b-a;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
    }
    a=x[1],c=x[2],b=x[3]-a;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+c||x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    b=x[3]-c;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    if(x[3]==a+c){
        b=x[4]-c;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
        b=x[4]-a-c;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
    }
    b=x[1],c=x[2],a=x[3]-b;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+c||x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    a=x[3]-c;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    if(x[3]==b+c){
        a=x[4]-b-c;
        if(ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
    }
    //---------------
    a=x[1];
    b=x[2]-a;
    c=x[3]-a;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    c=x[3]-b;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    c=x[2]-a;
    b=x[3]-c;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    //---
    b=x[1];
    a=x[2]-b;
    c=x[3]-a;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    c=x[3]-b;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    //x2==a+c, x1==b
    //x3只能等于b+c,否则x4没法放
    //已经确定了b,c
    c=x[3]-b;
    a=x[2]-c;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    //---
    c=x[1];
    //x2==a+b, x1==c
    //x3可以等于a+c、b+c
    a=x[3]-c;
    b=x[2]-a;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==b+c||x[4]==a+b+c) psh(a,b,c);
    b=x[3]-c;
    a=x[2]-b;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    a=x[2]-c,b=x[3]-c;
    if(ist(a,b,c)&&a<=b&&b<=c) if(x[4]==a+b+c) psh(a,b,c);
    //x1x2x3没有一个等于a/b/c
    //a+b,a+c,b+c,a+b+c
    //解方程得
    int X=(x[1]+x[2]+x[3])/2;
    if(X*2==(x[1]+x[2]+x[3])){//是整数
        a=X-x[3],b=X-x[2],c=X-x[1];
        if(a+b+c==x[4]&&ist(a,b,c)&&a<=b&&b<=c) psh(a,b,c);
    }
    sort(ans+1,ans+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        cout<<ans[i].a<<" "<<ans[i].b<<" "<<ans[i].c<<"\n";
    }
    return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...