這題給乙個n*n的正方形塗色,使之成為又中心對稱又軸對稱的圖形。
給出了m點已經塗色,會告訴你他們的座標。 再告訴你用k種顏色塗。
不考慮已經塗色的情況:
這題是一圈一圈地考慮,對於每個圈,只考慮一條邊的一半,即(n + 1) >> 1; 對於每一圈都如此。 那麼總的可以由k種顏色中任意塗的個數total是1 + 2 + 3 + …… + (1 + n) >> 1;
考慮已經塗色的:
那麼就在total裡面減去已經塗色的。
重點在於去重。
對於每一圈來說,將應該塗相同顏色的位置對映到乙個位置。
對於map,我只能說無能為力。 比如,先插入(1,2)、再插入(1,3)。 對於map.insert( make_pair(x,y) ), 人家輸出的是(1,2)。也就是他插不進去(1,3); 對於map[x] = y, 人家輸出的是(1,3)。也就是他把原來給覆蓋了。
所以這裡用的是手動版。
還有乙個地方不解的是,對於去重,離中心點相同距離的點應該都為同一種顏色。所以,我將m個座標離中心點的距離放在乙個為double型的陣列裡面,wa了。不解。
以下是ac**:
#include #include #include #include #include #include #include #include #include #include #include #include #define f(x) ((x)>nn?n-(x)+1:(x));
using namespace std;
const __int64 m=100000007;
typedef __int64 ll;
long long fun(long long a,long long n,long long p)
return ret;
}struct loca
}point[2100];
int main()
sort(point,point + sub);
if(m)
else t = 0;
t = (nn + 1) * nn / 2 - t;
printf("%i64d\n",fun(k,t,m));
}return 0;
}
leetcode436 尋找右區間
給定一組區間,對於每乙個區間 i,檢查是否存在乙個區間 j,它的起始點大於或等於區間 i 的終點,這可以稱為 j 在 i 的 右側 對於任何區間,你需要儲存的滿足條件的區間 j 的最小索引,這意味著區間 j 有最小的起始點可以使其成為 右側 區間。如果區間 j 不存在,則將區間 i 儲存為 1。最後...
leetcode 436 尋找右區間
給定一組區間,對於每乙個區間 i,檢查是否存在乙個區間 j,它的起始點大於或等於區間 i 的終點,這可以稱為 j 在 i 的 右側 對於任何區間,你需要儲存的滿足條件的區間 j 的最小索引,這意味著區間 j 有最小的起始點可以使其成為 右側 區間。如果區間 j 不存在,則將區間 i 儲存為 1。最後...
Leetcode 436 尋找右區間
給定一組區間,對於每乙個區間 i,檢查是否存在乙個區間 j,它的起始點大於或等於區間 i 的終點,這可以稱為 j 在 i 的 右側 對於任何區間,你需要儲存的滿足條件的區間 j 的最小索引,這意味著區間 j 有最小的起始點可以使其成為 右側 區間。如果區間 j 不存在,則將區間 i 儲存為 1。最後...