1. 程式人生 > >[CF480E]Parking Lot

[CF480E]Parking Lot

題目描述

做法

首先加入所有詢問座標,求出答案。
初始答案很好求,你可以設f[i,j]表示以(i,j)為左下角的最大正方形邊長。
那麼f[i,j]=min(f[i1,j],f[i,j+1])(+1)後面是否+1要判斷右上角。
當然左下角是障礙f[i,j]=0。
接下來來考慮時間倒流。
首先我們維護left和right表示每個位置可以往左往右延伸多長。
時間倒流後,相當於刪除障礙,答案一定是遞增的。
刪除一個障礙只需要暴力更改這一行的left和right。
接下來我們不斷判斷是否存在ans+1(ans是當前答案)邊長的正方形,存在將ans+1,繼續做。
容易得知這個正方形一定跨過障礙所在列。
於是可以單調佇列,得到障礙所在列每一個長度為ans+1的區間,向左向右能延伸多長,如果加起來達到ans+1,則判定成功。
複雜度是n^2。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=2000+10;
int f[maxn][maxn],left[maxn][maxn],right[maxn][maxn];
int ans[maxn],b[maxn],dl[maxn],ask[maxn][2];
int pd[maxn][maxn];
int i,j,k,l,t,n,m,q,head,tail,now,x,y;
int read(){
    int x=0,f=1;
char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f; } char get(){ char ch=getchar(); while (ch!='.'&&ch!='X') ch=getchar();
return ch; } bool check(int ans){ int i,j,k; head=1;tail=0; fo(i,1,n){ while (head<=tail&&left[dl[tail]][y]>=left[i][y]) tail--; dl[++tail]=i; while (dl[head]<=i-ans) head++; b[i]=left[dl[head]][y]; } head=1;tail=0; fo(i,1,n){ while (head<=tail&&right[dl[tail]][y]>=right[i][y]) tail--; dl[++tail]=i; while (dl[head]<=i-ans) head++; b[i]+=right[dl[head]][y]-1; } fo(i,1,n) if (i>=ans&&b[i]>=ans) return 1; return 0; } int main(){ scanf("%d%d%d",&n,&m,&q); fo(i,1,n) fo(j,1,m) if (get()=='X') pd[i][j]++; fo(i,1,q){ ask[i][0]=read();ask[i][1]=read(); pd[ask[i][0]][ask[i][1]]++; } fo(i,1,n) fd(j,m,1){ if (pd[i][j]) continue; if (i==1||j==m){ f[i][j]=1; now=max(now,f[i][j]); continue; } f[i][j]=min(f[i-1][j],f[i][j+1]); if (!pd[i-f[i][j]][j+f[i][j]]) f[i][j]++; now=max(now,f[i][j]); } fo(i,1,n) fo(j,1,m) if (pd[i][j]) left[i][j]=0;else left[i][j]=left[i][j-1]+1; fo(i,1,n) fd(j,m,1) if (pd[i][j]) right[i][j]=0;else right[i][j]=right[i][j+1]+1; fd(i,q-1,1){ ans[i+1]=now; x=ask[i+1][0];y=ask[i+1][1]; pd[x][y]--; fo(j,1,m) if (pd[x][j]) left[x][j]=0;else left[x][j]=left[x][j-1]+1; fd(j,m,1) if (pd[x][j]) right[x][j]=0;else right[x][j]=right[x][j+1]+1; while (check(now+1)) now++; } ans[1]=now; fo(i,1,q) printf("%d\n",ans[i]); }

相關推薦

CF480E Parking Lot

傳送門 題目翻譯給的很清楚w 這題官方給的演算法是分治,但是說實話我真的不知道它和分治有什麼關係…… 有一個很正常的思路是先把所有修改都加上,之後先計算出來最小的情況(這個很簡單,dp一下即可),之後再逐步考慮修改有什麼影響。 首先如果一次修改對答案有影響的話,那麼更優的矩形一定是跨過這個障礙所在的一

[CF480E]Parking Lot

題目描述 做法 首先加入所有詢問座標,求出答案。 初始答案很好求,你可以設f[i,j]表示以(i,j)為左下角的最大正方形邊長。 那麼f[i,j]=min(f[i−1,j],f[i,j+

●CodeForces 480E Parking Lot

com work 單調隊列 ORC UC 這一 lan define 表示 題鏈: http://codeforces.com/problemset/problem/480/E題解: 單調隊列,逆向思維 (在線的話應該是分治做,但是好麻煩。。) 離線操作,逆向考慮, 最

OOD 2 : design parking lot

public enum VehicleSize{ Compact(1); Large(2); // ? why use number private final int size; VehicleSize(int size){ this.size = size;

Codeforces 46 D Parking Lot(線段樹區間更新模板題)

題目地址 題意:有長度為n米的停車場,停車的要求是要與前面一輛車至少隔a米,和後一輛車至少隔b米(只要符合要求就可以停入,不管之後會不會打破這個要求。PS:我就是想了好久沒有想通),有m個操作,有兩種操作型別: 1 x 把長度為x米的車停入停車場(一定要符

【codeforces】480E Parking Lot 線段樹+DP

題目分析:很早以前在同學助攻下寫出來的,想想還是放出來好了,是個不錯的思想。 原題是在動態將可行區域變成不可行區域的同時求全域性最大子正方形,n,m,k至多2000。 既然只有加點,於是我們離線,倒著來,這樣便只有刪點。 我們給每個節點(i,j)儲存它向上能延伸的距

cf-64d(Parking Lot)成段更新+區間合併

題目看了一個小時,想了半個小時,敲了一個小時,debug將近三個半小時。。。。。。//還是看資料的 將停車分成兩個操作,先找出停車的起始點位置,然後再成段更新。 這裡用線段樹維護區間最多能停多長的車(包括前距和後距) 找其實點時,先判斷能否放在起點,此時它

【codeforces】480E Parking Lot

#include <stdio.h> #include <algorithm> #include <string.h> #define rep(ii,a,b) for (int ii=(a);ii<=(b);ii++) #defin

Codeforces 455 B. A Lot of Games

這樣的 spa 兩個 後繼 program 狀態 ace http 解題思路 \(>Codeforces \space 455 B. A Lot of Games<\) 題目大意 : 有兩個人在玩遊戲,一共玩 \(k\) 輪,每一輪的一開始有一個空串,雙方每

BZOJ3718[PA2014]Parking——樹狀數組

can space scan amp src stack 數量 https -i 題目描述 你的老板命令你將停車場裏的車移動成他想要的樣子。停車場是一個長條矩形,寬度為w。我們以其左下角頂點為原點,坐標軸平行於矩形的邊,建立直角坐標系。停車場很長,我們可以認為它一直向

Linux+Win銳速&Lot開心版一鍵安裝腳本+源碼

serve eth0 lin 面板 tps baidu server script use Linux+Win銳速&Lot愉快版一鍵部署script+源碼 當咱們購置本國服務器使用時可以說是比較卡,特別是那些掛小水管,的更是埋怨不住,此刻銳速拯救了咱們不過不幸的是,

2018.10.29 bzoj3718: [PA2014]Parking(樹狀陣列)

傳送門 顯然只用判斷兩個會相交的車會不會卡住就行了。 直接樹狀陣列維護字尾最大值就行了。 程式碼: #include<bits/stdc++.h> using namespace std; const int N=5e4+5; struct Matrix{int x1,x

BZOJ3718[PA2014]Parking——樹狀陣列

題目描述 你的老闆命令你將停車場裡的車移動成他想要的樣子。停車場是一個長條矩形,寬度為w。我們以其左下角頂點為原點,座標軸平行於矩形的邊,建立直角座標系。停車場很長,我們可以認為它一直向右邊伸展到無窮遠處。車都是邊平行於座標軸的矩形,大小可能不同。你可以將車任意地平移(但不能旋轉),只要他們不超出停車

js從物接入lot hub mqttws31獲取資料

<script type="text/javascript" src="mqttws31.js"></script> var hostname = '', port = , clientId = '', timeout = , kee

Inspection Lot Origin (Types) for Various Material Movement Types

This Blog gives the various Inspection Types applicable for the different Material Movement Types broadly used in day to day transactions.

電信nb-lot平臺的CA證書上傳-訊息訂閱回撥地址檢測503錯誤

  在NB-LOT北向開發過程中,遇到訊息訂閱回撥地址檢測503錯誤,經過論壇查詢與文件查閱一直都沒有解決問題,大多人都說是RESTful地址格式問題,但其實不是。最終發現是我們在電信平臺建立應用時,上傳CA證書中.pem證書問題。我是在阿里雲申請的免費證書,IIS環境,將證書下載下來後,如果直接將PEM格式

Stephen Hawking Taught Us a Lot About How to Live

勇氣、好奇心、幽默感,那些霍金教給我們的事Stephen Hawking Taught Us a Lot About How to LiveStephen Hawking, the English cosmologist and black hole maven, liked to say he was bo

LG V40 ThinQ: A whole lot of cameras

LG V40 ThinQ: A whole lot of camerasThe LG V40 ThinQ has been revealed, it has five cameras!LG’s new flagship phone is different than other phones while im

Better bus predictions (a lot better)

Better bus predictions (a lot better)We’re announcing on other venues today that bus predictions at the T are about to get a whole lot better. We think it’

Pixel Stand charges your phone, and does a whole lot more

Google is beating Apple to releasing a wireless charger. The Pixel Stand, announced Tuesday, is a wireless charger designed for the Pixel 3 and Pixel 3 XL.