UOJ Logo QwX的博客

博客

[UOJ 135]東方包子宴 ~ Steamed Stuffed Bun Dinner

2016-04-06 14:09:33 By QwX

http://uoj.ac/submission/59143

留坑待填 :3

Case1

画一画就能发现子弹拼成了一个Touhou,手玩就行了

Case2

矩形大小是10$\times$10,移动速度也是10,中间有一个大子弹拦着不能走,每1秒在四个角上都有可能出现子弹

Dp一下f[i][j][k]表示第i秒位置是j当前有k秒没有中弹的最大分数,转移的话可以预处理出g[i][j]表示第i秒当前有j秒没有中弹的分数

估计是Dp打的比较奇怪所以比std多6分

Case3

给出一个数字三角形,越到底部分数越高,这个直接走到最后一层然后把最后一层擦一半就行了

但是时间多出了2秒,所以其实可以多擦一个倒数第二层的子弹

Case4

这个数字三角形是可以斜着走的,而且只擦最后一排并不是最优的

所以Dp一下f[i][j]表示第i行第j个往下走最多多少分,同时用g[i][j]记一下第i行第j个往左边走更优还是往右走更优

时间多出了20秒所以可以多擦一个最后一行的子弹

Case5

图形是一个迷宫,需要按时从入口走到出口,同时在某些特定时刻在特定地点有高分子弹可以擦

直接按照高分子弹出现的顺序一个一个走就行了,并不需要像题解说的那样遍历

Case6

图形还是一个迷宫,需要按时从入口走到入口,同时在一个特定时刻在一个特定地点有一个高分子弹

把整个迷宫建成一棵树,相当于遍历一遍整棵树,那么要在特定时刻遍历到特定地点,就相当于把入口到特定地点的路径找到,并在走完这条路径之前走若干个路径的子树

于是就可以记一下所有子树的大小然后做一个背包,做完背包之后标记一下哪些点需要在特定点之前走哪些点需要在之后走,最后遍历一遍就行了

Case7

二婶子的符,自己打了打收掉了Hard的符,如果有兴趣可以打一个Dp试一试,不过直接走到二婶子脸上擦掉所有子弹的得分听说是最优的,直接往上走就行了

Case8

所有子弹都会在某个时间离某条斜率为1的直线很近,直接顺着直线斜着走就好了

不用像题解说的那样用接馅饼的DP,因为只会在直线上的19个点,所以直接f[i][j]表示第i秒在第j个点的最大分数,预处理算出g[i][j]表示第i秒第j个点的是否miss以及能获得的擦弹分数

Case9

妖妖梦没有practice所以懒得打这个符了

180秒来一波弹幕,每一波弹幕都有四个地方不会miss,直接站在特定点那里不动就行了

但是估计是我太蠢,用的不是和std一样的整数坐标,我选的四个点都是精确到一位小数的,结果擦弹分不够只有9分

于是怒打一个贪心优化,如果某1秒站在特定点周围的8个位置之一得到的擦弹分数比站在原地要多,就走到那个地方去擦一发弹

然后就把std爆了12000分

Case10

一个有障碍的图,1000秒到3000秒需要从最上端走到最下端,3000秒到6000秒要从最下端走到最上端

直接贴着障碍的边界走就好了,可以先找出离障碍边界比较近的所有点,然后贪心一下行走策略搞搞就行了

估计是和边界的贴合度很高,跑的分数比std多了不少


上面说的是题解,下面开始讲心路历程

首先拿到题把第一个点切了,手玩了10分钟才玩出来简直没救

看了看第二个点,诶这不SB点吗?随便DP一下不就好了?

然后一个小时过去了,我还是没打出来

TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT TAT

又过了10分钟,终于打出来了!诶怎么和std分数不一样TAT

哦原来是比std多6分 _(:зゝ∠)_

接下来是第三个点,听说走到底擦一擦就行了?好那就打一串'X'再打一串'A'吧,听说时间还多2秒?那就把一个'A'改成'WAX'吧

诶怎么只有8分

QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ

然后把分数都打出来发现往左走虽然总分比往右走多,但是倒数第二行左边最大分数没有右边最大分数高,所以加起来走右边会更优

于是改了改就A掉啦

听说第七个点很水?那就打一串'W'剩下都'S'吧

于是就又水过了一个点

接下来我开了第四个点,然后一个数字三角形的Dp我居然调了3个小时,调了3个小时!!!

好吧其实是我去看番了= =

花了10分钟就打出了第四个点,之后花了30分钟就打出了第八个点

两个Dp的点打的还是比较顺利的也没遇到什么困难

然后那时候已经凌晨四点了所以我就去睡了

第二天上午开了第⑨个点,感觉不是很难就打出了图形找到了4段过程的特定点

然后因为自己作死把精度卡的比较严卡到了小数点后一位

就因为是一位小数所以自己手玩了一整天才找到精度最优的走路方法

于是自信满满的交了一发,以为肯定虐std

然后⑨分

T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T T_T

感觉特别不服啊手玩了一整天只给我⑨分,这不是对我赤裸裸的讽刺嘛?

于是加了个贪心,效果拔群把std爆了12000分,心里舒服了一大截

第二天早上开了第10个点,听说是唯一一个计算几何点?

然后打了一个贪心顺序的BFS就过了,还顺手爆了std

一脸懵逼啊说好的计算几何呢?

接下来是两个迷宫点了,感觉看到迷宫就头大啊

结果30分钟我就把第五个点做出来了,发现std好像说复杂了,只要用BFS求出一个点到另一个点的路径就可以了并不需要树的遍历

心里想着第五个点这么简单第六个点肯定也不会很难

然后很愉快的打出了预处理和背包,然后很愉快的...

发现我不会打树的遍历了QwQ

想了想发现貌似并不难,只要先输出从当前点到儿子的方向,再Dfs儿子,再输出儿子到当前点的方向就好辣>w<

于是这个题就做完咯~

等等第六个点怎么错了

然后我仔细看了看代码之后,发现我记录的不是挂在根到特定点路径上的子树,而是所有路径上子树的子树

于是改了改记子树的代码,就A掉这个点啦~

最后,我成功的A掉了这一题


接下来是代码,我不会给出我的数据,除非有其他人A掉了这一题我才会给那个人分享我这个题的数据

change是把有用的数据转换出来的代码,run是跑结果的代码

Case1_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int map[30][30];

int main()
{
    freopen("touhou1.in","r",stdin);
    freopen("info1.txt","w",stdout);
    static int n,m,XD,x,y;
    scanf("%d%d%d",&n,&m,&XD),scanf("%d",&XD),scanf("%d",&XD),scanf("%d",&XD),scanf("%d",&XD),scanf("%d",&XD);
    for(int i=XD;i;i--)
        scanf("%d",&XD),scanf("%d",&XD),scanf("%d%d",&x,&y),map[x][y]=1,scanf("%d",&XD),scanf("%d",&XD),scanf("%d",&XD),scanf("%d",&XD);
    for(int i=0;i<=m;i++,puts(""))
        for(int j=0;j<=n;j++)
            printf(map[j][i]?"X":"O");
    return 0;
}

Case2_run

#include<cstdio>
#include<cstdlib>
#include<iostream>

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

const int _L=1010;
const char output[6]="SXDWA";
const int delta[4][3]={{0,1,2},{0,1,3},{0,2,3},{1,2,3}};
const int name[4][3]={{0,1,2},{3,0,2},{4,0,1},{4,3,0}};

int get_v[_L][_L];
int n,m,flag[_L][4];
int f[_L][4][_L][3];
vector<pair<int,int> > val[_L];

int main()
{
    freopen("touhou2.in","r",stdin);
    freopen("touhou2.out","w",stdout);
    scanf("%d%d%d%d%d%d%d%d",&n,&n,&n,&n,&n,&n,&n,&n);
    static int x,y;
    for(int i=n;i;i--)
    {
        scanf("%d%d%d%d",&n,&m,&x,&y);
        if(n)
            flag[m][(bool)x*2+(bool)y]=1;
        scanf("%d%d%d%d",&n,&m,&x,&y);
    }
    scanf("%d",&m);
    for(int i=m;i;i--)
        scanf("%d%d%d",&x,&y,&m),val[y].push_back(make_pair(y-x+1,m));
    scanf("%d",&m),f[0][0][0][0]=1;
    for(int i=1;i<=m;i++)
        if(val[i].size())
        {
            sort(val[i].begin(),val[i].end());
            for(int j=0,k=0;j<=i;j++)
            {
                while(k<(signed)val[i].size()&&val[i][k].first==j)
                    get_v[i][j]+=val[i][k].second,++k;
                get_v[i][j+1]+=get_v[i][j];
            }
           // for(int j=0;j<=i;j++)
               // printf("%d %d %d\n",i,j,get_v[i][j]);
        }
    for(int i=0;i<m;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<=i;k++)
                if(f[i][j][k][0])
                    for(int l=0;l<3;l++)
                    {
                        static int _j,_k,get_c;
                        _j=delta[j][l],_k=flag[i+1][_j]?0:k+1;
                        get_c=get_v[i+1][_k]+flag[i+1][_j];
                        if(f[i][j][k][0]+get_c>f[i+1][_j][_k][0])
                            f[i+1][_j][_k][0]=f[i][j][k][0]+get_c,f[i+1][_j][_k][1]=j,f[i+1][_j][_k][2]=k;
                    }
    static int re,re_j,re_k;
    for(int i=0;i<=m;i++)
        for(int j=0;j<4;j++)
            if(f[m][j][i][0]>re)
                re=f[m][j][i][0],re_j=j,re_k=i;
    static int stack[_L],top;
    for(int i=m;i;i--)
    {
        n=re_j,m=re_k,re_j=f[i][re_j][re_k][1],re_k=f[i][n][re_k][2];
       // cout<<i<<' '<<f[i][n][m][0]-f[i-1][re_j][re_k][0]<<endl;
        if(i==1)
            ++i,--i;
        for(int j=0;j<3;j++)
            if(delta[re_j][j]==n)
            {
                stack[++top]=name[re_j][j];
                break;
            }
    }
    while(top)
        printf("%c",output[stack[top]]),--top;
    return 0;
}

Case3_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int map[1200][30];

int main()
{
    freopen("touhou3.in","r",stdin);
    freopen("info3.txt","w",stdout);
    static int XD,n,m,x,y;
    static double _;
    scanf("%d%d%lf%d%d%d%lf%d",&n,&m,&_,&XD,&XD,&XD,&_,&XD);
    for(int i=XD;i;i--)
        scanf("%d%d",&XD,&XD),scanf("%d%d",&x,&y),scanf("%d%d%d%d",&XD,&XD,&XD,&XD),map[x][y]=XD;
    for(int i=0;i<=m;i++,puts(""))
        for(int j=0;j<=n;j++)
            printf(map[j][i]?"X":"O");
    return 0;
}

Case4_run

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

const int _N=65;
const int n=60;
const char s[2][21]={"XXXXXXXXXZZZZAAAASSS","XXXXXXXXXCCCCDDDDSSS"};

long long f[_N][_N];
int g[_N][_N];

int main()
{
    freopen("touhou4.in","r",stdin);
    freopen("touhou4.out","w",stdout);
    static double _;
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&_,&_,&_,&_,&_,&_,&_,&_);
    for(int i=1;i<=60;i++)
        for(int j=1;j<=i;j++)
            scanf("%lf%lf%lf%lf%lf%lf%lf%lld",&_,&_,&_,&_,&_,&_,&_,f[i]+j);
    for(int i=59;i;i--)
        for(int j=1;j<=i;j++)
            if(f[i+1][j]>f[i+1][j+1])
                f[i][j]+=f[i+1][j],g[i][j]=0;
            else
                f[i][j]+=f[i+1][j+1],g[i][j]=1;
    static int _i,_j;
    for(_i=1,_j=1;_i<60;_i++)
        printf("%s",s[g[_i][_j]]),_j+=g[_i][_j];
    if(f[_i][_j-1]>f[_i][_j+1])
        printf("AAAAQQQQZZZZAAAASSSS");
    else
        printf("DDDDEEEECCCCDDDDSSSS");
    return 0;
}

Case5_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    freopen("touhou5.in","r",stdin);
    freopen("info5.txt","w",stdout);
    int _;
    double __;
    scanf("%d%d%d%d%d%lf%lf%d",&_,&_,&_,&_,&_,&__,&__,&_);
    for(int i=1;i<=510;i++)
    {
        static int x,y;
        scanf("%d%d%d%d%d%d%lf%d",&_,&_,&x,&y,&_,&_,&__,&_);
        printf("%d %d\n",x,y);
    }
    for(int i=1;i<=21;i++)
    {
        static int x,y;
        scanf("%d%d%d%d",&_,&_,&x,&y),printf("%d %d %d\n",_,x,y);
        scanf("%d%d%lf%d",&_,&_,&__,&_);
    }
    printf("706 30 30\n");
    return 0;
}

Case5_run

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

const char use[5]="AWXD";
const int dx[]={-1,0,0,1};
const int dy[]={0,-1,1,0};
const int _N=30;
const int _L=35;
const int n=22;

int t[_N],x[_N],y[_N];
bool vis[_L][_L];
int re[_L*_L];

void move(int t0)
{
    static bool flag[_L][_L];
    static pair<int,int> Queue[_L*_L];
    static int L,R,last[_L][_L],time[_L][_L];
    for(int i=0;i<=30;i++)
        for(int j=0;j<=30;j++)
            flag[i][j]=false;
    L=0,Queue[R=1]=make_pair(x[t0],y[t0]),flag[x[t0]][y[t0]]=true,time[x[t0]][y[t0]]=t[t0];
    while(L^R)
    {
        static int ux,uy;
        ux=Queue[++L].first,uy=Queue[L].second;
       // cout<<ux<<' '<<uy<<endl;
        for(int i=0;i<4;i++)
        {
            static int vx,vy;
            vx=ux+dx[i],vy=uy+dy[i];
            if(vy<0||vy>30||vis[vx][vy]||flag[vx][vy])
                continue;
            Queue[++R]=make_pair(vx,vy),flag[vx][vy]=true,last[vx][vy]=i,time[vx][vy]=time[ux][uy]+1;
        }
    }
    static int stack[_L*_L],top;
    ++t0;
    for(int i=0;i<4;i++)
        if(flag[x[t0]+dx[i]][y[t0]+dy[i]]&&time[x[t0]+dx[i]][y[t0]+dy[i]]==t[t0])
        {
            x[t0]+=dx[i],y[t0]+=dy[i];
            for(int i=x[t0],j=y[t0];time[i][j]!=t[t0-1];)
            {
                stack[++top]=last[i][j];
                i-=dx[stack[top]],j-=dy[stack[top]];
            }
            while(top)
                re[++re[0]]=stack[top],--top;
        }
}

int main()
{
    freopen("info5.txt","r",stdin);
    freopen("touhou5.out","w",stdout);
    for(int i=1;i<=510;i++)
        scanf("%d%d",x,y),vis[x[0]][y[0]]=true;
    for(int i=1;i<=22;i++)
        scanf("%d%d%d",t+i,x+i,y+i);
    x[0]=1,y[0]=t[0]=0;
    for(int i=0;i<22;i++)
        move(i);
    for(int i=1;i<=re[0];i++)
        printf("%c",use[re[i]]);
    return 0;
}

Case6_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    freopen("touhou6.in","r",stdin);
    freopen("info6.txt","w",stdout);
    int _;
    double __;
    scanf("%d%d%d%d%d%lf%lf%d",&_,&_,&_,&_,&_,&__,&__,&_);
    for(int i=1;i<=2541;i++)
    {
        static int x,y;
        scanf("%d%d%d%d%d%d%lf%d",&_,&_,&x,&y,&_,&_,&__,&_);
        printf("%d %d\n",x,y);
    }
    return 0;
}

Case6_run

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

const char use[5]="AWXD";
const int dx[]={-1,0,0,1};
const int dy[]={0,-1,1,0};
const int _L=100;
const int _N=2500;

bool vis[_L][_L];
int n,m,x[_N],y[_N],son[_N],sum[_N];
int numE,Fir[_N],ed[_N],Next[_N];
int last[_N],save[_N],fl[_N],g[_N];
vector<int> f;
int re[_N<<1];

void AddE(int x,int y)
{
    ed[++numE]=y,Next[numE]=Fir[x],Fir[x]=numE;
}

void Dfs(int u)
{
    sum[u]=2;
    if(u==m)
        son[u]=m;
    for(int e=Fir[u];e;e=Next[e])
    {
        int v=ed[e];
        Dfs(v),sum[u]+=sum[v];
        if(son[v])
            son[u]=v,++sum[0];
    }
    if(son[u])
        for(int e=Fir[u];e;e=Next[e])
            if(ed[e]!=son[u])
                save[++save[0]]=ed[e];
}

void dfs(int u)
{
    for(int e=Fir[u];e;e=Next[e])
    {
        int v=ed[e];
        if(v==son[u]||!fl[v])
            continue;
        re[++re[0]]=last[v],dfs(v),re[++re[0]]=3-last[v];
    }
    if(son[u]&&u^m)
        re[++re[0]]=last[son[u]],dfs(son[u]),re[++re[0]]=3-last[son[u]];
    for(int e=Fir[u];e;e=Next[e])
    {
        int v=ed[e];
        if(v==son[u]||fl[v])
            continue;
        re[++re[0]]=last[v],dfs(v),re[++re[0]]=3-last[v];
    }
}

int main()
{
    freopen("info6.txt","r",stdin);
    freopen("touhou6.out","w",stdout);
    static int _x,_y;
    for(int i=1;i<=2541;i++)
        scanf("%d%d",&_x,&_y),vis[_x][_y]=true;
    vis[59][81]=vis[59][80]=true,n=1,x[1]=59,y[1]=80;
    for(int i=1;i<=n;i++)
    {
        static int ux,uy;
        ux=x[i],uy=y[i];
        if(x[i]==1&&y[i]==1)
            m=i;
        for(int j=0;j<4;j++)
        {
            static int vx,vy;
            vx=ux+dx[j],vy=uy+dy[j];
            if(vis[vx][vy])
                continue;
            ++n,x[n]=vx,y[n]=vy,last[n]=j,vis[vx][vy]=true,AddE(i,n);
        }
    }
    Dfs(1),sum[0]=2229-sum[0];
    g[0]=1,f.push_back(0);
    for(int i=1;i<=save[0]&&!g[sum[0]];i++)
        for(int j=f.size();j;j--)
        {
            static int newp;
            newp=f[j-1]+sum[save[i]];
            if(newp>sum[0]||g[newp])
                continue;
            f.push_back(newp),g[newp]=save[i];
        }
    for(int i=sum[0];i;)
        fl[g[i]]=1,i-=sum[g[i]];
   // for(int i=1;i<=save[0];i++)
       // printf("%d %d %d\n",sum[save[i]],save[i],fl[save[i]]);
    dfs(1);
    for(int i=1;i<=re[0];i++)
        printf("%c",use[re[i]]);
    return 0;
}

Case7_run

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    freopen("touhou7.out","w",stdout);
    for(int i=1;i<=48;i++)
        printf("W");
    for(int i=2640;i>48;i-=4)
        if(rand()&1)
            printf("SSSS");
        else
            printf("AWDX");
    return 0;
}

Case8_run

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

const int _N=5010;
const int _M=620;
const int _L=25;
const int n=5000;
const int m=610;
const char use_s[4]="CSQ";

double x[_L],y[_L];
int val[_M][_L];
void update(int now_t,int now_p,int v0)
{
    if(val[now_t][now_p]==-1)
        return;
    else if(v0==-1)
        val[now_t][now_p]=-1;
    else
        val[now_t][now_p]+=v0;
}
class Point
{
private:
    int t0,t1,x,y,x0,y0,r,val;
public:
    Point(){}
    Point(int _0,int _1,int _2,int _3,int _4,int _5,int _6,int _7):t0(_0),t1(_1),x(_2),y(_3),x0(_4),y0(_5),r(_6),val(_7){}
    void calc()
    {
        static int now_x,now_y;
        for(int i=t0;i<=t1;i++)
        {
            now_x=x+(i-t0)*x0,now_y=y+(i-t0)*y0;
            for(int j=1;j<20;j++)
            {
                static double dis;
                dis=(::x[j]-now_x)*(::x[j]-now_x)+(::y[j]-now_y)*(::y[j]-now_y);
                if(dis<=(double)(r+5)*(r+5))
                    update(i,j,-1);
                else if(dis<=(double)(r+10)*(r+10))
                    update(i,j,val);
            }
        }
    }
}s[_N];
int f[_M][_L],g[_M][_L];

int main()
{
    freopen("touhou8.in","r",stdin);
    freopen("touhou8.out","w",stdout);
    static int _0,_1,_2,_3,_4,_5,_6,_7;
    scanf("%d%d%d%d%d%d%d%d",&_0,&_0,&_0,&_0,&_0,&_0,&_0,&_0);
    for(int i=1;i<=n;i++)
        scanf("%d%d%d%d%d%d%d%d",&_0,&_1,&_2,&_3,&_4,&_5,&_6,&_7),s[i]=Point(_0,_1,_2,_3,_4,_5,_6,_7);
    scanf("%d%d%d%d%d",&_0,&_0,&_0,&_0,&_0);
    static double s0=sqrt(112.5);
    x[1]=200,y[1]=2000;
    for(int i=2;i<20;i++)
        x[i]=x[i-1]-s0,y[i]=y[i-1]-s0;
    for(int i=1;i<=n;i++)
        s[i].calc();
    f[0][1]=1;
    for(int i=0;i<610;i++)
        for(int j=1;j<20;j++)
            if(f[i][j])
            {
                if(j^19&&val[i+1][j+1]>=0&&f[i][j]+val[i+1][j+1]>f[i+1][j+1])
                    f[i+1][j+1]=f[i][j]+val[i+1][j+1],g[i+1][j+1]=j;
                if(j-1&&val[i+1][j-1]>=0&&f[i][j]+val[i+1][j-1]>f[i+1][j-1])
                    f[i+1][j-1]=f[i][j]+val[i+1][j-1],g[i+1][j-1]=j;
                if(val[i+1][j]>=0&&f[i][j]+val[i+1][j]>f[i+1][j])
                    f[i+1][j]=f[i][j]+val[i+1][j],g[i+1][j]=j;
            }
    static int rep;
    for(int i=1;i<=20;i++)
        if(f[610][i]>f[610][rep])
            rep=i;
    static int stack[_M],top;
    for(int i=610;i;i--)
        stack[++top]=rep,rep=g[i][rep];
    stack[++top]=1;
    while(top>1)
        printf("%c",use_s[stack[top-1]-stack[top]+1]),--top;
    return 0;
}

Case9_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int map[410][110];

int main()
{
    freopen("touhou9.in","r",stdin);
    freopen("info9.txt","w",stdout);
    static int a,b,c,d;
    static double _,__;
    scanf("%d%d%d%d",&a,&b,&c,&d),printf("%d %d %d %d ",a,b,c,d);
    scanf("%d%d%d%d",&a,&b,&c,&d),printf("%d %d %d\n%d\n",a,b,c,d+4);
    for(int i=d;i;i--)
    {
        scanf("%d%d%d%d%lf%lf",&a,&b,&c,&d,&_,&__);
        printf("%d %d %d %d %lf %lf ",a,b,c,d,_,__);
        scanf("%d%d",&a,&b),printf("%d %d\n",a+5,b);
    }
    printf("0 180 249.55635 80.72792 0 0 5 0\n");
    printf("181 360 253.94113 96.28427 0 0 5 0\n");
    printf("361 540 221.79899 80.14214 0 0 5 0\n");
    printf("541 720 185.79899 95.94113 0 0 5 0\n");
    scanf("%d",&d),printf("%d\n",d);
    for(int i=d;i;i--)
        scanf("%d%d%d",&a,&b,&c),printf("%d %d %d\n",a,b,c);
    cout<<720<<endl;
    return 0;
}

Case9_run

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

const char new_s[9][3]={"SS","QC","AD","ZE","WX","XW","CQ","DA","CQ"};
const double _x[]={249.55635,253.94113,221.79899,185.79899};
const double _y[]={80.72792,96.28427,80.14214,95.94113};
const double SQRT2=sqrt(2);
const double dx[]={0,-SQRT2,-2,-SQRT2,0,0,SQRT2,2,SQRT2};
const double dy[]={0,-SQRT2,0,SQRT2,-2,2,-SQRT2,0,SQRT2};
const int _N=9610;
const int _M=730;
const int _S=40;

int n,val[_M][_S];
double x[_S],y[_S];
void update(int now_t,int now_p,int v0)
{
    if(val[now_t][now_p]==-1)
        return;
    else if(v0==-1)
        val[now_t][now_p]=-1;
    else
        val[now_t][now_p]+=v0;
}
class Point
{
public:
    double x0,y0;
    int t0,t1,x,y,r,val;
    void calc(int t)
    {
        static double now_x,now_y;
        for(int i=t0;i<=t1;i++)
        {
            now_x=x0*(i-t0)+x,now_y=y0*(i-t0)+y;
            for(int j=t*9;j<(t+1)*9;j++)
            {
                static double dis;
                dis=(::x[j]-now_x)*(::x[j]-now_x)+(::y[j]-now_y)*(::y[j]-now_y);
                if(dis<=(double)(r+6)*(r+6))
                    update(i,j,-1);
                else if(dis<=(double)(r+10)*(r+10))
                    update(i,j,val);
            }
        }
    }
}s[_N];

int main()
{
    freopen("touhou9.in","r",stdin);
    freopen("touhou9.out","w",stdout);
    for(int i=0;i<4;i++)
        for(int j=0;j<9;j++)
            x[i*9+j]=_x[i]+dx[j],y[i*9+j]=_y[i]+dy[j];
    scanf("%d%d%d%d%d%d%d%d",&n,&n,&n,&n,&n,&n,&n,&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d%d%d%lf%lf%d%d",&s[i].t0,&s[i].t1,&s[i].x,&s[i].y,&s[i].x0,&s[i].y0,&s[i].r,&s[i].val),s[i].calc((i-1)/(n/4));
   /* for(int j=1;j<=720;j++)
        for(int i=0;i<36;i++)
            cout<<j<<' '<<i<<' '<<val[j][i]<<endl; */
    freopen("touhou9_.out","r",stdin);
    static char use_s[_M];
    scanf("%s",use_s);
    for(int i=0;i<4;i++)
        for(int j=0;j<180;j+=2)
            if(use_s[j]=='S'&&use_s[j+1]=='S')
            {
                if(j==64)
                    ++j,--j;
                static int re;
                re=0;
                for(int k=1;k<9;k++)
                    if(val[j+1][i*9+k]>val[j+1][i*9+re])
                        re=k;
                use_s[j]=new_s[re][0],use_s[j+1]=new_s[re][1];
            }
    printf("%s",use_s);
    return 0;
}

Case10_change

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    freopen("touhou10.in","r",stdin);
    freopen("info10_.txt","w",stdout);
    static int a,b,c,d,e;
    static double _,__,___;
    scanf("%d%d%d%d",&a,&b,&c,&d);//,printf("%d %d %d %d ",a,b,c,d);
    scanf("%lf%d%d%d",&_,&b,&c,&d);//,printf("%lf %d %d\n%d\n",_,b,c,d);
    for(int i=d;i;i--)
    {
        scanf("%d%d%lf%lf%d%d%lf%d",&a,&b,&_,&__,&c,&d,&___,&e);
        if(a==1000&&b==6000)
            printf("%lf %lf %lf %d\n",_*10,__*10,___*10,e);
    }
    scanf("%d",&d);//,printf("%d\n",d);
    for(int i=d;i;i--)
        scanf("%d%d%d",&a,&b,&c);//,printf("%d %d %d\n",a,b,c);
   // cout<<12<<endl;
    return 0;
}

Case10_run

#include<cstdio>
#include<cstdlib>
#include<cstring>

#include<iostream>
#include<algorithm>
using namespace std;

const int n=500;
const int m=111912;
const int _N=510;
const int _L=1010;
const int _M=120000;
//const int dx[]={1,0,-1,0};
//const int dy[]={0,1,0,-1};

double x[_N],y[_N],r[_N];
int val[_N],_x[_M],_y[_M];
int vis[_L][_L],sum[_M];

int main()
{
   /* freopen("info10_.txt","r",stdin);
    freopen("info10__.txt","w",stdout);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf%lf%d",x+i,y+i,r+i,val+i);
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=1000;j++)
        {
            static bool flag;
            flag=true;
            for(int k=0;flag&&k<=1000;k++)
            {
                static double dis;
                dis=(x[i]-j)*(x[i]-j)+(y[i]-k)*(y[i]-k);
                if(dis<=r[i]*r[i])
                    flag=false;
                else
                    ++num[j][k],sum[j][k]+=val[i];
            }
            if(!flag)
            {
                flag=true;
                for(int k=1000;flag&&k>=0;k--)
                {
                    static double dis;
                    dis=(x[i]-j)*(x[i]-j)+(y[i]-k)*(y[i]-k);
                    if(dis<=r[i]*r[i])
                        flag=false;
                    else
                        ++num[j][k],sum[j][k]+=val[i];
                }
            }
        }
    }
    for(int j=0;j<=1000;j++)
        for(int i=0;i<=1000;i++)
            if(num[i][j]==500)
                printf("%d %d\n",i,j); */
   /* freopen("info10_.txt","r",stdin);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf%lf%d",x+i,y+i,r+i,val+i);
    freopen("info10__.txt","r",stdin);
    for(int i=1;i<=m;i++)
        scanf("%d%d",_x+i,_y+i),vis[_x[i]][_y[i]]=i;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if((x[i]-_x[j])*(x[i]-_x[j])+(y[i]-_y[j])*(y[i]-_y[j])<=(r[i]+10)*(r[i]+10))
                sum[j]+=val[i];
    freopen("info10____.txt","w",stdout);
    static int now_x=756,now_y=0;
    static int flag[_L][_L];
    do
    {
        static int to_p;
        if(!now_x&&!now_y)
            ++now_x,--now_x;
       // printf("%d %d\n",now_x,now_y),flag[now_x][now_y]=1;
        for(int i=0;i<4;i++)
        {
            to_p=vis[now_x+dx[i]][now_y+dy[i]];
            if(to_p)
            {
                if(!i&&vis[now_x+2][now_y])
                    continue;
                printf("%d\n",i),++sum[0];
                if(i>1)
                    vis[now_x][now_y]=0;
                break;
            }
        }
        now_x=_x[to_p],now_y=_y[to_p];
    }while(now_y!=1000);
    printf("%d\n",sum[0]);*/
   // for(int j=0;j<=1000;j++,puts(""))
       // for(int i=0;i<=1000;i++)
           // printf("%d ",flag[i][j]);
    freopen("touhou10.out","w",stdout);
    for(int i=0;i<1000;i++)
        if(i<489)
            printf("D");
        else
            printf("S");
    static int get_s[2000];
    freopen("info10___.txt","r",stdin);
    for(int i=0;i<1787;i++)
        scanf("%d",get_s+i);
    for(int i=0;i<1787+168;i++)
        if(i>=1787)
            printf("D");
        else if(get_s[i]==0)
            printf("A");
        else if(get_s[i]==1)
            printf("X");
        else if(get_s[i]==2)
            printf("D");
        else
            printf("W");
    for(int i=0;i<2000-1787-168;i++)
        printf("S");
    freopen("info10____.txt","r",stdin);
    for(int i=1675;i>=0;i--)
        scanf("%d",get_s+i);
    for(int i=0;i<1676;i++)
        if(get_s[i]==0)
            printf("A");
        else if(get_s[i]==1)
            printf("W");
        else if(get_s[i]==2)
            printf("D");
        else
            printf("X");
    for(int i=0;i<3000-1676;i++)
        printf("S");
    return 0;
}

附带一个方便使用checker的代码,只用修改caseNow文件中的值就可以测试不同的测试点了

use_checker

#include<Windows.h>

#include<cstdio>
#include<cstdlib>

char useSys[]="checker_win32  1 -p -m -g -t -x";

int main()
{
    static int Case;
    freopen("caseNow","r",stdin),fclose(stdout);
    scanf("%d",&Case);
    useSys[14]=Case^10?' ':'1',useSys[15]=Case%10+'0';
    system(useSys);
    Sleep(100000);
    return 0;
}

最后的最后,感谢SHUXK提供的题目,感谢vfk提供的平台,感谢ZUN提供的弹幕游戏姿势,感谢大家一直以来对我的资瓷

以及,感谢bx2k

评论

matthew99
前几天还发现这题没人A来着
3215
Orz
bcb_hfz
Orz
wangyurzee7
Orz
FakeAccout
楼下要有人艾特bx2k吗?
3215
@bx2k
BilIXu2000
我是bx2k 我已经报警了
bx2k
你们都会打HT_T……我e一作没通是不是没救了…… 话说有没有老司机教我TAS的正确姿势啊?
Bil1Xu2000
最近好多伪装bx2k的报警了
WrongAnswer
orz代码好牛逼。
QwX
@SHUXK 突然想问一下第7个点能不能绕着神子擦弹啊。。。。就是在不中单的前提下擦到一部分子弹,我觉得很靠谱啊。。。。还是说肯定会中弹吗?QAQ
WuHongxun
突然点开了这个。。我也不知道我是从哪点进来的。。好怀念。。

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。