absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[破碎的状态] [-25] Codeforces 226E
[破碎的状态] [-22] 551E

[破碎的状态] [-23] 487D

absi2011 posted @ Jun 29, 2016 04:46:01 PM in 刷题记录 with tags CF 瞎搞 小高考 , 299 阅读

题意:

给你个n*m(n<=105,m<=10)的方阵,每个格子有个指示牌,是<(向左),>(向右)或者^(向上)中的一个

现在有q次操作,每次:

1,询问:从某个点出发会跟着指示牌子划到哪里去

2,修改某个点的指示牌

做法:

分块..

我们记录在这一块内..每个点能滑到哪里去..是卡死循环了,还是被传送到上一块了,又或者是直接得解了(传到左右边界)

Done

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<math.h>
#include<string>
#include<time.h>
#include<bitset>
#include<vector>
#include<memory>
#include<utility>
#include<stdio.h>
#include<sstream>
#include<fstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[100005][15];
int block=500;
int dp[100005][15][2];
int n,m,k;
int limitx;
void dfs(int x,int y)
{
    if ((x<=0)||(x>n)||(y<=0)||(y>m))
    {
        dp[x][y][0]=x;
        dp[x][y][1]=y;
        return;
    }
    if (dp[x][y][0]!=-2) return;
    dp[x][y][0]=-1;
    dp[x][y][1]=-1;
    if (a[x][y]=='^')
    {
        if (x-1==limitx)
        {
            dp[x][y][0]=x-1;
            dp[x][y][1]=y;
        }
        else
        {
            dfs(x-1,y);
            dp[x][y][0]=dp[x-1][y][0];
            dp[x][y][1]=dp[x-1][y][1];
        }
    }
    else if (a[x][y]=='<')
    {
        dfs(x,y-1);
        dp[x][y][0]=dp[x][y-1][0];
        dp[x][y][1]=dp[x][y-1][1];
    }
    else if (a[x][y]=='>')
    {
        dfs(x,y+1);
        dp[x][y][0]=dp[x][y+1][0];
        dp[x][y][1]=dp[x][y+1][1];
    }
    else
    {
        dp[x][y][0]=x;
        dp[x][y][1]=y;
    }
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    scanf("%d%d%d",&n,&m,&k);
    int i;
    memset(a,'\0',sizeof(a));
    for (i=1;i<=100000;i++)
    {
        if (i<=n) scanf("%s",a[i]+1);
        if (i%block==0)
        {
            limitx=i-block;
            int j;
            for (j=limitx+1;j<=i;j++)
            {
                int k;
                for (k=1;k<=m;k++)
                {
                    dp[j][k][0]=-2;
                }
            }
            for (j=limitx+1;j<=i;j++)
            {
                int k;
                for (k=1;k<=m;k++)
                {
                    dfs(j,k);
                }
            }
        }
    }
    for (i=0;i<k;i++)
    {
        static char oper[5];
        scanf("%s",oper);
        int x,y;
        scanf("%d%d",&x,&y);
        if (oper[0]=='A')
        {
            for (;;)
            {
                if ((x<=0)||(x>n)||(y<=0)||(y>m)) break;
                int tx=dp[x][y][0];
                int ty=dp[x][y][1];
                x=tx;
                y=ty;
            }
            printf("%d %d\n",x,y);
        }
        else
        {
            static char change[5];
            scanf("%s",change);
            a[x][y]=change[0];
            limitx=(x-1)/block*block;
            int t=limitx+block;
            int j;
            for (j=limitx+1;j<=t;j++)
            {
                int k;
                for (k=1;k<=m;k++)
                {
                    dp[j][k][0]=-2;
                }
            }
            for (j=limitx+1;j<=t;j++)
            {
                int k;
                for (k=1;k<=m;k++)
                {
                    dfs(j,k);
                }
            }
        }
    }
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter