#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...