0pts求调悬2关
查看原帖
0pts求调悬2关
941575
Stars_visitor_tyw楼主2024/8/17 17:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105;
const int M=100005;
int t, n, skill10, skill10_from=-1;
struct talent //天赋
{
    int type, x, y;//type表示种类,x,y分别为参数
};
struct skill //技能
{
    int type, x, y, z;//type表示种类
};
struct character //人物
{
    int hp, HP, mp, MP, atk, def, datk, ddef;
    int p[N];
    int now=1, isdie=0;
    talent tt;
    skill sk;
}a[N][3];
struct effect
{
    int atk, def, mp;
}ef[M][N][5];
void check_hmp(int now, int p)//生命值不超过最大生命值,mp同理
{
    a[p][now].hp=min(a[p][now].hp,a[p][now].HP),a[p][now].mp=min(a[p][now].mp,a[p][now].MP);
}
void in(int id)//读入
{
    for(int i=1;i<=n;i++)
    {
        cin>>a[i][id].HP>>a[i][id].MP>>a[i][id].atk>>a[i][id].def;
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][id].p[j];
        }
        cin>>a[i][id].tt.type>>a[i][id].tt.x>>a[i][id].tt.y;
        cin>>a[i][id].sk.type>>a[i][id].sk.x>>a[i][id].sk.y>>a[i][id].sk.z;
        a[i][id].hp=a[i][id].HP;
        a[i][id].mp=a[i][id].MP;
        a[i][id].ddef=a[i][id].mp=a[i][id].datk=0;
        a[i][id].now=1, a[i][id].isdie=0;
    }
}
void get_end(int id)//结束
{
    cout<<t<<"\n";
    if(!id)cout<<"Alice\n";
    else cout<<"Bob\n";
    for(int i=1;i<=n;i++)
    {
        a[i][id].hp=max(a[i][id].hp,0ll);
        cout<<a[i][id].hp<<" ";
    }
    exit(0);
}
void check_die(int id, int p)//检查是否死亡
{
    if(a[p][id].hp<=0)
    {
        a[p][id].isdie=1;
        a[p][id].hp=0;
    }
    bool f=1;
    for(int i=1;i<=n;i++)
    {
        if(!a[i][id].isdie)
        {
            f=0;
        }
    }
    if(f)
    {
        get_end(!id);
        exit(0);
    }
}
void decrease_blood(int id, int p, int x, int y)//扣血
{
    a[p][id].mp++;
    check_hmp(id,p);
    int D=max(a[p][id].def+a[p][id].ddef,0ll);
    if(a[p][id].tt.type==1)
    {
        a[p][id].hp-=max(x-D,0ll)+(y+1)/2;
    }
    else a[p][id].hp-=max(x-D,0ll)+y;
    check_die(id,p);
}
void be_first(int id)
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)
        {
            continue;
        }
        while(a[a[i][id].p[a[i][id].now]][!id].isdie)a[i][id].now++;
    }
}
void work0(int id, int p)//技能0,ps:没啥用但写上还是好些。
{
    return ;
}
void work1(int id, int p)//技能1
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)continue;
        decrease_blood(!id,i,a[p][id].sk.x,0ll);
        be_first(id);
        a[i][!id].mp-=a[i][!id].mp/10;
    }
}
void work2(int id, int p)//技能2
{
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    for(int i=1;i<=n;i++)
    {
        if(!a[i][!id].isdie)
        {
            decrease_blood(!id,i,0ll,A);
            be_first(id);
        }
    }
}
void work3(int id, int p)//技能3
{
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)continue;
        decrease_blood(!id,i,min(a[i][!id].HP/10,a[p][id].sk.x*A),0ll);
        be_first(id);
    }
}
void work4(int id, int p)//技能4
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)continue;
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][id].mp+=a[p][id].sk.y;
        }
    }
}
void work5(int id, int p)//技能5
{
    be_first(id);
    int tmp=a[p][id].p[a[p][id].now];
    a[tmp][!id].ddef-=a[p][id].sk.x;
    for(int j=t;j<=30000;j++)
    {
        ef[j][tmp][!id].def-=a[p][id].sk.x;
    }
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    decrease_blood(!id,tmp,0ll,A);
    be_first(id);
}
void work6(int id, int p)//技能6
{
    be_first(id);
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    int k=a[p][id].p[a[p][id].now];
    decrease_blood(!id,k,0ll,A);
    be_first(id);
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)
        {
            continue;
        }
        a[i][!id].datk-=a[p][id].sk.y;
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][!id].atk-=a[p][id].sk.y;
        }
    }
}
void work7(int id, int p)//技能7
{
    int mini=1e13, id1=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        if(a[i][id].hp<mini)
        {
            mini=a[i][id].hp;
            id1=i;
        }
        a[i][id].datk+=a[p][id].sk.y;
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][!id].atk+=a[p][id].sk.y;
        }
    }
    a[id1][id].hp+=a[p][id].sk.z;
    check_hmp(id,id1);
}
void work8(int id, int p)//技能8
{
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)continue;
        decrease_blood(!id,i,A,0ll);
        be_first(id);
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i][!id].isdie)continue;
        a[i][!id].ddef-=a[p][id].sk.y;
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][!id].def-=a[p][id].sk.y;
        }
    }
}
void work9(int id, int p)//技能9
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        a[i][id].hp+=a[p][id].sk.z;
        check_hmp(id,i);
        a[i][id].ddef+=a[p][id].sk.y;
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][id].def+=a[p][id].sk.y;
        }
    }
}
void work10(int id, int p)//技能10
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].sk.type==10)a[i][id].sk.type=0;
        if(a[i][!id].sk.type==10)a[i][!id].sk.type=0;
        if(a[i][id].isdie)continue;
        a[i][id].atk*=2,a[i][id].def*=2;
        a[i][id].hp=max(a[i][id].HP/2,a[i][id].hp),a[i][id].mp=max(a[i][id].MP/2,a[i][id].mp);
        check_hmp(id,i);
        for(int j=t;j<=t+a[i][id].sk.x-1;j++)
        {
            ef[j][i][id].mp++;
        }
        skill10=t+a[p][id].sk.x-1;
        skill10_from=id;
    }
}
void use_skill(int id, int p)
{
    int type=a[p][id].sk.type;
    a[p][id].now=0;
    if(type==0)work0(id,p);
    if(type==1)work1(id,p);
    if(type==2)work2(id,p);
    if(type==3)work3(id,p);
    if(type==4)work4(id,p);
    if(type==5)work5(id,p);
    if(type==6)work6(id,p);
    if(type==7)work7(id,p);
    if(type==8)work8(id,p);
    if(type==9)work9(id,p);
    if(type==10)work10(id,p);
    a[p][id].mp++;
    check_hmp(id,p);
    if(a[p][id].tt.type==5)
    {
        a[p][id].mp+=a[p][id].tt.y;
        check_hmp(id,p);
    }
}
int calculation(int id, int p, int q)
{
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    int D=max(a[q][!id].def+a[q][!id].ddef,0ll);//计算D
    int x=A, y=0, maxi=0;
    if(a[p][id].tt.type==2)//计算天赋2的x,y
    {
        x=A,y=a[p][id].tt.x;
    }
    if(a[p][id].tt.type==4)//计算天赋4的x,y
    {
        x=0, y=A;
    }
    if(a[q][!id].tt.type==1)//处理天赋1
    {
        maxi=max(x-D,0ll)+(y+1)/2;
    }
    else //处理非天赋1的返回值
    {
        maxi=max(0ll,x-D)+y;
    }
    return maxi;
}
bool skill_selection(int id)//找可以释放技能的character
{
    int maxi=-1, cnt=0, id1=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        if(a[i][id].mp>=a[i][id].MP&&a[i][id].sk.type>maxi)
        {
            maxi=a[i][id].sk.type;
            id1=i;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        if(a[i][id].mp>=a[i][id].MP&&a[i][id].sk.type==id1)
        {
            cnt++;
            id1=i;
        }
    }
    if(cnt==1)
    {
        use_skill(id,id1);
        return 1;
    }
    for(int i=n;i>=1;i--)
    {
        if(a[i][id].isdie)continue;
        if(a[i][id].mp>=a[i][id].MP&&a[i][id].sk.type==id1)
        {
            use_skill(id,i);
            return 1;
        }
    }
    return 0;
}
void do_a_normal_attack(int id, int p, int q)
{
    int A=max(a[p][id].atk+a[p][id].datk,1ll);//计算A
    if(a[p][id].tt.type==2)
    {
        decrease_blood(!id,q,A,a[p][id].tt.x);
    }
    else if(a[p][id].tt.type==4)
    {
        decrease_blood(!id,q,0ll,A);
    }
    else
    {
        decrease_blood(!id,q,A,0ll);
    }
    be_first(id);
    a[p][id].mp++;
    check_hmp(id,p);
    if(a[p][id].tt.type==5)
    {
        a[p][id].hp+=a[p][id].tt.x;
        check_hmp(id,p);
    }
}
bool normal_attack_selection(int id)
{
    int maxi=-1, cnt=0, id1=-1, id2=-1;
    for(int i=n;i>=1;i--)
    {
        if(a[i][id].isdie)continue;
        be_first(id);
        int k=a[i][id].p[a[i][id].now];
        if(a[k][!id].hp<=0)a[k][!id].hp=0;
        if(a[k][!id].hp>maxi)
        {
            maxi=a[k][!id].hp;
            id1=i;
            id2=k;
        }
    }
    int maxi1=-1, id3;
    for(int i=n;i>=1;i--)
    {
        if(a[i][id].isdie)continue;
        be_first(id);
        int k=a[i][id].p[a[i][id].now];
        if(a[k][!id].hp==maxi)
        {
            cnt++;
            maxi1=max(maxi1,calculation(id,i,k));
        }
    }
    if(cnt==1)
    {
        do_a_normal_attack(id,id1,id2);
        return 1;
    }
    for(int i=n;i>=1;i--)
    {
        if(a[i][id].isdie)continue;
        be_first(id);
        int k=a[i][id].p[a[i][id].now];
        if(calculation(id,i,k)==maxi1&&a[k][!id].hp==maxi)
        {
            do_a_normal_attack(id,i,k);
            return 1;
        }
    }
    return 1;
}
void work114514(int id)
{
    if(skill_selection(id))return ;
    if(normal_attack_selection(id))return ;
}
void work1919810(int id)
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        a[i][id].mp++;
        check_hmp(id,i);
        if(a[i][id].tt.type==3)
        {
            a[i][id].hp+=a[i][id].tt.x;
            a[i][id].mp+=a[i][id].tt.y;
            check_hmp(id,i);
        }
        a[i][id].mp+=ef[t][i][id].mp;
        check_hmp(id,i);
    }
}
void do_effect(int id)
{
    for(int i=1;i<=n;i++)
    {
        if(a[i][id].isdie)continue;
        a[i][id].datk=ef[t][i][id].atk;
        a[i][id].ddef=ef[t][i][id].def;
    }
}
signed main()
{
    cin>>n;
    in(0),in(1);
    while(t<=23333)
    {
        t++;
        do_effect(0);
        do_effect(1);
        work114514(0);
        work1919810(0);
        do_effect(0);
        do_effect(1);
        work114514(1);
        work1919810(1);
        do_effect(0);
        do_effect(1);
        check_die(0,1);
        check_die(1,1);
        if(skill10==t&&skill10_from!=-1)
        {
            get_end(!skill10_from);
        }
    }
}
//P7610 群星连结
//本地调试次数:15
//洛谷WA次数:7
//BY:Stars_visitor_tyw(写大部分) & Stars_traveller(写了一点点+帮调)
//下载数据:0
2024/8/17 17:04
加载中...