E MAZE 2019牛客暑期多校訓練營(第二場)

2022-09-03 00:48:19 字數 1542 閱讀 9944

給出n行m列的迷宮0可走1不可走,有兩個操作,操作1變換點(a,b)的值,操作2查詢(1,a)到(n,b)的方案數

設\(f[i][j]\)為第i-1行到達第i行第j列的方案數,若點\((i,j)\)上下為0的可延伸範圍為\((l,r)\),則\(f[i][j] = \sum_^r f[i-1][k]\)

由這個式子就可以構造出第i-1行到第i行方案數的轉移矩陣,用線段樹維護一下區間矩陣乘積

#include #include #include #include #include using namespace std;

typedef long long ll;

const int mx = 5e4+5;

const int mod = 1e9+7;

char mp[mx][12];

int n, m, q;

struct matrix

matrix(int op)

matrix operator * (matrix other) const}}

return tmp;

}}mat[mx<<2];

void pushup(int rt)

void initdata(int pos, int rt)

for (int j = i; j >= 1 && mp[pos][j] == '0'; j--)

}}void build(int l, int r, int rt)

int mid = (l + r) / 2;

build(l, mid, rt<<1);

build(mid+1, r, rt<<1|1);

pushup(rt);

}void update(int pos, int l, int r, int rt)

int mid = (l + r) / 2;

if (pos <= mid) update(pos, l, mid, rt<<1);

else update(pos, mid+1, r, rt<<1|1);

pushup(rt);

}int main() else ;

for (int i = a; i <= m && mp[1][i] == '0'; i++) s[i] = 1;

for (int i = a; i >= 1 && mp[1][i] == '0'; i--) s[i] = 1;

ll res = 0;

for (int i = 1; i <= m; i++)

printf("%lld\n", res);}}

return 0;

}

2019牛客暑期ACM集訓多校第三場

1.emmmm,牛客這場多校題目還是挺平和的,但是,由於隊伍狀態不是很好 玄學卡常所以沒打好。2.首先上來時字串,這個之前寫過最長的相等01串,子串行就是01出現的次數取個最小值的2倍。然後隨便寫寫ac了。用的是dp寫的,看了其他大佬把1看作1,0看作 1,然後計算字首和也挺好的。3.然後是h,由於...

2019牛客暑期多校訓練1

equivalent prefixes 這個是乙個用單調棧的題目,至於為什麼可以用單調棧?把兩個陣列同時跑單調棧,如果每次進棧最多乙個,當然在這個進棧之前肯定會有數出棧,如果存在乙個數進棧了,然後這個時候判斷一下進棧的這個數的位置是不是相同,如果不相同就說明肯定是不對的。為什麼說這個時候只要考慮這個...

2019牛客多校第九場

由題意可設x y kp bx y kp b x y kp b代入第二個式子中可以得到kpx bx x2 c mod kpx bx x 2 equiv c mod kpx bx x2 c modp p p 第一項是p的倍數可以約掉,所以有x2 bx c 0 m od x 2 bx c equiv 0 ...