f(x)组合

推箱子小游戏

这一生的挚爱 提交于 2020-01-20 13:16:12
//K.h #pragma once class K { //抽象化机器人K //地图大小 #define cx 10 #define cy 10 #define wall1 0xA8 //▓占2个字节 WINDOWS下 #define wall2 0x88 // //为K定义方向,方向符号请无视。 public: enum FX { y = '>', //朝右Y z = '<', //左 -Y s = '^', //上 -X x = 'V' //下 X }; protected: int map[cx][cy]; //0 代表平地可活动; //1 表示墙 //2 表示箱子 //3 箱子的归属 int bakmap[cx][cy]; //做一个备用地图 int ix,iy; //机器人现在的坐标(iy行,第ix列) int fx; //机器人现在的方向 private: void gotoxy(int x,int y){ //移动当前的IX,IY的坐标 ix=x; iy=y; showmap(); } public: K(int tx,int ty,int ifx){ //类构造函数 loadmap(); //机器人K的初使化位置与方向 ix=tx; iy=ty; fx=ifx; showmap(); } void setfx(int sfx){ //设置机器人朝向 fx=sfx;

Codeforces 1247E. Rock Is Push

▼魔方 西西 提交于 2019-12-02 14:16:46
传送门 显然考虑 $dp$ ,设 $fx[i][j]$ 表示从 $(i,j)$ 出发往下走一格,最终到达 $(n,m)$ 的方案数,$fy[i][j]$ 表示从 $(i,j)$ 出发往右走一格,最终到达 $(n,m)$ 的方案数 如果 $(i,j)$ 本身有石头就把这个石头忽略 那么对于 $fx[i][j]$ ,如果 $(i+1,j)$ 没有石头,转移为 $fx[i][j]=fx[i+1][j]+fy[i+1][j]$ 如果 $(i+1,j)$ 有石头,因为 $fx[i+1][j]$ 没有算到本身的石头,所以方案中多出了一类往下走到 $(x,y)$ 再往右的方案 但是因为这个石头的存在,我们最多只能走到 $(x-1,y)$ ,那么方案便多出了 $fy[x][y]$ ,再减去即可,显然 $x,y$ 可以通过预处理每列的前缀石头数得到 然后对于 $fy$ 也差不多转移,所以就做完了 记得特判 $(n,m)=(1,1)$ 的情况 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(

BZOJ 4025: 二分图

岁酱吖の 提交于 2019-11-26 23:32:26
4025: 二分图 思路: 考虑按时间分治,然后把每条边按影响时间加入相应的区间(类似划分树)。然后考虑把包含每个叶子节点的边连起来,并判断有没有奇环。 由于分治时需要撤回某些并查集的合并操作,所以需要用到可撤销并查集。然后因为要判基环,所以又需要维护每个点到父亲节点的距离 \(dp[i]\) , 所以需要用到带权并查集。 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc++.h> using namespace std; #define y1 y11 #define fi first #define se second #define pi acos(-1.0) #define LL long long #define mp make_pair #define pb push_back #define ls rt<<1, l, m #define rs rt<<1|1, m+1, r #define ULL unsigned LL #define pll pair<LL, LL> #define pli pair<LL, int> #define pii pair<int, int> #define piii pair<pii, int>