牛客CSP-S提高组赛前集训营2
//不管了上线段树,咔咔咔
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 4e5 + 9; ll n,m,q,Max[N<<2],a[N],tag[N<<2],sum[N<<2];//M维护区间最大值 void pushup(int u) { sum[u] = sum[u << 1] + sum[u << 1 | 1]; Max[u] = max(Max[u << 1], Max[u << 1 | 1]); } void buildTree(int u, int ul, int ur) { if(ul == ur) { sum[u] = a[ul]; return; } int mid = (ul + ur) >> 1; buildTree(u << 1, ul, mid); buildTree(u << 1 | 1, mid + 1, ur); pushup(u); } void update(int u, int ul, int ur, int mx){ sum[u] += (long long)(ur - ul + 1) * mx; tag[u] += mx; Max[u] += mx; } void pushdown(int u, int ul, int ur){ if(tag[u]){ int mid = ul + ur >> 1; update(u << 1, ul, mid, tag[u]); update(u << 1 | 1, mid + 1, ur, tag[u]); tag[u] = 0; } } void modify(int u, int ul, int ur, int ml, int mr, int mx) { if(ul >= ml && ur <= mr) { sum[u] += mx * (ur - ul + 1); tag[u] += mx; Max[u] += mx; return; } pushdown(u, ul, ur); int mid = ur + ul >> 1; if(ml <= mid) modify(u << 1, ul, mid, ml, mr, mx); if(mid < mr) modify(u << 1 | 1, mid + 1, ur, ml, mr, mx); pushup(u); } int main () { scanf("%lld%lld%lld", &n, &m, &q); for(int i = 1; i <= n; i++) { scanf("%lld", &a[i]); modify(1, 1, n, i, i, a[i]); } ll ans = max(sum[1] / m + ((sum[1] % m) != 0), Max[1]); printf("%lld ", ans); while(q--){ ll id, x; scanf("%lld%lld", &id, &x); modify(1, 1, n, id, id, x - a[id]); a[id] = x; ans = max( (sum[1]/m) + ((sum[1]%m)!=0), Max[1]); printf("%lld ", ans); } return 0; }
//偷得哪位大佬的代码也忘掉了
#include<bits/stdc++.h> #define N 1000005 #define M 2000005 using namespace std; bool cur1; int n,m,K; int ans; int head[N],id; struct edge{ int to,nxt; }E[M<<1]; inline void add_edge(int a,int b){ E[++id]=(edge){b,head[a]}; head[a]=id; } inline void Rd(int &res){ char c;res=0; while(c=getchar(),c<48); do res=(res<<3)+(res<<1)+(c^48); while(c=getchar(),c>47); return; } bool mark[N]; int dep[N]; int que[N],cnt,sum; void dfs(int x,int f,int d){ dep[x]=d; mark[x]=1; for(int i=head[x];i;i=E[i].nxt){ int v=E[i].to; if(v==f)continue; if(!mark[v])dfs(v,x,d+1); else if(dep[v]<dep[x])que[++cnt]=dep[x]-dep[v],sum+=que[cnt]+1; } } void solve(){ int h=m-sum; if(K<=h){ ans+=K; return; } ans+=h; K-=h; sort(que+1,que+cnt+1); for(int i=cnt;i>=1&&K;i--){ K--; int h=que[i]; if(K<=h){ ans+=K; return; } ans+=h; K-=h; } } bool cur2; int main(){ Rd(n);Rd(m);Rd(K); for(int i=1,a,b;i<=m;i++){ Rd(a);Rd(b); add_edge(a,b); add_edge(b,a); } for(int i=1;i<=n;i++)if(!mark[i]){ dfs(i,0,1); ans++; } solve(); printf("%d ",ans); return 0; }
牛客CSP-S提高组赛前集训营3
1.货物收集
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+9;
int a[N],w[N],head[N];
struct edge{
int to,nxt,w;
}e[N<<1];
int n,W,tot;
void add(int u,int v,int p){
e[++tot].to=v;
e[tot].nxt=head[u];
e[tot].w=p;
head[u]=tot;
}
long long s;
void dfs(int u,int fa,int x){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,p=e[i].w;
if(v==fa) continue;
if(x>=p){
s+=a[v];
dfs(v,u,x);
}
}
}
bool check(int mid){
s=0;
dfs(1,0,w[mid]);
return s>=W;//
}
int main(){
scanf("%d%d",&n,&W);
for(int i=2;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n;i++){
int u,v,p;
scanf("%d%d%d",&u,&v,&p);
add(u,v,p);
add(v,u,p);
w[i]=p;
}
sort(w+1,w+n);
int l=1,r=n-1,mid;
while(l<r){
mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d
",w[r]);
}
2.货物分组
3.地形计算