「JOI 2015 Final」城墙

复杂度默认\(m=n\)

暴力

对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向左延伸的长度,向上延伸的长度)\)(遇到不能放的停止)

那么枚举左上端点\((i,j)\)和右下端点\((i+len-1,j+len-1)\),能够被计入答案要求\(ld[i][j] \geq len , rd[i+len-1][j+len-1] \geq len,len>=L\)。

复杂度\(o(n^3)\)。

优化

对于每个左上端点\((i,j )\),是在区间\((i+K-1,j+K-1) (K \in [L,ld[i][j] ])\),求有多少个点\((i+K,j+K)\),使得\(rd[i+K-1][j+K-1] \geq K\)。

这是一个经典的问题。

可以离线树状数组,或者可持久化线段树。

复杂度\(o(n^2 log(n))\)。

#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
void in(int &r){
static char c;
r=0;
while(c=getchar(),!isdigit(c));
do r=(r<<1)+(r<<3)+(c^48);
while(c=getchar(),isdigit(c));
}
bool cur1;
int n,m,lim,P;
const int mn=4005;
int mark[mn][mn];
int rd[mn][mn],ld[mn][mn],mid[mn][mn];
struct BIT{
int c[mn];
void clear(){
rep(q,1,m)c[q]=0;
}
void add(int x,int v){
while(x<=m)c[x]+=v,x+=x&-x;
}
int ask(int x){
int ans=0;
while(x)ans+=c[x],x&=x-1;
return ans;
}
int ask(int l,int r){
if(l>r)return 0;
return ask(r)-ask(l-1);
}
}ad;
struct nd{
int l,r,v;
bool operator <(const nd &A){
return v>A.v;
}
}an[mn],qr[mn];
long long ans;
void solve(int len){
ad.clear();
int tot=0;
rep(q,1-min(0,len),min(m,n-len)){
if(rd[q+len][q]){
an[++tot]={q+len,q,rd[q+len][q]+q-1};
qr[tot]={q-ld[q+len][q]+1,q-lim+1,q};
}
}
sort(an+1,an+tot+1);
int now=1,now1=tot;
dep(q,m,1){
while(now<=tot&&an[now].v==q){
ad.add(an[now].r,1);
++now;
}
while(now1>0&&qr[now1].v==q){
ans+=ad.ask(qr[now1].l,qr[now1].r);
--now1;
}
}
}
bool cur2;
int main(){
// cerr<<(&cur2-&cur1)/1024.0/1024.0;
freopen("wall.in","r",stdin);
freopen("wall.out","w",stdout);
in(n),in(m),in(lim),in(P);
int a,b;
rep(q,1,P)in(a),in(b),mark[a][b]=1;
rep(q,1,n)rep(w,1,m)ld[q][w]=!mark[q][w]?ld[q][w-1]+1:0;
rep(w,1,m)rep(q,1,n)mid[q][w]=!mark[q][w]?mid[q-1][w]+1:0;
rep(q,1,n)rep(w,1,m)ld[q][w]=min(ld[q][w],mid[q][w]);
rep(q,1,n)dep(w,m,1)rd[q][w]=!mark[q][w]?rd[q][w+1]+1:0;
rep(w,1,m)dep(q,n,1)mid[q][w]=!mark[q][w]?mid[q+1][w]+1:0;
rep(q,1,n)rep(w,1,m)rd[q][w]=min(rd[q][w],mid[q][w]); rep(q,1-m,n-1)solve(q); printf("%lld",ans);
return 0;
}

「JOI 2015 Final」城墙的更多相关文章

  1. 「JOI 2015 Final」舞会

    「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...

  2. 「JOI 2015 Final」分蛋糕 2

    「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...

  3. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  4. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  5. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  6. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  7. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

  8. LOJ#2764. 「JOI 2013 Final」JOIOI 塔

    题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...

  9. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

随机推荐

  1. Codeforces 931C:Laboratory Work(构造)

    C. Laboratory Work time limit per test : 1 second memory limit per test : 256 megabytes input : stan ...

  2. 「算法笔记」CRT 与 exCRT

    一.扩展欧几里得 求解方程 \(ax+by=\gcd(a,b)\). int exgcd(int a,int b,int &x,int &y){ if(!b) return x=1,y ...

  3. 贪心学院计算机视觉CV训练营

    贪心学院计算机视觉CV训练营 任务 Notes 其他 任务1:机器学习.深度学习简介 Note1 任务2:深度学习的发展历史 Note2 任务3:现代深度学习的典型例子 Note3 任务4:深度学习在 ...

  4. CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211

    CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...

  5. CS5211替代CH7511B|DP转LVDS控制板|替代CH7511B设计电路方案

    CS5211性能和参数可以替代CH7511B,PS8622,PS8625,LT7211等方案,用于设计DP转LVDS转换器,DP转LVDS控制板,DP转LVDS转接板等产品设计. CS5211是一个e ...

  6. 编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示

    返回本章节 返回作业目录 需求说明: 使用Swing事件处理机制实现用户登录和英雄信息显示 实现思路: 创建LoginView类,该类用于显示登录界面,为登录按钮添加ActionListener事件, ...

  7. 你还不了解SpringSecurity吗?快来看看SpringSecurity实战总结~

    SpringSecurity简介:   权限管理中的相关概念 主体 principal: 使用系统的用户或设备或从其他系统远程登录的用户等等,简单说就是谁使用系统谁就是主体. 认证 authentic ...

  8. 初识python: 列表(list)

    使用列表函数写一个"购物车"小程序: #!/user/bin env python # author:Simple-Sir # 20180908 ''' 需求: 1.启动程序后,让 ...

  9. 使用 spring security 中的BcryptPasswordEncoder对象对用户密码进行加密

    一.引入security启动器 在子工程中直接引入,不用指定版本号 二.在启动类中把BCryptPasswordEncoder对象注入到容器中 三.在service 层注入 四. 调用encode方法 ...

  10. SQL高级优化(五)之执行计划

    一.explain 执行计划:在MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的. explain:MySQL执行计划的工具,查看MySQL如 ...