經過每條邊至少一次並且回到原點,我們可以想到尤拉迴路。發現尤拉迴路的特點是每個點度數為偶數,然後我們的目標就是把度數奇數的那些點通過新增一些長度盡量小的邊變成度數為偶數。
新增哪些邊呢?不難想到是最小生成樹上的邊,那我們先新增成最小生成樹,其實就是每條邊可以選/不選,每個點的要求被選的相鄰邊是奇數/偶數。最小化權值,自底向上dfs一遍就好了
#include
#include
#define ll long long
using namespace std;
const int n=500010;
int tot,nxt[n*2],point[n],fa[n],v[n*2],x[n],y[n],c[n*2],du[n];
const int mod=1e9+7;ll ans;
ll ksm(ll a,ll k)
void addline(int
x,int
y,int vv)
bool dfs(int
x,int fa)
if (du[x]%2)
else
return0;}
int find(int
x)int main()
for (int i=1;i<=n;i++) fa[i]=i;int id=0;
for (int i=1;i<=m;i++)
}ans=(ksm(2,m+1)-2+mod)%mod;
dfs(1,0);
printf("%lld",ans);
}
打表20pts
我們可以對這個矩陣做乙個轉化(i,j)->(i-j,j)
然後乙個位置上的數字就必須在他上面&左邊的數字都取了之後才能取
這個模型其實就是楊氏矩陣
楊氏矩陣,乙個數字比右邊的下面的大,除非右邊下面沒有數字了
鉤子定理,用來求楊氏矩陣個數的演算法
鉤子長度:右邊元素個數+下邊元素個數+1
鉤子公式:對於給定形狀,不同的楊氏矩陣的個數為(n!/(每個格仔的鉤子長度的積))。
然後直接算答案就行了。你每次給格仔染色,轉化矩陣肯定t,那麼我們可以預處理矩陣
這種兩個人玩遊戲而且答案是數字,乙個人要求最大值乙個人要最小值的基本是對抗搜尋了。
然後對抗搜尋有40pts。
f[i][0/1]第i個數是正面/反面第乙個人可以得到的權值,那麼對於第二個人來說,要選擇f[i+1]最小的,對於第乙個人來說,要選擇f[i+1]最大的。那麼對於第二個人來說,如果他選擇左邊的,第乙個人將會失去a[i]這個權值。
40pts
#include
#include
#define ll long long
using
namespace
std;
const
int n=2005;
ll a[n],f[n][2];int n;
ll calc()
else
return f[1][0];
}int main()
}
2018SD省隊集訓R2 D2
我們並不需要知道相對應位置的數字是不是相等,只要置換之後的hash值相等就行了。hash 函式本身相當於每個位置乘上 x 的若干次方,置換之後只要改變次方的順序就好了。具體來說,設我們的base值是m,一段區間的hash值是 n i 0s i mi i 0nsi mi,然後乙個置換的hash值是 n...
2018SD省隊集訓R2 D6
這是一道簽到題 考慮入度出度平衡的狀態,我們先把所有的邊減成0,然後考慮對於一條有向邊x y,如果有c個,那麼可以連權值為 w,流量為c的,還要連權值是w,流量為inf的,我們從1跑到n的時候,考慮什麼時候dis t 0的時候就結束了,再走下去不會更優 include include include...
5 29 SD省隊培訓D1
自閉的一天 先咕一咕 兩天之內一定補上 繼續咕 一星期之內補上 四十分做法 首先,我們發現同乙個點加兩條額外邊是一件非常蠢的事,然後同時,加額外邊也同時意味著講這兩個點在樹上的路徑長度用當前權值代替.那麼題目就轉化成了對與每個 k in 0,m 求出樹上的邊不相交 因為上面說了,相交是一件很蠢的事 ...