這個題目現場賽的時候沒過,想得過於簡單了。
主要條件如下
(a) |ai| < t for all i and
(b) (vi, vj) in e <=> |ai-aj| >= t,
首先,如過存在邊,那麼ai和aj必然一正一負。所以第一步就是黑白染色。
之後不妨假設黑色的為正,白色為負,此時條件b中的絕對值號就可以去掉了。對於一堆的大於等於的約束,可以使用差分約束的方法來做。
對於其中的小於t的約束,變成小於等於t-1。如果spfa的時候使用整數的話,此處的t設為乙個300+的數字即可。
不擅長圖論,**略長……
#include #include #include #include using namespace std;
const int intmax=0x3f3f3f3f;//notes:intmax
#define mem(a, val) memset(a, val, sizeof(a))//memset(
const int n = 310;
const int t = n;
int mat[n][n];
int mark[n];
int col[n];
int cas, n;
void fun(int i, int c)}}
}return true;
}bool judge(int n)
mem(dd, 0x3f);
int a, b;
for (int i=0; i}
}for (int i=0; i}
return spfa(n);
}int main()
if (judge(n))else
}return 0;
}
2013通化邀請賽H題
這題真無語,比賽時不會做,想了一場貪心演算法,沒想到是個區間dp,白刷了那麼多dp!比完賽回來,聽說是個區間dp,終於把題a了,但 寫得很搓,也不太好理解。後來發現這題竟然是白書上的例題!真是哭了 發現白書上記憶化搜尋的寫法很優雅,也比較好理解,就寫乙個吧。才50行的 dp a b c d 表示區間...
2013 吉林通化邀請賽 Tutor 有點坑的水題
計算12個數的和的平均數。四捨五入,不能有後導0。我的做法是,將答案算出後,乘以1000,然後看個位是否大於等於5,判斷是否要進製 include include include include includeusing namespace std define eps 1e 2 int main ...
湘潭邀請賽A
哥德 猜想 任一大於2的偶數,都可表示成兩個素數之和。是世界上最著名的未解問題之一,但是下面的反哥德 猜想 任一大於11的奇數,都可表示成兩個合數之和。確很容易證明。定義反哥德 分拆數g n 表示將大於11的奇數n分解為兩個合數之和的方案數。再定義sg n sum 即所有不大於n的奇數的反哥德 分拆...