分析

这道题看上去很恶心,实际上只用记录四坨东西就能打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. 从消费者看 rebalance

    kafka java 客户端发送请求,大量使用 RequestFuture,因此先说明下该类. RequestFuture 类的成员属性 listeners 是 RequestFutureListen ...

  2. Jmeter接口测试系列之保存断言结果到文件

    在执行完接口测试用例后,我们需要将失败的用例结果统一保存到文件中,可以使用“断言结果”组件,并定制输出内容. 1.配置断言结果组件输出 (1.在文件名中配置需要保存的文件路径和文件名: (2.勾选仅日 ...

  3. Jmeter之安装和配置

    一.Jmeter下载: 官网下载地址:http://jmeter.apache.org/download_jmeter.cgi 目前最新版本为5.0(未使用过),建议使用4.0 (存在两种格式的压缩包 ...

  4. Flink架构和调度

    1.Flink架构 Flink系统的架构与Spark类似,是一个基于Master-Slave风格的架构,如下图所示: Flink集群启动时,会启动一个JobManager进程.至少一个TaskMana ...

  5. 【Linux 应用编程】文件IO操作 - 常用函数

    Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...

  6. 以非root身份安装Python的Module或者Package以及pip安装指定路径

    因为要远程访问公司的服务器,没有sudo的权限,所以在安装python的一些包的时候就不能安去默认路径了(比如以/usr/local/lib/为prefix的路径). 一般来讲用easy_instal ...

  7. jmeter线程组基本设置

    线程组基本设置 在线程组界面中可以设置以下数据,进行控制线程组: 1.取样器错误后要执行的动作: 继续:忽略错误,继续执行 Start Next Thread Loop: 忽略错误,线程当前循环终止, ...

  8. numpy2

    1.通用函数,是一种在ndarray数据中进行逐元素操作的函数.某些函数接受一个或多个标量数值,并产生一个或多个标量结果,通用函数就是对这些函数的封装. 1.常用的一元通用函数有:abs\fabs s ...

  9. xmake v2.2.9 发布, 新增c++20 modules的实验性支持

    这个版本没啥太大新特性,主要对c++20 modules进行了实验性支持,目前支持clang/msvc编译器,除此之外改进了不少使用体验,并且提高了一些稳定性. 另外,这个版本新增了socket.io ...

  10. 简单记事本的基本实现&十四周总结

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...