首先,這題的列數非常的小,很像矩陣快速冪加速dp。這題實際上也是維護了一段區間矩陣乘積的結果。
查詢 o(1) 修改 o( logn * k^3 )
這裡有乙個需要注意的點是左乘和右乘的區別。矩陣快速冪還是 (1,n) *( n,n )這種形式比較好。
#include #define lc l,mid,x<<1
#define rc mid+1,r,x<<1|1
using namespace std;
typedef long long ll;
typedef int lint;
const lint mod = 1000000007;
const int maxn = 50005;
ll mul( ll a,ll b )
ll ad( ll a,ll b )
struct matrix}}
return c;
}};matrix tree[4*maxn];
int m,b[maxn][11];
matrix calc( int l )
f = 1;
for( int j = i;j >= 1;j-- )
}return c;
}void push_up( int x )
void build( int l,int r,int x )
int mid = l+r >>1;
build(lc);
build(rc);
push_up(x);
}void update( int left,int right,const matrix& v,int l,int r,int x )
int mid = l+r>>1;
if( left <= mid )
if( right > mid )
push_up(x);
}matrix fi;
int main()
}build( 1,n,1 );
for( int i = 1;i <= q;i++ )else
fi.ma[1][x] = 1;
matrix c = fi * tree[1];
int ans = c.ma[1][y];
printf("%d\n",ans);}}
return 0;
}
2016多校聯合第二場
1002 樹上每個點都有乙個點權w w 2 16 點數n 2 16 已知dp方程 dp i max 將w分成前8位和後8位,設w i 前8位和後8位為x和y,w j 前8位和後8位為a和b,如圖所示 前8位 後8位 w i x y w j a b 方程形式變為 dp i max 維護ds a y m...
HDU 多校聯合第二場
不是在為這次比賽找藉口。我真的想吐嘈一下這道題。尼嘛!明明是狀態dp!非得搞得資料隨便貪心都能過!過你妹啊!埋頭想dp的時候,大約開始十幾分鐘,重新整理了一下。我了個去!快上百了!純屬噁心人嗎?吐嘈完畢 狀態dp 1 n 20,最多20位,完全可以位壓縮。預處理一下hp sum i i 010111...
牛客多校第二場 J farm
輸入描述 the first line of input contains 3 integers n,m,t n m 1000000,t 1000000 for the next n lines,each line contains m integers in range 1,n m denotin...