分析:
首先所有點肯定都是盡可能往上走為先。
然後因為直接處理感覺很麻煩,這裡考慮二分來。二分時間,然後就變成了判定的問題了。
那麼點被分為兩類,一種是可以走到根節點還有剩餘的,一種是走不到的。
可以發現走不到的話 就盡可能往上走。然後停在盡可能上面。
然後走到根節點還有剩餘的時間的,就往一些第二層節點走(因為不能在根節點上堵)
首先先把所有點往上走,分成兩類。對於走不到的直接堵上。
然後跑一邊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...