不是在為這次比賽找藉口。。。我真的想吐嘈一下這道題。。。
尼嘛!明明是狀態dp!非得搞得資料隨便貪心都能過!!!過你妹啊!埋頭想dp的時候,大約開始十幾分鐘,重新整理了一下。我了個去!快上百了!純屬噁心人嗎?! 吐嘈完畢 -_-!
狀態dp:1 <= n <= 20,最多20位,完全可以位壓縮。預處理一下hp_sum[i] (i = 010111...101),表示i的二進位制中所有為1的位置,他們的hp之和。 f[i] (i = 010111...101)表示i的二進位制中所有為1的位置被乾掉話費的最小代價
f[ i|(1<< j) ] = max(f[ i|(1<< j) ], f[i] + hp_sum[ i|(1對資料用數狀陣列預處理,當時根本就沒有任何思路。。。任何思路。。。賽後各種水過。。。居然可以蹭資料。。。。列舉出來乙個約數,去你妹的!
大概過程是對x,y進行離散話,然後按離散化以後的值作為位置,原值作為value加到數狀陣列裡邊。
統計到x時,比x小的數的和為sumx,個數為numx,所以時間為x*numx - sumx。同樣,比mx大的數也能統計出來(總數減掉sumx)
同理對y的在數狀陣列,也可以得到sumy, numy...
用到四顆數狀陣列:分別用來計算 sumx, numx, sumy, numy。
view code
#include #include各種蹭資料,真的好無聊。。。標程沒看懂#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define cl(arr, val) memset(arr, val, sizeof(arr))
#define rep(i, n) for((i) = 0; (i) < (n); ++(i))
#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))
#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))
#define l(x) (x) << 1
#define r(x) (x) << 1 | 1
#define mid(l, r) (l + r) >> 1
#define min(x, y) x < y ? x : y
#define max(x, y) x < y ? y : x
#define e(x) (1 << (x))
#define iabs(x) ((x) > 0 ? (x) : -(x))typedef
long
long
ll;const
int eps = 1e-8
;const ll inf =1e15;
using
namespace
std;
const
int n = 100010
;struct
node p[n];
ll cx[n], cy[n];
ll nx[n], ny[n];
inttx[n], ty[n], n;
int lowbit(int
i) void add(ll c, int
i, ll val)
}ll sum(ll c,
inti)
return
ret;
}int findx(int
x)
return -1;}
int findy(int
x)
return -1;}
void
init()
intmain()
sort(tx + 1, tx + n + 1
); sort(ty + 1, ty + n + 1
);
for(i = 1; i <= n; ++i)
//printf("tolx = %lld, toly = %lld\n",tolx,toly);
for(i = 1; i <= n; ++i)
cout
<< ans <
}return0;
}
找所有x的中點,所有y的中點,按到中點的距離排序。。。列舉前100個點。這都能蹭過去。。。。
對於這題我只能說我是弱b。。。kruskal改動一下,按邊權從大到小排序。。。。並查集維護,要刪除的兩個點不能在乙個集合裡邊。。。
view code
constbfs 爆搞的,記錄每個節點的最大剩餘電量,防止有環的時候死迴圈int n = 100010
;int
parent[n];
struct
node p[n];
intn, k;
bool
del[n];
bool
cmp(node a, node b)
int find(int
x)
while(k !=r)
returnr;}
ll solve()
parent[y] =x;
if(del[y]) del[x] = true
;
if(del[x]) del[y] = true
; }
return
cnt;
}void
init()
intmain()
for(i = 0; i < k; ++i)
sort(p, p + n - 1
, cmp);
cout
<< solve() <
}return0;
}
view code
constint n = 2500010
;const
int m = 50010
;struct
node g[n];
inthead[m], t;
double
val[m];
void
init()
void add(int u, int v, double
w) void bfs(int s, double
m) }
}}int
main()
val[i] = -1
; }
scanf(
"%d%d%lf
", &i, &x, &y);
bfs(i, y);
if(val[i] == -1) puts("
impossible!");
else printf("
%.2f\n
", y -val[x]);
}return0;
}
2016多校聯合第二場
1002 樹上每個點都有乙個點權w w 2 16 點數n 2 16 已知dp方程 dp i max 將w分成前8位和後8位,設w i 前8位和後8位為x和y,w j 前8位和後8位為a和b,如圖所示 前8位 後8位 w i x y w j a b 方程形式變為 dp i max 維護ds a y m...
多校第二場 E MAZE
首先,這題的列數非常的小,很像矩陣快速冪加速dp。這題實際上也是維護了一段區間矩陣乘積的結果。查詢 o 1 修改 o logn k 3 這裡有乙個需要注意的點是左乘和右乘的區別。矩陣快速冪還是 1,n n,n 這種形式比較好。include define lc l,mid,x 1 define rc...
HDU 6313 2018多校第二場hack it
10000 10000 10000 10000 10000 10000 01000 00100 00010 00001 10000 00100 00001 01000 00010 10000 00010 01000 00001 00100 10000 00001 00010 00100 01000 ...