Codeforces 232E - Quick Tortoise bitset+分治

题意:
这里写图片描述
思路:
这里写图片描述
这里写图片描述

//By SiriusRen
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
int n,m,q;
char map[505][505],ans[600005];
struct Node{int x1,y1,x2,y2,id;}jy;
vector<Node>vec;
bitset<505>a[505][505],b[505][505];
void solve(int l,int r,vector<Node>v){
    int mid=(l+r)>>1,size=v.size();if(!size||l>r)return;
    for(int i=mid;i>=l;i--){
        for(int j=m;j;j--){
            a[i][j].reset();
            if(map[i][j]=='#')continue;
            if(i==mid)a[i][j][j]=1;
            else a[i][j]|=a[i+1][j];
            if(j!=m)a[i][j]|=a[i][j+1];
        }
    }
    for(int i=mid;i<=r;i++){
        for(int j=1;j<=m;j++){
            b[i][j].reset();
            if(map[i][j]=='#')continue;
            if(i==mid)b[i][j][j]=1;
            else b[i][j]|=b[i-1][j];
            if(j!=1)b[i][j]|=b[i][j-1];
        }
    }
    vector<Node>v1,v2;
    for(int i=0;i<size;i++){
        jy=v[i];
        if(jy.x2<mid)v1.push_back(jy);
        else if(jy.x1>mid)v2.push_back(jy);
        else ans[jy.id]=(a[jy.x1][jy.y1]&b[jy.x2][jy.y2]).any();
    }
    solve(l,mid-1,v1),solve(mid+1,r,v2);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%s",map[i]+1);
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
        jy.id=i,scanf("%d%d%d%d",&jy.x1,&jy.y1,&jy.x2,&jy.y2),vec.push_back(jy);
    solve(1,n,vec);
    for(int i=1;i<=q;i++)puts(ans[i]?"Yes":"No");
}

这里写图片描述

posted @ 2017-01-26 22:08  SiriusRen  阅读(284)  评论(0编辑  收藏  举报