原題:
題意:
有m個方塊,每個有座標(x,
y)
(x,y)
(x,y
),值從0到m-1,這個方塊是穩定的當且僅當(x−
1,y−
1)(x
,y−1
)(x+
1,y−
1)
(x-1,y-1)(x,y-1)(x+1,y-1)
(x−1,y
−1)(
x,y−
1)(x
+1,y
−1)存在方塊或者y為0,初始時穩定。
你和對手輪流乙個乙個抽出所有方塊,這個序列對應的m進製數就是答案,你要答案大,對手要答案小,問最後的答案。
解析:
由於進製的關係,所以一定是貪心。那麼先用map預處理出每個方塊的上下6個方向是否有方塊,然後用陣列代替map進行搜尋即可。
#include
using
namespace std;
#define ll long long
const
int maxn=
1e5+5;
const ll mod=
1e9+9;
int x[maxn]
,y[maxn]
;bool vis[maxn]
;int n;
set<
int>s;
vector<
int>ans;
unordered_mapint>id;
inline ll key
(int a,
int b)
int arr[maxn][6
];void
init()
}inline
bool
can(
int i)}if
(!vis[arr[i][0
]])}
if(!vis[arr[i][2
]])}
return1;
}void
used
(int i)
void
era(
int i)if(
!vis[arr[p][5
]])}
p=arr[i][0
];if(
!vis[p])if
(!vis[arr[p][4
]])}
p=arr[i][2
];if(
!vis[p])if
(!vis[arr[p][5
]])}
}void
fin_new
(int i)
p=arr[i][3
];if(
!vis[p]
) p=arr[i][5
];if(
!vis[p])}
intmain()
init()
;for
(int i=
1;i<=n;i++
)while
(!s.
empty()
)}ll bas=
1,a=0;
for(
int i=ans.
size()
-1;i>=
0;i--
)printf
("%lld\n"
,a);
}
2200 專項 D 0 1 Tree(樹形dp)
原題 題意 給出一棵樹,每條邊有邊權0或1,現在要找出有序對的對數,滿足要求 x到y的路徑不能在遇到1後再遇到0。解析 顯然只有四種狀態 從上往下記錄為1 0 10 01,那麼用dp記錄每個點的子樹中,下面的點與之路徑為對應情況的點數。轉移 設d p p 0 0,dp p 1 1,d p p 10 ...
HDU 2200 Eddy s AC難題 數論
解析 1 可以從中任選m個人 n m 2 有cn m 中選擇 2 再把這m個人分2組 每個人都要分組 要使滿足最小ac數大於最大ac數,只需要在m個人中插板即可 例如 m個人假如分別為 1,2,3,4,m 1,m m個人的ac數從小到大排列 只需在任意位置插板就可分為符合要求的2組 1,2,3.t,...
樹狀陣列專項
poj 2352 此題一開始理解錯了乙個地方,而且一開始也沒很好的理解樹狀陣列,做了很長時間。其實此題的輸入是有規律的,即一直按照x,y遞增的規律。所以,判斷第i個輸入,只需要判斷 前i 1個元素中x的值,而不用考慮y,因為y一直是遞增輸入的。所以用乙個樹狀陣列來處理x即可。include incl...