Description

在远古的YL国大地上,有n个祭坛,每个祭坛上四个方向写有“艄、毜、鼛、瓯”四个大字,其实这在YL国古代分别是“东、南、西、北”的意思。
YL国每年都要举行祈福消灾的祭祀活动,这个时候,每个祭坛都要在艄毜鼛瓯四个方向中选一个方向,祭坛将向这个方向发出一道隐形的光线,如果两个祭坛发出的光线相交,或者祭坛发出的光线经过了别的祭坛,则祭祀不仅不能成功还将遭到上天的惩罚,如果这些条件都满足则祭祀将成功,YL国在接下来的一年内将不会有任何灾难,甚至只会有人出生不会有人死亡。
抽象的来说,如果我们以“艄”方向为x轴,“瓯”方向为y轴,建立笛卡尔坐标系,那么每个祭坛将会对应一个整点。每个点向上下左右四个方向之一连出一条射线,这些射线不能相交且射线不能经过除了发出点之外的其他点}。
现在他们又到了祭祀活动的时候,他们想知道,有多少种方法选择每个祭坛的方向},使得自己的祭祀能成功?输出方案数对998244353取模后的值}。

Input

第一行一个正整数n。
接下来n行,第i + 1行两个整数x_i, y_i,表示第i个祭坛在题目中所述的坐标系下的坐标为(x_i, y_i)。

Output

输出一行一个整数,表示要求的方案数对998244353取模后的值。

Sample Input

输入1:
1
1 1
输入2:
2
1 1
2 2
输入3:
6
0 0
0 1
0 2
0 3
0 4
0 5
输入4:
5
1 3
-4 6
2 4
1 6
5 9
输入5:
10
175470546 566770243
501153312 923840801
-36922529 -888266785
-587403745 908979876
-483726071 -96937502
991096990 -783436017
766700568 -679180551
-601529754 815529478
961445805 303768338
245415738 325847411

Sample Output

输出1:
4
样例1解释:只有一个祭坛,显然四个方向都可以发射。
输出2:
14
样例2解释:
对于所有的4 × 4 = 16种情况中,只有两种不可行:
1号祭坛向上,2号向左。
1号向右,2号向下
输出3:
144
样例3解释:
最上面的祭坛可以向左中右三个方向连出射线,最下面的祭坛可以向右下左三个方向连出射线,中间4个祭坛可以向左右连出射线,方案数为3 × 2 × 2 × 2 × 2 × 3 = 144。
输出4:
117
样例4解释:
祭坛的位置如图所示:

输出5:
24341

Data Constraint

对于前30%的数据,n ≤ 9。
对于前40%的数据,n ≤ 18。
对于前60%的数据,n ≤ 36。
对于前100%的数据,n ≤ 54,对于所有i, j,有x_i ≠ x_j或y_i ≠ y_j,且|x_i|, |y_i| ≤ {10} ^ 9。

思路

将点按x坐标排序

然后用dp处理

一个祭坛能往一个方向发射,当且仅当没有东西与它相交或被它穿过。

所以用一个5维DP就行了(第一维枚举点,其他的枚举四个方向有威胁靠得最近的点)

当然第一维要滚动一下

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 60
#define mo 998244353
using namespace std;
struct E
{int x,y;
}e[N];
int n,bb,x,y,ans,f[2][N][N][N][N];
bool cmp(E a,E b)
{return a.x<b.x||a.x==b.x&a.y<b.y;
}
int min(int x,int y)
{ if(!x) return y; if(!y) return x;return e[x].y<e[y].y?x:y;
}
int max(int x,int y)
{ if(!x) return y; if(!y) return x;return e[x].y>e[y].y?x:y;
}
bool check(int x,int y,int k)
{if(y==1&&e[k].x==e[x].x&&e[k].y>e[x].y) return 0;if(y==2&&e[k].x==e[x].x&&e[k].y<e[x].y) return 0;if(y==3&&e[k].y==e[x].y&&e[k].x<e[x].x) return 0;if(y==4&&e[k].y==e[x].y&&e[k].x>e[x].x) return 0;return 1;
}
int main()
{scanf("%d",&n);for(int i=1; i<=n; i++) scanf("%d%d",&e[i].x,&e[i].y);sort(e+1,e+n+1,cmp),f[0][0][0][0][0]=y=1,x=0;for(int i=1; i<=n; i++){for(int j=1; j<=4; j++) {bb=0;for(int k=1;k<=n;k++) if(!check(i,j,k)) { bb=1; break; }if(!bb)for(int u=0; u<i; u++)for(int d=0; d<i; d++)for(int l=0; l<i; l++)    for(int r=0; r<i; r++)if(f[x][u][d][l][r]){if(j==1&&(e[u].y<e[i].y||!u))(f[y][u][d][min(i,l)][r]+=f[x][u][d][l][r])%=mo;if(j==2&&(e[d].y>e[i].y||!d))(f[y][u][d][l][max(r,i)]+=f[x][u][d][l][r])%=mo;if(j==3&&((e[l].y>e[i].y&&e[r].y<e[i].y)||(!l&&!r)||(e[l].y>e[i].y&&!r)||(e[r].y<e[i].y&&!l)))(f[y][u][d][l][r]+=f[x][u][d][l][r])%=mo;if(j==4)(f[y][max(i,u)][min(i,d)][l][r]+=f[x][u][d][l][r])%=mo;}}x=x^1,y=y^1,memset(f[y],0,sizeof(f[y]));}for(int u=0; u<=n; u++)for(int d=0; d<=n; d++)for(int l=0; l<=n; l++)for(int r=0; r<=n; r++)(ans+=f[x][u][d][l][r])%=mo;printf("%d",ans);
}

【JZOJ A组】C相关推荐

  1. jzoj C组 2017.1.19 比赛

    第一题--小x的游戏 题目描述 Tac游戏在一个4*4的方格上进行.起先可能会在16个方格中出现一个标记'T',其余的方格是空着的.游戏有两个玩家,小x和小o.小x先开始,然后游戏轮流进行.每一步玩家 ...

  2. 【JZOJ A组】海明距离

    Description 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 1 = 1 1 XOR 1 = ...

  3. 【JZOJ A组】昆特牌

    Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观.但没想到你刚一到就遇到了麻烦.昆特牌的数据库发生了故障.原本昆特牌中有 k种卡牌和n 种阵营,为了平衡,每个阵营拥有 ...

  4. 【JZOJ A组】黑暗之魂(darksoul)

    Description oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰在一张地图中探险.地图中有n个篝火(也就是存档点).在篝火处休息可以将生命值恢复满 ...

  5. 【JZOJ B组】【JSOI2013】吃货JYY

    Description 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一 ...

  6. 【JZOJ A组】排列

    Description 一个关于n个元素的排列是指一个从{1, 2, -, n}到{1, 2, -, n}的一一映射的函数.这个排列p的秩是指最小的k,使得对于所有的i = 1, 2, -, n,都有 ...

  7. 【JZOJ A组省选】词典

    Description Input 第一行两个数n,m,表示有n个字符串,m个询问. 接下来n行,每行一个字符串Ti . 再接下来m行,每行一个字符串Si . Output 对于每个询问,输出一个an ...

  8. JZOJ B组【GDKOI2014】壕壕的寒假作业

    题目: Input Output 输出n行.第i行输出两个整数,分别表示第i份作业最早完成的时刻以及最晚完成的时刻,两个整数之间以一个空格间隔. Sample Input 4 4 3 4 5 6 1 ...

  9. 【JZOJ B组】【NOIP2013模拟】小喵喵的新家

    Description 小喵喵和小聪聪从小就是好朋友 ,他们经常在一起玩耍 .如今小喵已经厌倦了自己居住的环境,想请小聪聪为她建一个新家. 小喵喵天生多才多艺,对多种乐器颇有研究.对于生活中常见的图形 ...

  10. 【JZOJ A组】凯旋而归

    Description Input 第一行一个整数 n,表示数的个数. 第二行n个整数,第i个整数为ai . Output n行一个整数表示答案,第i行表示序列第i个前缀的帅气值. Sample In ...

最新文章

  1. uni-app接口封装
  2. 使用Consul实现服务发现:instance-id自定义(3种方式)
  3. VTK:Points之NormalEstimation
  4. Linux 设备驱动开发 —— platform 设备驱动
  5. bitmap 转 drawable
  6. Spring Cloud Alibaba —— Seata 分布式事务框架
  7. python import from class_彻底搞懂Python 中的 import 与 from import
  8. 第三部分 03 使用HTTP GET进行调用
  9. linux换硬盘网卡不能启动,服务器硬盘冷迁移后网卡无法启动问题
  10. 计算机的基础硬件知识,计算机硬件基础知识学习_电脑硬件知识_手机硬件知识...
  11. botley编程机器人测评_好物测评:五岁小孩都能上手的智能编程机器人有多好玩?动手又动脑!...
  12. c计算机软考中级考什么,计算机软考中级考试内容
  13. win10计算机内存,win10系统电脑怎么升级内存?win10系统升级内存的方法
  14. 【整理】关于Android图形系统的一些事实真相
  15. 2021年前端部署的灵魂拷问
  16. 「BJOI 2019」排兵布阵
  17. 批量删除多个 Word 文档的空白页
  18. Python实现和弦查询器(钢琴)
  19. initrd和initramfs的区别
  20. 全志V3s学习记录(13)OV2640的使用

热门文章

  1. IE和firefox上传文件mime类型的设置
  2. [全程建模]关于UML与新概念名词的问题讨论
  3. 网易2017实习生笔试6
  4. 聊聊 Java 的单元测试
  5. 透过ReentrantLock窥探AQS
  6. 概念---金融工程1:外汇的无套利定价模型
  7. Python自动化测试框架之Pytest相关用法-Fixture(2)
  8. OCP/OCA Oracle 学习001
  9. ubuntu apt-get 安装amd显卡驱动
  10. 前端面试经历和感想(2019年7月)