酷站百分百,精准软件,wordpress审计,wordpress 标签拼音解析
二分的单调性较为明显#xff0c;一路推导下去的性质都不算太难想#xff0c;正解的思路还是不难想到的 但从头到尾都实现很考验思维的严密性和代码能力 然后我就双重被考验挂了qwq 第一交的时候一个地方把倍增的dis数组写成pl#xff0c;判断封口也有问题… 但竟然有…解析
二分的单调性较为明显一路推导下去的性质都不算太难想正解的思路还是不难想到的 但从头到尾都实现很考验思维的严密性和代码能力 然后我就双重被考验挂了qwq 第一交的时候一个地方把倍增的dis数组写成pl判断封口也有问题… 但竟然有70 真实考试的时候绝对不能出打错数组这种错提交前还是要谨慎一些 另外那个判封口…只能说路漫漫其修远兮了…
我对于最后根下方儿子暂且叫它次根好了与军队贪心匹配的地方写的和题解不太一样
题解的实现是爬到根下方的军队不考虑然后把所有军队提出来一起贪心
我的做法是先给有军队的次根一个剩余最少的军队再维护一个堆看是否需要用外面的军队把里面的军队替换出来
这两个实现我觉得差不多吧谈不上孰优孰劣
然而我就写挂了qwq
代码
#includebits/stdc.h
using namespace std;
#define ll long long
const int N1e5100;
ll read() {ll x0,f1;char cgetchar();while(!isdigit(c)) {if(c-)f-1;cgetchar();}while(isdigit(c)) {xx*10(c^48);cgetchar();}return x*f;
}int n,m;
int x[N];
struct node{int to,nxt,w;
}p[N1];
int fi[N],ecnt;
inline void addline(int x,int y,int w){p[ecnt](node){y,fi[x],w};fi[x]ecnt;return;
}
ll dis[N][20];
int pl[N][20];
int que[N],num,jd[N];
void dfs(int x,int f){for(int k1;k16;k){pl[x][k]pl[pl[x][k-1]][k-1];dis[x][k]dis[x][k-1]dis[pl[x][k-1]][k-1];}jd[x]1;for(int ifi[x];~i;ip[i].nxt){int top[i].to;if(tof) continue;jd[x]0;if(x1) que[num]to;pl[to][0]x;dis[to][0]p[i].w;dfs(to,x);}//printf(x%d jd%d\n,x,jd[x]);return;
}bool vis[N],tag[N];
vectorllv[N];
int solve(int x,int f){//printf(solve:x%d vis%d jd%d\n,x,vis[x],jd[x]);if(vis[x]) return tag[x]1;if(jd[x]) return tag[x]0;tag[x]1;for(int ifi[x];~i;ip[i].nxt){int top[i].to;if(tof) continue;tag[x]solve(to,x);}//printf(x%d tag%d\n,x,tag[x]);return tag[x];
}
ll w[N],cnt,add[N],o;
priority_queuellq;
struct aaa{ll ned,val;bool operator (const aaa oth)const{return nedoth.ned;}
}a[N];;
int numa;
bool cmp(ll a,ll b){return ab;}
void init(){memset(vis,0,sizeof(vis));memset(tag,0,sizeof(tag));for(int i1;inum;i){v[que[i]].clear();v[que[i]].shrink_to_fit();}cntonuma0;while(!q.empty()) q.pop();
}
bool check(ll tot){init();for(int o1;om;o){int posx[o];ll lfttot;for(int k16;k0;k--){if(dis[pos][k]lft||pl[pos][k]0||pl[pos][k]1) continue;lft-dis[pos][k];pospl[pos][k];} //printf(pos%d lft%lld\n,pos,lft);if(pl[pos][0]1){v[pos].push_back(lft);}else vis[pos]1;}if(solve(1,0)) return true;for(int i1;inum;i){int nowque[i];if(v[now].size()0!tag[now]){w[cnt]dis[now][0];continue;}sort(v[now].begin(),v[now].end());if(!tag[now]){if(v[now][0]-dis[now][0]0){//printf(now%d v%lld dis%lld\n,now,v[now][0],dis[now][0]);a[numa](aaa){dis[now][0],v[now][0]-dis[now][0]};}for(int j1,tpv[now].size();jtp;j){if(v[now][j]dis[now][0]) add[o]v[now][j]-dis[now][0];}}else{for(int j0,tpv[now].size();jtp;j){if(v[now][j]dis[now][0]) add[o]v[now][j]-dis[now][0];}}}if(ocnt) return false;sort(a1,a1numa);sort(add1,add1o);sort(w1,w1cnt,cmp);//printf(w: );for(int i1;icnt;i) printf(%lld ,w[i]);putchar(\n);//printf(add: );for(int i1;io;i) printf(%lld ,add[i]);putchar(\n);//printf(aaa: );for(int i1;inuma;i) printf((%lld %lld) ,a[i].ned,a[i].val);putchar(\n);int pos0;for(int k1;ko;k){while(posnumaadd[k]a[pos1].ned){pos;q.push(a[pos].val);}if(q.empty()) continue;ll nowq.top();q.pop();if(add[k]now) swap(add[k],now);q.push(now);}sort(add1,add1o,cmp);//printf(add: );for(int i1;io;i) printf(%lld ,add[i]);putchar(\n);for(int i1;icnt;i){if(w[i]add[i]) return false;}return true;
}int main() {
#ifndef ONLINE_JUDGE//freopen(a.in,r,stdin);//freopen(a.out,w,stdout);
#endifmemset(fi,-1,sizeof(fi));ecnt-1;nread();for(int i1;in;i){int xread(),yread(),wread();addline(x,y,w);addline(y,x,w);}mread();for(int i1;im;i) x[i]read();dfs(1,0);//printf(check%d\n,check(8));//return 0;ll st0,ed1e14;while(sted){ll mid(sted)1;if(check(mid)) edmid;else stmid1;}printf(%lld\n,st1e14?st:-1);return 0;
}
/*
4
1 2 10
1 3 1
4 1 5
3
3 4 4
*/