分析

这道题看上去很恶心,实际上只用记录四坨东西就能打DP了:y坐标最小的向上射的点、y坐标最大的向下射的点、y坐标最大和最小的向右射的点,转移显然。注意,如果该状态的值为零就可以略过,否则会超时。

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[60][3],f[2][57][57][57][57],xz[55],xy[55],ys[55],yx[55];
int n,m,tot;
void q(int l,int r)
{
int i=l,j=r,mid=a[(l+r)/2][1],e;
while(i<j)
{
while(a[i][1]<mid) i++;
while(a[j][1]>mid) j--;
if(i<=j)
{
e=a[i][1];
a[i][1]=a[j][1];
a[j][1]=e;
e=a[i][2];
a[i][2]=a[j][2];
a[j][2]=e;
i++;
j--;
}
}
if(i<r) q(i,r);
if(l<j) q(l,j);
}
void q1(int l,int r)
{
int i=l,j=r,mid=a[(l+r)/2][2],e;
while(i<j)
{
while(a[i][2]<mid) i++;
while(a[j][2]>mid) j--;
if(i<=j)
{
e=a[i][1];
a[i][1]=a[j][1];
a[j][1]=e;
e=a[i][2];
a[i][2]=a[j][2];
a[j][2]=e;
i++;
j--;
}
}
if(i<r) q1(i,r);
if(l<j) q1(l,j);
}
int main()
{
cin>>n;
int i,j,k,l,p,x,y;
for(i=1;i<=n;i++)
{
cin>>a[i][1]>>a[i][2];
xz[i]=xy[i]=ys[i]=yx[i]=56;
}
xz[0]=xy[0]=ys[0]=yx[0]=56;
q1(1,n);
tot=0;
p=-2000000000;
for(i=1;i<=n;i++)
{
if(a[i][2]==p)
{
a[i][2]=tot;
}
else
{
p=a[i][2];
a[i][2]=++tot;
}
}
q(1,n);
tot=0;
p=-2000000000;
for(i=1;i<=n;i++)
{
if(a[i][1]==p)
{
a[i][1]=tot;
}
else
{
p=a[i][1];
a[i][1]=++tot;
}
if(xz[a[i][2]]==56)
xz[a[i][2]]=a[i][1];
else
xz[a[i][2]]=min(xz[a[i][2]],a[i][1]); if(xy[a[i][2]]==56)
xy[a[i][2]]=a[i][1];
else
xy[a[i][2]]=max(xy[a[i][2]],a[i][1]); if(yx[a[i][1]]==56)
yx[a[i][1]]=a[i][2];
else
yx[a[i][1]]=min(yx[a[i][1]],a[i][2]); if(ys[a[i][1]]==56)
ys[a[i][1]]=a[i][2];
else
ys[a[i][1]]=max(ys[a[i][1]],a[i][2]);
}
int mo=998244353;
f[0][n+1][0][0][n+1]=1;
int ans=0;
for(i=0;i<=n;i++)
{
memset(f[(i+1)%2],0,sizeof(f[(i+1)%2]));
for(int up=0;up<=n+1;up++)
for(int down=0;down<=n+1;down++)
for(int mx=0;mx<=n+1;mx++)
for(int mn=0;mn<=n+1;mn++)
if(f[i%2][up][down][mx][mn])
{
int sum=0;
int t=f[i%2][up][down][mx][mn];
//上
if(a[i+1][2]==ys[a[i+1][1]] && mx<a[i+1][2])
(f[(i+1)%2][min(up,a[i+1][2])][down][mx][mn]+=t)%=mo,(sum+=t)%=mo;
//下
if(a[i+1][2]==yx[a[i+1][1]] && mn>a[i+1][2])
(f[(i+1)%2][up][max(down,a[i+1][2])][mx][mn]+=t)%=mo,(sum+=t)%=mo;
//左
if(a[i+1][1]==xz[a[i+1][2]] && up>a[i+1][2] && down<a[i+1][2])
(f[(i+1)%2][up][down][mx][mn]+=t)%=mo,(sum+=t)%=mo;
//右
if(a[i+1][1]==xy[a[i+1][2]])
(f[(i+1)%2][up][down][max(mx,a[i+1][2])][min(mn,a[i+1][2])]+=t)%=mo,(sum+=t)%=mo;
if(i==n-1) ans=(ans+sum)%mo;
}
}
cout<<ans;
}

【C】题解 (五校联考3day2)的更多相关文章

  1. 【五校联考3day2】C

    題意: 現有一平面直角坐標系,有n個點,每一個點必須向某一個方向發射射線,且任意一條射線必須與某一條坐標軸平行.定義一種發射射線的方案是合法的,則方案必須滿足: 1.沒有一條射線交叉 2.沒有一條射線 ...

  2. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  3. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  4. 【宝藏】题解(五校联考3day1)

    分析 如果打爆搜的话可以拿60分. 首先知道期望是可以累加的,即i通过j去到k的期望,等于i去到j的期望加j去到k的期望. 所以令d[i]表示i的出度,F[i]表示从i到i的父亲的期望,G[i]表示i ...

  5. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  6. 【五校联考5day1】登山

    题目 描述 题目大意 给你一个n∗nn*nn∗n的网格图.从(0,0)(0,0)(0,0)开始,每次只可以向右或向上移动一格,并且不能越过对角线(即不能为x<yx<yx<y). 网格 ...

  7. 【2020五校联考NOIP #2】矩阵

    咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...

  8. 五校联考 running (欧拉函数)

    题面 \(solution:\) 讲真吧,这道题真的出得,嗯,太恐怖了.考场上这道题真的把我看懵了,这道题以前是见过的,但欧拉函数?我学过吗?一道容斥都要超时的题目,我都要为我自己点根香了,拿着gcd ...

  9. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

随机推荐

  1. Eureka服务注册与发现-提供消费服务模型

    1.工具及软件版本 JDK1.8 Spring Boot 1.4.3.RELEASE <parent> <groupId>org.springframework.boot< ...

  2. 自建 CA 中心并签发 CA 证书

    目录 文章目录 目录 CA 认证原理浅析 基本概念 PKI CA 认证中心(证书签发) X.509 标准 证书 证书的签发过程 自建 CA 签发证书并认证 HTTPS 网站的过程 使用 OpenSSL ...

  3. IDEA maven 阿里云镜像 下载jar失败

    我在使用IDEA搭建SpringCloud项目的时候,发现很多spring cloud 包总是下载不了.maven配置了阿里云镜像.在换了一下新版的镜像地址以后就可以下包了. 官方答疑:新版maven ...

  4. 彻底理解RSA算法原理

    1. 什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法.在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为对称密码和公钥密码 对称密码:加 ...

  5. 【Qt开发】状态栏设置

    1.在Qt 里面,状态栏显示的信息有三种类型:临时信息.一般信息和永久信息.  其中,临时信息指临时显示的信息,比如QAction 的提示等,也可以设置自己的  临时信息,比如程序启动之后显示Read ...

  6. 20191110 Spring Boot官方文档学习(3)

    3.使用Spring Boot 3.1.构建系统 建议选择Maven或Gradle作为构建工具 每个Spring Boot版本都提供了它所支持的依赖关系的精选列表.实际上,您不需要为构建配置中的所有这 ...

  7. Double类型的数值 在写入excel时 如何去掉 科学计算法的 后面数值+ E的 情况

    Double start = 20190724100000.000; 写入excel时 是 201907E+13 但想要输出的是 20190724100000 这种格式 Java在java.math包 ...

  8. [JS] 鼠标点击文本框清空默认值,离开文本框恢复默认值

    在使用文本框的时候,若设定了初始值,选择文本框进行输入的时候要将本来的内容进行删除,会显得非常麻烦 可以在文本框属性定义触发onfocus和onblur两个事件时对应的js功能 下面以asp.net代 ...

  9. linux应用程序启动时加载库错误问题

    ldd text查看依赖库 ln -s /lib64/libpcre.so.0 /usr/local/lib/libpcre.so做软连接

  10. kubernetes快速应用入门

    kubectl 就是 api server的客户端工具 创建一个nginx的pod [root@master ~]# kubectl run nginx-deploy --image=nginx:1. ...