そしてbzoj1972の間違っ:loj2885:p2482は、[SDOI2010]豚の状態を殺します

効果の対象に

のみを入れてリンクをアップ。

タイトルは一つのことを言わなかった:ブランドを保証するのに十分ではありませんが、何度も何度もカード内の最後のカードが十分ではありません描きます。

問題の解決策

これは、プレイヤーの数が比較的少ないことがわかったので、時間は使用するのに十分に気にしないことがあります。

三つのこと考えてみましょう:そのようMopai、カード、プレイヤーが死ぬ、ブランドの効果として1つの基本的な操作を、2試合の流れを、3つのカードオブジェクトを....

  1. Mopai、カード:
    右掃引動作に左から「プレイヤーのカード」が見つかり、その後(カード)を削除、または右端と(Mopai)上の2に、利用できる最初で、2操作がうまくリンクリストとして維持します。それは「選手から判断することが示唆された\(X \)手、何の価値はありません\(k個の\は)彼らは、左端に置くことができる場合、\(k個\)をプレーヤーに」と削除することで、」(X \)\最も右側には、2枚のカードを置く。「この二つの操作は2つの機能を書かれました。それは心の中ですることをお勧めします\(a_iを\)プレーヤーを表す\(私は\)もしロード武器を。
    プレイヤーは死ぬ:
    使用のリストは前と選手を存続した後、各プレイヤーのために維持します。プレイヤーが死ぬと、最初の文の手にはPを持っていない、そうであれば、1と復活(すべてのカードが損傷を引き起こす可能性があるため、1つだけに害を引き起こす可能性がありますので、それが0以下に低下しません)への血液の量;場合いいえ、プレイヤーは、3枚のカードに触れないように、プレイヤーはMPまたは最後のFPであれば、ゲームオーバーで、被害のそれ以外の場合はFPワードソースを死ぬZP、損傷の源は、クリアしてみましょうするMP MPの手のリストですA_1(\ = 0 \)
    ブランド効果:
    \(X- \)する(のy \)\ K:\(X- \) 身元の開示を決定\(のy \)を、次にD、それが起こった場合に関係なくがある場合は、そうでない場合は、\(Y \ )血液量の減少、裁判官の\(のy \)死か。
    \(X \) P:血液+1。
    \(X \) Z:オーダー\(= A_X 1 \。)
    \(Xの\) J:\(x \)アイデンティティ露出、から\(x \)は、そうであれば成功したプレイヤーJが存在するかどうかを決定するために、このために、次いで、Jが解除され、そうでない場合、\(X \)アウトJは有効になります。勧告は、再帰関数を実装しました。
    \(のx \) NまたはW:から\(X \)から、各プレーヤーの各プレイヤーが怪我をするかどうかを判断するには、このための右のプレーヤー、\(X \) Jアウトプレーヤーがあるかどうかを判断するには、このために、もしそのプレイヤーは何も起こらなかった場合は何のプレイヤーは、死のそれ以外のプレイヤーDOT、判断力、KまたはDすることはできませんと判断された場合プレイヤーは、起こっていません。どちらのAOEほぼ同じ、勧告を書いてください。AOEのとき彼のチームメイトは可能性が彼らのAOE J.のうち、自分自身を自分のアイデンティティを示しヒットなお、
    \(X \)(Y軸\)を\ F:\(x \)アイデンティティの開示は、かどうかJ、裁判官を宣告(X \)\ MPとして\(Y軸\) ZPため。アカウントに現在取って、それぞれ、二つのポインタを保持\(X、Yの\)最初の数枚のカードでは。1がKでない場合は、DOT側は死を決定し、次のターンKへのポインタを移動します。

  2. 現在のプレイヤーの注意\(X- \) 各プレーヤーの前にして選手を生き残った後のリストを維持します。プレイヤーの死のリストであれば、更新の死の前と後。(X \)\ラウンド、最初のタッチ二枚のカードは、F、AOEアウト終了するので(カードが存在してもよいかどうかを決定するために再び何のライセンスがラウンドの終わり外になることはできませんそれ以外の場合カード、左から右へ掃引、及び選手はJ、露光状態を有することができる後に、それはにつながる可能性が\(のx \) およびいくつかのカードがアウトになることがあります。それに注意してください\(X \)ので、おそらく試合を\(X \)死中断(\(X \)自分の死を作るF)は、その注意(X \)\をするかどうかK.かけて回すことに

  3. K:自分自身の右に隣接し、そのアイデンティティを示している、と敵の選手。
    F:MPは、抗FPや豚の最初のクラスのアイデンティティを示すために、反時計回り、ZPは、FPの同一性を示すために最初に反時計回り、FPはMPなります。
    Jは:覚えて\(F(X、Y、 \ {0,1 \} \におけるz)\空間のz \)をカードである表し\(X \)\(Y \)\(Z \)動作(\は(Z = 1 \)は勇敢表す\(Z = 0 \)敵意を示すテーブル)、オフセットされていたであろう。もし\(Z = 1 \)\(K \)こと\(X \)は敵であり、\(K \)は J有する\(K \) J、その後のうち\(F(K、X、 0を)\) Jが有効であると判断し、あれば\(Z = 0 \)\(K \)その\(Yは\)フレンドリーで)\(K \ J有する\(K \) Jのうち、その後の\(F(K、Y、 1)\)は、 Jが有効であると判断します。現時点では、「表面のアイデンティティ、」ディーラーのカードを変更するには、または他のプレイヤーJ.かどうかに影響します

これらの完了がしたい後、次のステップは、書くことです。アナログコンテンツとは若干異なるトピックのような大規模な...... WAを説明します

コード
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define viewcd(u,k) for(int k=nxt[u];k;k=nxt[k])
#define LL long long
#define maxn 17
#define maxm 2007
using namespace std;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)&&ch!='-')ch=getchar();
    if(ch=='-')f=-1,ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return x*f;
}
void write(int x)
{
    if(x==0){putchar('0'),putchar('\n');return;}
    int f=0;char ch[20];
    if(x<0)putchar('-'),x=-x;
    while(x)ch[++f]=x%10+'0',x/=10;
    while(f)putchar(ch[f--]);
    putchar('\n');
    return;
}
int numpg,numcd,cf,stp;
int h[maxn],w[maxn],p[maxn],n[maxn],fake[maxn],real[maxn];
int nxt[maxm<<1],pre[maxm<<1],cntcd,chg;
char c[maxm<<1],C[maxm],s[10];
void addcd(int x,int k)
{
    rep(i,1,k)
    {
        c[++cntcd]=C[numcd--];if(!numcd)numcd=1;
        nxt[pre[x]]=cntcd,pre[cntcd]=pre[x],pre[x]=cntcd,nxt[cntcd]=x;
    }
}//x gets k cards.
void del(int x,int k)
{
    int nk=nxt[k],pk=pre[k];
    pre[nk]=pk,nxt[pk]=nk;
}//x lose card k
void clear(){nxt[1]=pre[1]=1;w[1]=0;return;}//x lose its cards.
void kil(int x,int y)
{
    if(real[y]==1&&x==1){clear();}
    else if(real[y]==3){cf--;if(!cf)stp=1;if(!stp)addcd(x,3);}
    else if(y==1)stp=1;
    if(stp)return;
    int ny=n[y],py=p[y];p[ny]=py,n[py]=ny;
}//x kill y.
int getcd(int x,char tp)
{
    for(int k=nxt[x];k!=x;k=nxt[k])
        if(tp==c[k]){del(x,k);return 1;}
    return 0;
}//get card tp of x.
int reborn(int x){if(!getcd(x,'P'))return 0;h[x]=1;return 1;}//x is going to die.
int enemy(int x,int y){if(((fake[y]&1)&&fake[y]!=real[x])||(x==1&&fake[y]==2))return 1;return 0;}//x wants to kill y.
int nedJ(int x,int y,int f)
{
    for(int k=n[x];k!=x;k=n[k])
    {
        if(!f&&fake[y]==real[k])
        {
            if(getcd(k,'J'))
            {
                fake[k]=real[k];
                if(!nedJ(k,y,1))return 1;
            }
        }
        if(f&&enemy(k,x))
        {
            if(getcd(k,'J'))
            {
                fake[k]=real[k];
                if(!nedJ(k,x,0))return 1;
            }
        }
    }
    return 0;
}///x use ... on y
//0:enemy;1:friend
int prot(int x,int y)
{
    if(fake[y]==real[x]){if(getcd(x,'J')){fake[x]=real[x];if(!nedJ(x,y,1))return 1;}}
    for(int k=n[x];k!=x;k=n[k])if(fake[y]==real[k])
    {
        if(getcd(k,'J'))
        {
            fake[k]=real[k];
            if(!nedJ(k,y,1))return 1;
        }
    }
    return 0;
}//x use ... on y
void K(int x,int y)
{
    fake[x]=real[x];
    if(!getcd(y,'D')){h[y]--;if(h[y]==0&&!reborn(y))kil(x,y);}
}//
void F(int x,int y)
{
    int kx=nxt[x],ky=nxt[y];
    fake[x]=real[x];
    if(prot(x,y))return;
    if(real[y]!=1||x!=1)
    {
        while(ky!=y)
        {
            for(;ky!=y;ky=nxt[ky])if(c[ky]=='K')break;
            if(c[ky]!='K')break;
            del(y,ky),ky=nxt[ky],swap(x,y),swap(kx,ky);
        }
    }
    if((real[y]==1&&x==1)||c[ky]!='K'){h[y]--;if(h[y]==0&&!reborn(y))kil(x,y);}
}//
void AOE(int x,char tp)//tp=='N':'K', tp=='W':'D'
{
    char ned=(tp=='N')?'K':'D';
    for(int y=n[x];y!=x;y=n[y])if(!prot(x,y))
    {
        if(!getcd(y,ned))
        {
            h[y]--;
            if(!h[y]&&!reborn(y))kil(x,y);
            if(stp)return;
            if(y==1&&!fake[x])fake[x]=2;
        }
    }
}
int main()
{
    numpg=read(),numcd=read();cntcd=numpg;
    rep(i,1,numpg)
    {
        scanf("%s",s);pre[i]=nxt[i]=i;
        real[i]=(s[0]=='M'||s[0]=='Z')?1:3;fake[i]=(i==1)?1:0;
        rep(j,1,4)
        {
            scanf("%s",s);
            c[++cntcd]=s[0];
            nxt[pre[i]]=cntcd,pre[cntcd]=pre[i],pre[i]=cntcd,nxt[cntcd]=i;
        }p[i]=(i-1)==0?numpg:i-1,n[i]=i==numpg?1:i+1,h[i]=4;
        if(real[i]==3) cf++;
    }
    rep(i,1,numcd){scanf("%s",s);C[numcd-i+1]=s[0];}
    if(cf==0)stp=1;
    for(int x=1;!stp;x=n[x]) 
    {
        addcd(x,2);int mk=0,k;
        usecd:
        chg=0;
        for(k=nxt[x];k!=x;k=nxt[k])
        {
            if(c[k]=='K'&&(!mk||w[x])&&enemy(x,n[x]))
            {
                mk=1;del(x,k),K(x,n[x]);chg=1;break;
            }
            else if(c[k]=='F')
            {
                int y;
                if(real[x]==3){del(x,k),F(x,1);}
                else 
                {
                    for(y=n[x];y!=x;y=n[y])if(enemy(x,y)){break;}
                    if(!enemy(x,y))continue;
                    del(x,k),F(x,y);
                }
                chg=1;break;
            }
            else if(c[k]=='N'||c[k]=='W'){del(x,k),AOE(x,c[k]);chg=1;break;}
            else if(c[k]=='Z'){del(x,k),w[x]=1;chg=1;break;}
            else if(c[k]=='P'&&h[x]<4){del(x,k),h[x]++;}
        }
        if(chg&&!stp&&h[x]){goto usecd;}
        if(stp)break;
    }
    puts(h[1]>0?"MP":"FP");
    rep(i,1,numpg)
    {
        if(h[i]<=0){printf("DEAD");}
        else {for(int k=nxt[i];k!=i;k=nxt[k]){printf("%c ",c[k]);}}
        puts("");
    }
    return 0;
}
いくつかの考え

最後に、我々はプレーを止めるために何かを行うことができます!

おすすめ

転載: www.cnblogs.com/xzyf/p/11276120.html