[CF1290F]Making Shapes
Making Shapes
源码
相当有趣的数位dpdpdp题。
我们记cic_ici表示第iii个向量选了多少个。
显然,无论我们如何选择向量,只要我们将所有的向量极角排序,就可以得到这些向量构造的唯一凸多边形,当然需要满足∑ci(xi,yi)=0\sum c_i(x_i,y_i)=0∑ci(xi,yi)=0
整个凸包的宽度应该L=∑ci[xi>0]∣xi∣=∑ci[xi<0]∣xi∣L=\sum c_i[x_i>0]|x_i|=\sum c_i[x_i<0]|x_i|L=∑ci[xi>0]∣xi∣=∑ci[xi<0]∣xi∣,高度同理。
我们需要让这个值小于mmm,且等式两边的值相等。
我们不妨记A=∑ci[xi>0]∣xi∣,B=∑ci[xi<0]∣xi∣,C=∑ci[yi>0]∣yi∣,D=∑ci[yi<0]∣yi∣A=\sum c_i[x_i>0]|x_i|,B=\sum c_i[x_i<0]|x_i|,C=\sum c_i[y_i>0]|y_i|,D=\sum c_i[y_i<0]|y_i|A=∑ci[xi>0]∣xi∣,B=∑ci[xi<0]∣xi∣,C=∑ci[yi>0]∣yi∣,D=∑ci[yi<0]∣yi∣。
我们可以将ccc二进制拆分后来统计,这样的话我们就能够一位一位得比较A,B,C,DA,B,C,DA,B,C,D。
由于A,B,C,DA,B,C,DA,B,C,D可能即使只在当前位加,也有可能得到比较大的结果,我们显然不能只存111位,得多存几位。
这样一来,如果从高位向低位枚举,每一位就有可能用满555位,空间比较大。
我们可以从低位向高位枚举,这样每一位上最多只需要记录3(4+4+3+3)2=21\frac{3(4+4+3+3)}{2}=2123(4+4+3+3)=21了,空间也能承受。
但由于是低位向高位,还需要注意下面的部分是否超过了mmm的低位部分,如果超过了,高位就必须小于mmm的高位了。
记dpi,A,B,C,D,fx,fydp_{i,A,B,C,D,f_x,f_y}dpi,A,B,C,D,fx,fy表示ccc的二进制为枚举到了第iii位,四个值分别为A,B,C,DA,B,C,DA,B,C,D,关于低位超过mmm的情况是fx,fyf_x,f_yfx,fy。
可以用记忆化搜索更新dpdpdp值,每一位转移就枚举ccc该位的状态就行了。
时间复杂度O(214×22logm)O\left(21^4\times 2^2\log\,m\right)O(214×22logm)。
源码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;
typedef long double ld;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int mo=998244353;
const int mod=1e9+7;
const int inv2=5e8+4;
const int jzm=2333;
const int zero=100000;
const int n1=1000;
const int lim=100000000;
const int orG=3,ivG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-6;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1)t=1ll*t*a%p;a=1ll*a*a%p;s>>=1;}return t;}
int n,m,dp[35][23][23][23][23][2][2],a[10],b[10];
int sakura(int id,int px,int py,int nx,int ny,bool fx,bool fy){if(id==30)return px==nx&&py==ny&&(px+fx<=((m>>id)&15))&&(py+fy<=((m>>id)&15));if(~dp[id][px][py][nx][ny][fx][fy])return dp[id][px][py][nx][ny][fx][fy];int res=0,up=(m>>id)&1;for(int i=0;i<(1<<n);i++){int tpx=px,tpy=py,tnx=nx,tny=ny;bool ffx=fx,ffy=fy;for(int j=1;j<=n;j++)if((i>>j-1)&1){if(a[j]>0)tpx+=a[j];else tnx-=a[j];if(b[j]>0)tpy+=b[j];else tny-=b[j];}if((tpx&1)^(tnx&1))continue;if((tpy&1)^(tny&1))continue;if(up<(tpx&1))ffx=1;if(up>(tpx&1))ffx=0;if(up<(tpy&1))ffy=1;if(up>(tpy&1))ffy=0;Add(res,sakura(id+1,tpx>>1,tpy>>1,tnx>>1,tny>>1,ffx,ffy),mo);}dp[id][px][py][nx][ny][fx][fy]=res;return res;
}
signed main(){read(n);read(m);memset(dp,-1,sizeof(dp));for(int i=1;i<=n;i++)read(a[i]),read(b[i]);printf("%d\n",add(sakura(0,0,0,0,0,0,0),mo-1,mo));return 0;
}
谢谢!!!
[CF1290F]Making Shapes相关推荐
- [CF1290F] Making Shapes
题目 题目描述 You are given nn pairwise non-collinear two-dimensional vectors. You can make shapes in the ...
- rviz学习笔记(一)——Markers: Sending Basic Shapes (C++) 发送基础形状
一.创建一个包--进行marker练习 1.创建ROS工作空间和包 mkdir -p ~/catkin_ws/src #创建工作空间目录#创建ROS数据包 catkin_create_pkg usin ...
- ValueError: operands could not be broadcast together with shapes解决
ValueError: operands could not be broadcast together with shapes (1,2) (1,3) import numpy as np a=np ...
- 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
成功解决 raise ValueError(str(e)) ValueError: Dimension 1 in both shapes must be equal, but are 1034 and ...
- 成功解决ValueError: Dimension 1 in both shapes must be equal, but are 1034 and 1024. Shapes are [100,103
成功解决ValueError: Dimension 1 in both shapes must be equal, but are 1034 and 1024. Shapes are [100,103 ...
- 成功解决IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (100,)
成功解决IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (100,) 目 ...
- OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected
OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected Making the touching shapes connected mak ...
- 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
[索引页] [×××] 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape 作者:webabcd 介绍 Silverlight 2.0 图 ...
- Use the Shapes window to organize and find shapes
http://office.microsoft.com/en-us/visio-help/use-the-shapes-window-to-organize-and-find-shapes-HA010 ...
最新文章
- Cassandra 可视化工具
- 在vs2005中使用Com连接SAP系统(二)
- 在IDEA上使用maven构建WEB工程,出现Unable to compile class for JSP错误,页面500. ————解决方案
- DAY5-小别-2018-1-15
- iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验
- MSP430G2553 移植 Contiki RTOS 实时操作系统
- 人机协作机器人发展趋势_发那科童梁:机器人化不是时髦!有效的人机协作投资回报率更高...
- mysql 建表sysdate_mysql数据库基本操作练习
- 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
- js 连mysql 延后_详解MySQL 主从同步延迟
- 全站HTTPS来了!有何优势、与HTTP有何不同
- Unix整理笔记——在指定时间运行程序——里程碑M12
- springboot整合websocket实现微信小程序聊天
- 各种最短路算法能够处理的情况(优劣比较,时间复杂度等)
- AfxBeginThread第二个参数LPVOID pParam的使用
- 盛世昊通:科技赋能下,汽车产业链将面临哪些机遇和变局
- 权限系统的基本概念和架构
- 金融壹账通重磅发布Gamma O开放平台,AnyChat携手共创开放银行新生态
- 什么是套利?什么是套利交易
- (转)FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
热门文章
- 普元Can't convert class com.primeton.data.sdo.impl.DataObjectImpl to com.primeton.sql.empdataset
- Ranorex中Reports报告不能生成
- 请勿在计算机室吃带果壳的食品英语,吃了这么多包装食品,还不懂营养标签?...
- 基于php+mysql的c2c交易平台系统
- Ubuntu 20.04 编译报错 `No package ‘orocos-bfl‘ found` 的解决方法
- 基于WEB的学生综合测评管理系统
- 借宝地一用,望多多包涵!
- SQLSTATE到底是什么意思
- 【计算机网络】常见加密方式
- 【Docker 完整版教程笔记】