杭電多校第一場補題

2021-09-25 12:05:49 字數 2230 閱讀 2566

#include #include #include #include #include #include #include #include #define int long long

using namespace std;

const int maxn=1e4+10;

const int inf=0x3f3f3f3f3f3f3f3f;

struct edge

};struct heapnode

bool operator < (const heapnode &rhs)const

};struct dijkstra

void init(int n)}}

return vis[t];

}//沿著層次圖增廣

int dfs(int x,int a)

}return flow;

}int maxflow(int s,int t)

return flow;

}};dinic dinic;

int n,m;

signed main()

if(!dij.dijkstra(1,n))

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

這 4

個數字最後一次出現的位置,

排序後為

i, j, k, t

(i < j < k < t

) 的方案數目,則按照第

t + 1

位的數字的四種選擇,可以得

到四種轉移。

對於限制可以按照限制區間的右端點分類,求出 dp[

i][j][

k][t]

後,找到所有以

t 為區間

右端點的限制條件,如果當前狀態不滿足所有限制條件則不合法,不再向後轉移。

總時間複雜度 o(n^4)

滾動一維,空間複雜度 o

(n^3)

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

typedef long long ll;

typedef pairpiir;

const int n = 100 + 5;

int n, m, ans;

int dp[2][n][n][n];

vector lims[n];

inline void mod(int &x)

int main()

dp[0][0][0][0] = 1;

//n的資料範圍是1-n,按順序遍歷結尾

for (i = p = 1; i <= n; i ++, p ^= 1)

for (j = 0; j < i; j ++)

for (k = 0; k <= j; k ++)

for (t = 0; t <= k; t ++)

for (piir tmp : lims[i])

//放在r的位置上肯定合法,只需判斷從l到r-1是否合法

if (1 + (j >= tmp.first) + (k >= tmp.first) + (t >= tmp.first) != tmp.second)

dp[p][j][k][t] = 0;

}for (i = 0, p = n & 1; i < n; i ++)

for (j = 0; j <= i; j ++)

for (k = 0; k <= j; k ++)

mod(ans += dp[p][i][j][k]);

printf("%d\n", ans);

}return 0;

}

mod(dp[p][j][k][t] += dp[p ^ 1][j][k][t]);

mod(dp[p][i - 1][k][t] += dp[p ^ 1][j][k][t]);

mod(dp[p][i - 1][j][t] += dp[p ^ 1][j][k][t]);

mod(dp[p][i - 1][j][k] += dp[p ^ 1][j][k][t]);

1.當前選擇的數與上乙個相同,那麼上乙個狀態會被當前狀態覆蓋,不記錄,直接轉移

2.當前選擇的數的上乙個為j,那麼j此時不需要記錄,而上乙個狀態則需要記錄,所以要加上dp[p^1][j][k][t];

​​​​​​​

2019杭電多校第一場

dp i j k t dp i j k t dp i j k t 表示0 1 2,3 0,1,2,3 0,1,2,3出現的位置排序後為i,j k,t i,j,k,t i,j,k,t的方案數 列舉第t 1 t 1t 1位的情況進行轉移 對於限制情況,固定右端點,暴力列舉所有狀態,把所有非法狀態清零 i...

2019 杭電多校(第一場)

題目 1002 operation 線性基 題意給你n個數 兩個操作,查詢l r區間異或最大值 在陣列最後麵加一數 思路維護兩個陣列 1 b i j 儲存a 1 到a i 之間的第j位線性基。2 pos i j 儲存最大的l a l 使得b i j 有值。對於每一次詢問 l,r 如果pos r j ...

2019杭電多校第一場

從右到左分別為0 n輛車,每輛車有長度l,起始位置s和速度v,0座標在左邊,不能超車,單車道,問0號車到達0座標的最短時間。最短時間考慮二分時間,然後按這個時間從左邊第一輛車開始依次計算最終位置,最後判斷0號車的位置即可。include using namespace std const int n...