RE on Sub 3,4,6
查看原帖
RE on Sub 3,4,6
1029900
YuYuanPQ楼主2024/10/22 19:55

rt.

#include<bits/stdc++.h>

typedef int IT;
typedef long long LL;
typedef __int128 int128;
typedef double DB;
typedef long double LD;
typedef unsigned int UI;
typedef unsigned long long ULL;

#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define frt front
#define bk back
#define tp top
#define fst first
#define sec second
#define psh push
#define mkp make_pair

#define PII pair<IT,IT>
#define PLI pair<LL,IT>

#define lowbit(x) ((x)&(-x))

#define double long double
#define int long long

using namespace std;

const int N=3000,M=3000,Q=1e5+10,R=Q;

int n,m,lks,r,k;

int d[N][M];
struct node{
    int opt;
    double tm;
    int x,y;
    bool operator<(const node& p) const{
        return tm>p.tm;
    }
};
priority_queue<node>q;
int ans;

int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

bool check_die(int x,int y){
    for(int i=0;i<4;i++){
        int p=x+dx[i],q=y+dy[i];
        if(p<1||p>n||q<1||q>m) continue;
        if(d[p][q]) return 0;
    }
    return 1;
}

bool check_nwtree(int x,int y){
    bool f1=0,f2=0;
    for(int i=0;i<4;i++){
        int p=x+dx[i],q=y+dy[i];
        if(p<1||p>n||q<1||q>m) continue;
        if(d[p][q]==1) f1=1;
        else if(d[p][q]==2) f2=1;
    }
    return f1&&f2;
}

void solve(){
    scanf("%lld%lld%lld%lld%lld",&n,&m,&lks,&r,&k);
    for(int i=1;i<=lks;i++){
        int x,y,p,q;
        scanf("%lld%lld%lld%lld",&x,&y,&p,&q);
        for(int j=x;j<=p;j++)
            for(int k=y;k<=q;k++)
                d[j][k]=1;
    }
    for(int i=1;i<=r;i++){
        int t,x,y;
        scanf("%lld%lld%lld",&t,&x,&y);
        q.psh({1,(DB)t*1.0,x,y});
    }
    
    while(!q.empty()){
        node tp=q.top();
        q.pop();
        double nt=tp.tm;
        int nx=tp.x,ny=tp.y;
        if(tp.opt==1){
            if(!d[nx][ny]){
                d[nx][ny]=2;
                if(check_die(nx,ny))
                    q.psh({0,nt+k+0.5,nx,ny});
                for(int i=0;i<4;i++){
                    int px=nx+dx[i],py=ny+dy[i];
                    if(px<1||px>n||py<1||py>m) continue;
                    if(check_nwtree(px,py))
                        q.psh({1,nt+1,px,py});
                }
            }
        }
        else{
            if(check_die(nx,ny))
                d[nx][ny]=0;
        }
    }

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(d[i][j]==2) ans++;
    printf("%lld\n",ans);
    return;
}

signed main(){
    // freopen("lake4.in","r",stdin);
    // freopen("lake.out","w",stdout);
    int T=1;
    // scanf("%lld",&T);
    while(T--){
        solve();
    }
    return 0;
}
2024/10/22 19:55
加载中...