暑假集训day8
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假集训day8相关的知识,希望对你有一定的参考价值。
其实这是昨天的事了。(现在时间回到一天前)
跳跳糖(9018——1563)
这道题用二分步长的方法做(LCA的一种)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF=1e9; inline int read(){ int x=0,t=1;char c=getchar(); while(c<\'0\'||c>\'9\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){x=(x<<3)+(x<<1)+c-\'0\';c=getchar();} return x*t; } int a[4],b[4],ans[4],deep; int deng(int *x,int *y){ for(int i=1;i<=3;i++)if(x[i]!=y[i])return 0;return 1; } void solve(int *q,int k){ int t1=q[2]-q[1],t2=q[3]-q[2]; for(int i=1;i<=3;i++)ans[i]=q[i]; if(t1==t2)return; if(t1<t2){ int t=min(k,(t2-1)/t1); k-=t;deep+=t; ans[1]+=t*t1;ans[2]+=t*t1; } else{ int t=min(k,(t1-1)/t2); k-=t;deep+=t; ans[3]-=t*t2;ans[2]-=t*t2; } if(k)solve(ans,k); } int main() { for(int i=1;i<=3;i++)a[i]=read();sort(a+1,a+4); for(int i=1;i<=3;i++)b[i]=read();sort(b+1,b+4); int x[4],y[4]; deep=0;solve(a,INF);for(int i=1;i<=3;i++)x[i]=ans[i];int d1=deep; deep=0;solve(b,INF);for(int i=1;i<=3;i++)y[i]=ans[i];int d2=deep; if(!deng(x,y)){puts("NO");return 0;} if(d1>d2){swap(d1,d2);for(int i=1;i<=3;i++)swap(a[i],b[i]);} int d=d2-d1; solve(b,d);for(int i=1;i<=3;i++)b[i]=ans[i]; int l=0,r=d1; while(l<=r){ int mid=(l+r)/2; solve(a,mid);for(int i=1;i<=3;i++)x[i]=ans[i]; solve(b,mid);for(int i=1;i<=3;i++)y[i]=ans[i]; if(!deng(x,y))l=mid+1; else r=mid-1; } printf("YES\\n%d",d+l*2); return 0; }
树的统计(bzoj_1036)
就是树链剖分了,模板题。
这题调了半天、、发现swap(t1,t2)变成swap(t1,t1)。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> using namespace std; const int N=30010,INF=947483647; inline int read(){ int t=1,num=0;char c=getchar(); while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();} while(c>=\'0\'&&c<=\'9\'){num=(num<<1)+(num<<3)+c-\'0\';c=getchar();} return num*t; } struct yzy{int c[2];}t[3*N];vector<int>biao[N]; int n,q,a[N],val[2]={0,-INF},fa[N],dep[N],son[N],size[N],top[N],root,k; void dfs1(int x,int f,int d){ dep[x]=d;fa[x]=f;size[x]=1;son[x]=0; for (int i=0;i<biao[x].size();i++) { int y=biao[x][i];if(y==f)continue; dfs1(y,x,d+1);size[x]+=size[y]; if(size[y]>size[son[x]])son[x]=y; } } int num=0,id[N]; void dfs2(int x,int tp){ id[x]=++num;top[x]=tp; if(son[x])dfs2(son[x],tp); for(int i=0;i<biao[x].size();i++){ int y=biao[x][i];if(y!=son[x]&&y!=fa[x])dfs2(y,y); } } void build(int ro,int l,int r){ if(l==r){t[ro].c[0]=t[ro].c[1]=a[l];return;} int mid=(l+r)>>1; build(ro<<1,l,mid);build((ro<<1)+1,mid+1,r); t[ro].c[0]=t[ro<<1].c[0]+t[(ro<<1)+1].c[0]; t[ro].c[1]=max(t[ro<<1].c[1],t[(ro<<1)+1].c[1]); } int ask(int ro,int l,int r,int x,int y){ if(x>r||y<l)return val[k];if(x<=l&&r<=y)return t[ro].c[k]; int mid=(l+r)>>1; if(!k)return (ask(ro<<1,l,mid,x,y)+ask((ro<<1)+1,mid+1,r,x,y)); return max(ask(ro<<1,l,mid,x,y),ask((ro<<1)+1,mid+1,r,x,y)); } void change(int ro,int l,int r,int x,int add){ if(l==r){if(x==l){t[ro].c[0]+=add;t[ro].c[1]+=add;}return;} int mid=(l+r)>>1; if(x<=mid)change(ro<<1,l,mid,x,add); else change((ro<<1)+1,mid+1,r,x,add); t[ro].c[0]=t[ro<<1].c[0]+t[(ro<<1)+1].c[0]; t[ro].c[1]=max(t[ro<<1].c[1],t[(ro<<1)+1].c[1]); } int solve(int x,int y){ int t1=top[x],t2=top[y],ans=val[k]; while(t1!=t2){ if(dep[t1]<dep[t2]){swap(t1,t2);swap(x,y);} if(k)ans=max(ask(1,1,n,id[t1],id[x]),ans); else ans+=ask(1,1,n,id[t1],id[x]); x=fa[t1];t1=top[x]; } if(dep[x]>dep[y])swap(x,y); if(k)ans=max(ask(1,1,n,id[x],id[y]),ans); else ans+=ask(1,1,n,id[x],id[y]); return ans; } int main() { n=read();for(int i=1;i<n;i++){ int x=read(),y=read(); biao[x].push_back(y);biao[y].push_back(x); }dfs1(1,0,1);dfs2(1,1); for(int i=1;i<=n;i++)a[id[i]]=read(); build(1,1,n);q=read(); for(int i=1;i<=q;i++){ char c=getchar(); while(c!=\'H\'&&c!=\'M\'&&c!=\'S\')c=getchar(); int x=read(),y=read(); if(c==\'H\'){change(1,1,n,id[x],y-a[id[x]]);a[id[x]]=y;continue;} else if(c==\'M\')k=1;else k=0; printf("%d\\n",solve(x,y)); } return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于暑假集训day8的主要内容,如果未能解决你的问题,请参考以下文章