疫情控制 blockade

2021-08-09 16:44:22 字數 3010 閱讀 9247

分析:

首先所有點肯定都是盡可能往上走為先。

然後因為直接處理感覺很麻煩,這裡考慮二分來。二分時間,然後就變成了判定的問題了。

那麼點被分為兩類,一種是可以走到根節點還有剩餘的,一種是走不到的。

可以發現走不到的話 就盡可能往上走。然後停在盡可能上面。

然後走到根節點還有剩餘的時間的,就往一些第二層節點走(因為不能在根節點上堵)

首先先把所有點往上走,分成兩類。對於走不到的直接堵上。

然後跑一邊dfs求出哪些第二層子樹裡的葉子節點沒有堵上。

然後考慮這些能跑到根節點的怎麼去堵第二層的點。

對於每個都有兩種選擇,停在從**來的。或者去堵另外乙個點。

貪心。直接跳

#include

#define pb push_back

#define pll pair

#define mp make_pair

#define a first

#define b second

#define ll long long

#define m 50005

using namespace std;

void read(int &x)

int id[m],n,m,fa[m],xx[m];

ll d[m];

vector< pll >e[m];

bool can[m];

void dfs(int f,int

x)void dfs1(int f,int

x) if (!can[x])can[x]=flag;

}pll q[m],p[m];

bool cmp(pll a,pll b)

bool used[m];

bool ch(ll tim)

if (x==1)q[++cnt]=mp(t,last);

else can[x]=0;

}dfs1(0,1);

if (!can[1])return

1; sort(q+1,q+cnt+1,cmp);

for (i=0; i1].size(); i++)if (can[e[1][i].a])p[++num]=mp(e[1][i].b,e[1][i].a);

sort(p+1,p+num+1,cmp);

for (i=1; i<=cnt; i++)

memset(used,0,sizeof(used));

for (i=1,j=1; i<=num; i++)

for (; (used[j]||q[j].aif (j>cnt)return

0; can[p[i].b]=0;

used[j]=1;

}dfs1(0,1);

return (!can[1]);

}int main()

res=0;

read(m);

for (i=1; i<=m; i++)read(xx[i]);

dfs(0,1);

for (; l<=r; )

printf("%lld\n",res);

return

0;}

倍增

#include

#define pb push_back

#define pll pair

#define mp make_pair

#define a first

#define b second

#define ll long long

#define m 50005

using namespace std;

void read(int &x)

int id[m],n,m,xx[m];

ll d[m][16],fa[m][16];

vector< pll >e[m];

bool can[m];

void dfs(int f,int

x)void dfs1(int f,int

x) if (!can[x])can[x]=flag;

}pll q[m],p[m];

bool cmp(pll a,pll b)

bool used[m];

bool ch(ll tim)

if (fa[x][0]==1&&d[x][0]<=t)q[++cnt]=mp(t-d[x][0],x);

else can[x]=0;

}dfs1(0,1);

if (!can[1])return

1; sort(q+1,q+cnt+1,cmp);

for (i=0; i1].size(); i++)if (can[e[1][i].a])p[++num]=mp(e[1][i].b,e[1][i].a);

sort(p+1,p+num+1,cmp);

for (i=1; i<=cnt; i++)

memset(used,0,sizeof(used));

for (i=1,j=1; i<=num; i++)

for (; (used[j]||q[j].aif (j>cnt)return

0; can[p[i].b]=0;

used[j]=1;

}dfs1(0,1);

return (!can[1]);

}int main()

res=0;

read(m);

for (i=1; i<=m; i++)read(xx[i]);

dfs(0,1); fa[1][0]=1;

int k;

for (k=1; k<16; k++)

}for (; l<=r; )

printf("%lld\n",res);

return

0;}

按理來說倍增應該要比直接跳要快但是這邊卻比直接跳慢。不知道是不是寫錯了或者別的什麼。於是把兩個都貼上來了。

Problem E E 疫情控制

time limit 3 sec memory limit 128 mb submit 6 solved 4 submit status web board 據某省水產部門通報,a市大面積範圍水產養殖區爆發adh氏菌疫情,導致大量魚苗死亡,養殖戶經濟損失巨大。必須盡快控制疫情,使水產養殖秩序回歸正常...

NOIP 2015 疫情控制

評測傳送 二分答案 貪心。越往上越優,所以在列舉的範圍內,能往上就往上。細節處理很重要。我的 有一處是待優化的,調了一下午,身心俱疲,不想再寫了。就這樣吧 95分。include include include include include include define ll long long ...

Luogu P1084 疫情控制

luogu p1084 疫情控制 再水篇部落格 2019.8.28 騙 1分未遂 打了個二分不會check 勸退 2019.9.29 乙個月了啊 怎麼說都要打下來 這個題解好哇 注釋了一些在 裡 include include include using namespace std define l...