标签:情况 http += isp 线段树 htm scanf getch bsp
树
#include<iostream> #include<cstdio> #define N 100009 using namespace std; int f[N],head[N],tot,n,q,a[N],fa[N],ans[N],top,tag[N]; char c[N]; struct dwd { int n,to; } e[N<<1]; inline void add(int u,int v) { e[++tot].n=head[u]; e[tot].to=v; head[u]=tot; } int find(int x) { return f[x]=f[x]==x?x:find(f[x]); } inline char getch() { char c=getchar(); while(!isalpha(c))c=getchar(); return c; } int rd() { int x=0; char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x; } void dfs(int u,int faa) { for(int i=head[u]; i; i=e[i].n) { int v=e[i].to; if(v==faa)continue; fa[v]=u; if(!tag[v])f[v]=u; else f[v]=v; dfs(v,u); } } int main() { n=rd(); q=rd(); int u,v; for(int i=1; i<n; ++i)u=rd(),v=rd(),add(u,v),add(v,u); tag[1]=1; f[1]=1; for(int i=1; i<=q; ++i) { c[i]=getch(); a[i]=rd(); if(c[i]==‘C‘)tag[a[i]]++; } dfs(1,0); for(int i=q; i>=1; --i) { if(c[i]==‘C‘) { tag[a[i]]--; if(!tag[a[i]])f[a[i]]=fa[a[i]]; } else ans[++top]=find(a[i]); } for(int i=top; i>=1; --i)printf("%d\n",ans[i]); return 0; }
排序
#include<iostream> #include<cstdio> #define N 30002 using namespace std; int la[N<<2],tr[N<<2],a[N],ji,tag,n,m,l[N],r[N],ta[N],ans,q; bool b[N]; inline void pushdown(int cnt,int l1,int l2){ int sum=tr[cnt]; if(la[cnt]==1){ if(l1>=sum){ tr[cnt<<1]=sum;sum=0; } else{ tr[cnt<<1]=l1;sum-=l1; } tr[cnt<<1|1]=sum; } else{ if(l2>=sum){ tr[cnt<<1|1]=sum;sum=0; } else{ tr[cnt<<1|1]=l2;sum-=l2; } tr[cnt<<1]=sum; } la[cnt<<1]=la[cnt<<1|1]=la[cnt];la[cnt]=0; } int dfs(int cnt,int l,int r){ if(l==r)return tr[cnt]; int mid=(l+r)>>1; if(la[cnt])pushdown(cnt,mid-l+1,r-mid); if(mid>=q)dfs(cnt<<1,l,mid); else dfs(cnt<<1|1,mid+1,r); } void build(int cnt,int l,int r){ if(l==r){ tr[cnt]=b[l]; return; } int mid=(l+r)>>1; build(cnt<<1,l,mid);build(cnt<<1|1,mid+1,r); tr[cnt]=tr[cnt<<1]+tr[cnt<<1|1];//care } void gett(int cnt,int l,int r,int L,int R){ if(l>=L&&r<=R){ ji+=tr[cnt]; return; } int mid=(l+r)>>1; if(la[cnt])pushdown(cnt,mid-l+1,r-mid); if(mid>=L)gett(cnt<<1,l,mid,L,R); if(mid<R)gett(cnt<<1|1,mid+1,r,L,R); } void returnn(int cnt,int l,int r,int L,int R){ if(l>=L&&r<=R){ la[cnt]=tag; if(ji>=r-l+1){ tr[cnt]=r-l+1; ji-=tr[cnt]; } else{ tr[cnt]=ji;ji=0; } return; } int mid=(l+r)>>1; if(tag==1){ if(mid>=L)returnn(cnt<<1,l,mid,L,R); if(mid<R)returnn(cnt<<1|1,mid+1,r,L,R); } else{ if(mid<R)returnn(cnt<<1|1,mid+1,r,L,R); if(mid>=L)returnn(cnt<<1,l,mid,L,R); } tr[cnt]=tr[cnt<<1]+tr[cnt<<1|1]; } bool ch(int pos){ for(int i=1;i<=n;++i)b[i]=a[i]>=pos?1:0; build(1,1,n); for(int i=1;i<=m;++i){ ji=0; tag=ta[i]; gett(1,1,n,l[i],r[i]); returnn(1,1,n,l[i],r[i]); } if(dfs(1,1,n))return 1; else return 0; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=m;++i){scanf("%d%d%d",&ta[i],&l[i],&r[i]);if(!ta[i])ta[i]=2;} scanf("%d",&q); int l=1,r=n; while(l<=r){ int mid=(l+r)>>1; if(ch(mid)){ ans=mid; l=mid+1; } else r=mid-1; } cout<<ans; return 0; }
序列
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值
标签:情况 http += isp 线段树 htm scanf getch bsp
原文地址:https://www.cnblogs.com/ZH-comld/p/10246415.html