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×22log⁡m)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相关推荐

  1. [CF1290F] Making Shapes

    题目 题目描述 You are given nn pairwise non-collinear two-dimensional vectors. You can make shapes in the ...

  2. rviz学习笔记(一)——Markers: Sending Basic Shapes (C++) 发送基础形状

    一.创建一个包--进行marker练习 1.创建ROS工作空间和包 mkdir -p ~/catkin_ws/src #创建工作空间目录#创建ROS数据包 catkin_create_pkg usin ...

  3. 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 ...

  4. 成功解决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 ...

  5. 成功解决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 ...

  6. 成功解决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,) 目 ...

  7. OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected

    OpenCASCADE绘制测试线束:拓扑命令之Making the touching shapes connected Making the touching shapes connected mak ...

  8. 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape

    [索引页] [×××] 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape 作者:webabcd 介绍 Silverlight 2.0 图 ...

  9. 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 ...

最新文章

  1. Cassandra 可视化工具
  2. 在vs2005中使用Com连接SAP系统(二)
  3. 在IDEA上使用maven构建WEB工程,出现Unable to compile class for JSP错误,页面500. ————解决方案
  4. DAY5-小别-2018-1-15
  5. iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验
  6. MSP430G2553 移植 Contiki RTOS 实时操作系统
  7. 人机协作机器人发展趋势_发那科童梁:机器人化不是时髦!有效的人机协作投资回报率更高...
  8. mysql 建表sysdate_mysql数据库基本操作练习
  9. 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
  10. js 连mysql 延后_详解MySQL 主从同步延迟
  11. 全站HTTPS来了!有何优势、与HTTP有何不同
  12. Unix整理笔记——在指定时间运行程序——里程碑M12
  13. springboot整合websocket实现微信小程序聊天
  14. 各种最短路算法能够处理的情况(优劣比较,时间复杂度等)
  15. AfxBeginThread第二个参数LPVOID pParam的使用
  16. 盛世昊通:科技赋能下,汽车产业链将面临哪些机遇和变局
  17. 权限系统的基本概念和架构
  18. 金融壹账通重磅发布Gamma O开放平台,AnyChat携手共创开放银行新生态
  19. 什么是套利?什么是套利交易
  20. (转)FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

热门文章

  1. 普元Can't convert class com.primeton.data.sdo.impl.DataObjectImpl to com.primeton.sql.empdataset
  2. Ranorex中Reports报告不能生成
  3. 请勿在计算机室吃带果壳的食品英语,吃了这么多包装食品,还不懂营养标签?...
  4. 基于php+mysql的c2c交易平台系统
  5. Ubuntu 20.04 编译报错 `No package ‘orocos-bfl‘ found` 的解决方法
  6. 基于WEB的学生综合测评管理系统
  7. 借宝地一用,望多多包涵!
  8. SQLSTATE到底是什么意思
  9. 【计算机网络】常见加密方式
  10. 【Docker 完整版教程笔记】