給出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 ...