四连测Day1
这里只有本菜鸡的代码
#include<bits/stdc++.h> using namespace std; int st[21][100010]; int st2[21][100010]; int n,q,A[100010]; int cnt,fst[100010],nxt[200010],to[200010]; int a,b; void link(int x,int y) { nxt[++cnt]=fst[x]; fst[x]=cnt; to[cnt]=y; } int dep[100010]; void makedep(int x) { for(int i=fst[x];i;i=nxt[i]) { if(!dep[to[i]]) {dep[to[i]]=dep[x]+1;st[0][to[i]]=x;st2[0][to[i]]=min(A[to[i]],A[x]);makedep(to[i]);} } } void makest() { for(int i=1;i<=20;i++) { for(int j=1;j<=n;j++) { st[i][j]=st[i-1][st[i-1][j]]; st2[i][j]=min(st2[i-1][j],st2[i-1][st[i-1][j]]); } } } int quey(int x,int y) { int ans=min(A[x],A[y]); if(dep[x]<dep[y]) swap(x,y); for(int i=20;i>=0;i--) { if((1<<i)<=dep[x]-dep[y]) {ans=min(ans,st2[i][x]);x=st[i][x];} } if(x==y) return ans; for(int i=20;i>=0;i--) { if(st[i][x]!=st[i][y]) { ans=min(ans,st2[i][x]); ans=min(ans,st2[i][y]); x=st[i][x]; y=st[i][y]; } } ans=min(st2[0][x],ans); ans=min(st2[0][y],ans); return ans; } int main() { freopen("min.in","r",stdin); freopen("min.out","w",stdout); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&A[i]); for(int i=1;i<n;i++) { scanf("%d%d",&a,&b); link(a,b);link(b,a); } dep[1]=1;makedep(1); makest(); while(q--) { scanf("%d%d",&a,&b); printf("%d\n",quey(a,b)); } }
#include<bits/stdc++.h> using namespace std; namespace Seg_Tree { #define lx (x<<1) #define rx (x<<1|1) int c[500010]; void update(int x) { c[x]=c[lx]+c[rx]; } void pushdown(int x) { if(c[x]==0) { c[rx]=c[lx]=0; } } void build(int x,int l,int r) { if(l==r) {c[x]=1;return;} int mid=(l+r)>>1; build(lx,l,mid);build(rx,mid+1,r); update(x); } void mdf(int x,int l,int r,int nl,int nr) { if(l==nl&&r==nr) {c[x]=0;return;} pushdown(x); int mid=(l+r)>>1; if(nl<=mid) mdf(lx,l,mid,nl,min(nr,mid)); if(nr>mid) mdf(rx,mid+1,r,max(nl,mid+1),nr); update(x); } int quey(int x,int l,int r,int nl,int nr) { if(l==nl&&r==nr) return c[x]; pushdown(x); int mid=(l+r)>>1,t=0; if(nl<=mid) t+=quey(lx,l,mid,nl,min(nr,mid)); if(nr>mid) t+=quey(rx,mid+1,r,max(nl,mid+1),nr); return t; } } using namespace Seg_Tree; int n,m,ans; struct Data { int l,r,v; bool operator < (const Data &a) const { return v<a.v; } }A[100010]; int main() { freopen("kruskal.in","r",stdin); freopen("kruskal.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&A[i].l,&A[i].r,&A[i].v); sort(A+1,A+m+1); build(1,1,n); for(int i=1;i<=m;i++) { int cnt=quey(1,1,n,A[i].l,A[i].r-1); ans+=cnt*A[i].v; mdf(1,1,n,A[i].l,A[i].r-1); } if(quey(1,1,n,1,n)>1) printf("-1\n"); else printf("%d\n",ans); }
#include<bits/stdc++.h> using namespace std; int n,Q,k; int A[10010]; int B[10010]; int sum[1048585]; inline int read() { int x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } int main() { freopen("xor.in","r",stdin); freopen("xor.out","w",stdout); n=read();Q=read(); for(int i=1;i<=n;i++) { A[i]=read(); B[i]=B[i-1]^A[i]; } for(int i=0;i<=n;i++) { for(int j=i+1;j<=n;j++) { sum[B[i]^B[j]]++; } } for(int i=1;i<=1048575;i++) sum[i]+=sum[i-1]; while(Q--) { k=read(); printf("%d\n",upper_bound(sum,sum+1048576,k-1)-sum); } }
lunatic太难辣!!!!!