2018.10.15noip模拟赛
#include<bits/stdc++.h> #define ll long long using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return f*x; } inline ll Lead() { ll x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return f*x; } int T,l,f; char S[20]; int A[20]; int Hsh[20][1000010]; void dfs(int x,ll val,ll now) { if(x==l||val>=1000000) return; Hsh[x][val]=1; dfs(x+1,val+A[x+1],A[x+1]); dfs(x+1,val+A[x+1]+now*9,now*10+A[x+1]); } ll calc(ll x) { if(x==0) return 10; ll t=1; while(x>0)x/=10,t*=10; return t; } void dfs2(int x,ll val,ll now) { if(x==1||val>=1000000) return; if(Hsh[x-1][val]==1) f=1; dfs2(x-1,val+A[x-1],A[x-1]); dfs2(x-1,val+A[x-1]*calc(now),now+A[x-1]*calc(now)); } int main() { freopen("equation.in","r",stdin); freopen("equation.out","w",stdout); T=read(); while(T--) { memset(Hsh,0,sizeof(Hsh)); f=0; scanf("%s",S+1); l=strlen(S+1); for(int i=1;i<=l;i++) A[i]=S[i]-'0'; dfs(1,A[1],A[1]); dfs2(l,A[l],A[l]); if(f) {printf("Yes\n");continue;} printf("No\n"); } }
#include<bits/stdc++.h> #define ll long long #define int long long using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return f*x; } inline ll Lead() { ll x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return f*x; } int n,m,q,P[160010]; int fst[160010],nxt[320010],to[320010],cnt; int dfn[160010],dcnt,siz[160010],dep[160010]; int st[160010][20],op[160010]; void link(int x,int y) { nxt[++cnt]=fst[x]; fst[x]=cnt;to[cnt]=y; } void dfs(int x) { dfn[x]=++dcnt; siz[x]=1; for(int i=fst[x];i;i=nxt[i]) { if(dep[to[i]]!=0) continue; dep[to[i]]=dep[x]+1; st[to[i]][0]=x; dfs(to[i]); siz[x]+=siz[to[i]]; } } void makest() { for(int i=1;i<=18;i++) { for(int j=1;j<=n;j++) { st[j][i]=st[st[j][i-1]][i-1]; } } } int calc(int x,int stp) { if(dep[x]<=stp) return 1; for(int i=0;(1<<i)<=stp;i++) { if(stp&(1<<i)) x=st[x][i]; } return x; } namespace Seg_Tree { #define lx (x<<1) #define rx ((x<<1)|1) int tag1[3020010],tag2[3020010]; void psd(int x) { if(tag1[x]) { tag1[lx]=tag1[x]; tag1[rx]=tag1[x]; tag2[lx]=tag2[rx]=0; tag1[x]=0; } if(tag2[x]) { tag2[lx]+=tag2[x]; tag2[rx]+=tag2[x]; tag2[x]=0; } } void mdf1(int x,int l,int r,int nl,int nr,int val) { if(r<l) return; if(nl<=l&&r<=nr) { tag1[x]=val;tag2[x]=0;return; } psd(x); int mid=(l+r)>>1; if(nl<=mid) mdf1(lx,l,mid,nl,nr,val); if(nr>mid) mdf1(rx,mid+1,r,nl,nr,val); } void mdf2(int x,int l,int r,int nl,int nr,int val) { if(r<l) return; if(nl<=l&&r<=nr) { tag2[x]+=val;return; } psd(x); int mid=(l+r)>>1; if(nl<=mid) mdf2(lx,l,mid,nl,nr,val); if(nr>mid) mdf2(rx,mid+1,r,nl,nr,val); } int qury(int x,int l,int r,int p) { if(l==r) return calc(tag1[x]==0?P[l]:tag1[x],tag2[x]); psd(x); int mid=(l+r)>>1; if(p<=mid) return qury(lx,l,mid,p); if(p>mid) return qury(rx,mid+1,r,p); } } using namespace Seg_Tree; namespace Fenwick_Tree { #define lowbit(x) (x&-x) ll c1[160010],c2[160010]; void add1(int p,ll val){for(int i=p;i<=n;i+=lowbit(i)) c1[i]+=val;} void add2(int p,ll val){for(int i=p;i<=n;i+=lowbit(i)) c2[i]+=val;} ll qury1(int p){ll tmp=0;for(int i=p;i>0;i-=lowbit(i)) tmp+=c1[i];return tmp;} ll qury2(int p){ll tmp=0;for(int i=p;i>0;i-=lowbit(i)) tmp+=c2[i];return tmp;} } using namespace Fenwick_Tree; signed main() { freopen("robot3.in","r",stdin); freopen("robot.out","w",stdout); n=read();m=read(); for(int i=1;i<n;i++) { int x=read(),y=read(); link(x,y);link(y,x); } dep[1]=1; dfs(1);makest(); for(int i=1;i<=m;i++) P[i]=read(); q=read(); for(int i=1;i<=q;i++) { int opt=read(); if(opt==3) { int x=read(); int now=qury(1,1,m,x); op[now]=!op[now]; if(op[now]==1)add1(dfn[now],dep[now]),add2(dfn[now],1ll); else add1(dfn[now],-dep[now]),add2(dfn[now],-1ll); ll sum=qury1(dfn[now]+siz[now]-1)-qury1(dfn[now]); ll num=qury2(dfn[now]+siz[now]-1)-qury2(dfn[now]); printf("%lld\n",sum-num*dep[now]); continue; } int l=read(),r=read(),val=read(); if(opt==1) mdf1(1,1,m,l,r,val); if(opt==2) mdf2(1,1,m,l,r,val); } }
lunatic太难辣!!!!!