zoukankan      html  css  js  c++  java
  • bzoj3208: 花神的秒题计划Ⅰ

    3208: 花神的秒题计划Ⅰ

    Time Limit: 16 Sec  Memory Limit: 128 MB

    Description

     
    背景【backboard】:
     Memphis等一群蒟蒻出题中,花神凑过来秒题……
     
    描述【discribe】:
     花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目。
     
     我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑【严格大于】。但是由于地势经常变动【比如雪崩、滑坡】,高度经常变化;同时,政府政策规定对于每个区域都要间歇地进行保护,防止环境破坏。现在,滑雪项目的要求是给出每个n*n个点的初始高度,并给出m个命令,C a b c表示坐标为a,b的点的高度改为c;S a b c d表示左上角为a,b右下角为c,d的矩形地区开始进行保护,即不能继续滑雪;B a b c d表示左上角为a b,右下角为c d的矩形地区取消保护,即可以开始滑雪;Q表示询问现在该风景区可以滑雪的最长路径为多少。对于每个Q要作一次回答。
     
     花神一看,这不是超简单!立刻秒出了标算~
     

    Input

    第一行n,第二行开始n*n的地图,意义如上;接下来一个m,然后是m个命令,如上
     

    Output

    对于每一个Q输出单独一行的回答
     

    Sample Input

    5
    1 2 3 4 5
    10 9 8 7 6
    11 12 13 14 15
    20 19 18 17 16
    21 22 23 24 25
    5
    C 1 1 3
    Q
    S 1 3 5 5
    S 3 1 5 5
    Q

    Sample Output

    24
    3

    样例解释:
    第一个Q路线为:25->24->23->22….->3->2
    第二个Q的路线为:10->9->2

    HINT

    100%的数据:1<=n<=700;1<=m<=1000000;其中Q、S、B操作总和<=100;

    题中所有数据不超过2*10^9

    Source

    原创 Memphis

    因为Q,S,B操作总和不超过100,所以直接暴力就行了;

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6  
     7 const int xx[4]={0,1,0,-1};
     8 const int yy[4]={1,0,-1,0};
     9 int ans,n,m,a[708][708],mark[708][708],dp[708][708];
    10 char s[2];
    11  
    12 inline int read(){
    13     char ch=getchar(); int f=1,x=0;
    14     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    15     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    16     return x*f;
    17 }
    18  
    19 int dfs(int x,int y){
    20     if(dp[x][y]) return dp[x][y];
    21     dp[x][y]=1;
    22     for(int i=0;i<=3;i++){
    23         int nowx=x+xx[i],nowy=y+yy[i];
    24         if(mark[nowx][nowy]) continue;
    25         if(nowx<1||nowx>n||nowy<1||nowy>n) continue;
    26         if(a[nowx][nowy]>=a[x][y]) continue;
    27         dp[x][y]=max(dp[x][y],dfs(nowx,nowy)+1);
    28     }
    29     return dp[x][y];
    30 }
    31  
    32 int main(){
    33     n=read();
    34     for(int i=1;i<=n;i++)
    35         for(int j=1;j<=n;j++)
    36             a[i][j]=read();
    37     m=read();
    38     int aa,bb,cc,dd;
    39     for(int ii=1;ii<=m;ii++){
    40         scanf("%s",s);
    41         if(s[0]=='C'){
    42             aa=read(); bb=read(); cc=read();
    43             a[aa][bb]=cc;
    44         }
    45         if(s[0]=='S'){
    46             aa=read(); bb=read(); cc=read(); dd=read();
    47             for(int i=aa;i<=cc;i++)
    48                 for(int j=bb;j<=dd;j++)
    49                     mark[i][j]=1;
    50         }
    51         if(s[0]=='B'){
    52             aa=read(); bb=read(); cc=read(); dd=read();
    53             for(int i=aa;i<=cc;i++)
    54                 for(int j=bb;j<=dd;j++)
    55                     mark[i][j]=0;
    56         }
    57         if(s[0]=='Q'){
    58             memset(dp,0,sizeof(dp));
    59             ans=0;
    60             for(int i=1;i<=n;i++)
    61                 for(int j=1;j<=n;j++)
    62                     if(dp[i][j]==0&&!mark[i][j]) ans=max(ans,dfs(i,j));
    63             printf("%d
    ",ans);
    64         }
    65     }
    66 }
  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/WQHui/p/8575541.html
Copyright © 2011-2022 走看看