T1:林下风气
Problem:
里口福因有林下风气,带领全国各地高校掀起了一股 AK 风,大家都十分痴迷于 AK。里口福为了打击大家的自信心,出了一道自以为十分困难的题目。
Solution:
- 算法 1
- 算法 2
- 算法 3
- 算法 4
- 算法 5
Code:
1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 const int mod=19260817; 5 const int maxn=1100000; 6 int n,k,u,v,tot,a[maxn]; 7 int head[maxn],nxt[maxn],to[maxn]; 8 inline void add(int u,int v){ 9 tot++; 10 to[tot]=v; 11 nxt[tot]=head[u]; 12 head[u]=tot; 13 } 14 inline int dp(int now,int fa,int r,int k){ 15 if(k<0) return 0; 16 int mid=1; 17 for(int i=head[now];i;i=nxt[i]){ 18 int y=to[i]; 19 if(y==fa) continue; 20 if(a[y]>=a[r]&&a[y]<=a[r]+k&&(a[y]!=a[r]||a[y]==a[r]&&y<r)){ 21 mid=mid*(dp(y,now,r,k)+1)%mod; 22 } 23 } 24 return mid; 25 } 26 signed main(){ 27 cin>>n>>k; 28 for(int i=1;i<=n;i++){ 29 cin>>a[i]; 30 } 31 for(int i=1;i<n;i++){ 32 cin>>u>>v; 33 add(u,v); 34 add(v,u); 35 } 36 int ans=0; 37 for(int i=1;i<=n;i++){ 38 ans=(ans+((dp(i,0,i,k)-dp(i,0,i,k-1))%mod+mod)%mod)%mod; 39 } 40 cout<<ans<<endl; 41 return 0; 42 }
T2:盟主的忧虑
Problem:
江湖由 N 个门派(2≤N≤100,000,编号从 1 到 N)组成,这些门派之间有 N-1 条小道将他们连接起来,每条道路都以“尺”为单位去计量,武林盟主发现任何两个门派都能够直接或者间接通过小道连接。
Solution:
- N<=1000,M<=1000
- N<=5000,M<=5000
- 树是一条链
- N,M<=100000
Code:
1 #include<bits/stdc++.h> 2 #define int long long 3 #define ls x<<1 4 #define rs x<<1|1 5 using namespace std; 6 const int maxn=100005; 7 int n,m,vis[maxn],pre[maxn],ans[maxn],use[maxn]; 8 int cnt,son[maxn],se[maxn],be[maxn],dep[maxn],top[maxn]; 9 int tot=1,head[maxn],nex[maxn<<1],to[maxn<<1],fa[maxn]; 10 struct node{ 11 int l,r,mid,id; 12 }t[1000005]; 13 inline int read(){ 14 int x=0,f=1; 15 char ch=getchar(); 16 while(ch<'0'||ch>'9'){ 17 if(ch=='-') f=-1; 18 ch=getchar(); 19 } 20 while(ch>='0'&&ch<='9'){ 21 x=(x<<3)+(x<<1)+ch-'0'; 22 ch=getchar(); 23 } 24 return x*f; 25 } 26 inline void add(int x,int y){ 27 to[++tot]=y; 28 nex[tot]=head[x]; 29 head[x]=tot; 30 } 31 inline void dfs1(int x,int f){ 32 se[x]=1; 33 dep[x]=dep[f]+1; 34 fa[x]=f; 35 for(int i=head[x];i;i=nex[i]){ 36 int y=to[i]; 37 if(y==f) continue; 38 se[x]+=1; 39 dfs1(y,x); 40 if(se[y]>se[son[x]]) son[x]=y; 41 pre[y]=i/2; 42 } 43 } 44 inline void dfs(int x,int tv){ 45 cnt+=1; 46 be[x]=cnt; 47 top[x]=tv; 48 if(son[x]) dfs(son[x],tv); 49 for(int i=head[x];i;i=nex[i]){ 50 int y=to[i]; 51 if(y==fa[x]||y==son[x]) continue; 52 dfs(y,y); 53 } 54 } 55 inline void push_down(int x){ 56 if(t[x].id==1){ 57 if(t[ls].id==0) t[ls].mid=t[x].mid; 58 else t[ls].mid=min(t[ls].mid,t[x].mid); 59 if(t[rs].id==0) t[rs].mid=t[x].mid; 60 else t[rs].mid=min(t[rs].mid,t[x].mid); 61 t[ls].id=1; 62 t[rs].id=1; 63 } 64 } 65 inline void build(int x,int l,int r){ 66 t[x].l=l; 67 t[x].r=r; 68 t[x].mid=0; 69 t[x].id=0; 70 if(l==r) return ; 71 int mi=(l+r)/2; 72 build(ls,l,mi); 73 build(rs,mi+1,r); 74 } 75 inline void insert(int x,int L,int R,int k){ 76 int l=t[x].l,r=t[x].r; 77 push_down(x); 78 if(L<=l&&R>=r){ 79 if(t[x].id==0) t[x].mid=k; 80 else t[x].mid=min(t[x].mid,k); 81 t[x].id=1; 82 return ; 83 } 84 int mid=(l+r)/2; 85 if(L<=mid) insert(ls,L,R,k); 86 if(R>mid) insert(rs,L,R,k); 87 } 88 inline int query(int x,int pos){ 89 int l=t[x].l,r=t[x].r; 90 push_down(x); 91 if(l==r){ 92 if(t[x].id==0) return -1; 93 else return t[x].mid; 94 } 95 int mid=(l+r)/2,ans=0; 96 if(mid>=pos) ans=query(ls,pos); 97 else ans=query(rs,pos); 98 return ans; 99 } 100 inline void solve(int x,int y,int z){ 101 while(top[x]!=top[y]){ 102 if(dep[top[x]]<dep[top[y]]) swap(x,y); 103 insert(1,be[top[x]],be[x],z); 104 x=fa[top[x]]; 105 } 106 if(x==y) return ; 107 if(dep[x]<dep[y]) swap(x,y); 108 insert(1,be[y]+1,be[x],z); 109 } 110 signed main(){ 111 n=read(); 112 m=read(); 113 for(int i=1;i<n;i++){ 114 int x,y; 115 x=read(); 116 y=read(); 117 add(x,y); 118 add(y,x); 119 } 120 build(1,1,n); 121 dfs1(1,0); 122 dfs(1,1); 123 for(int i=1;i<=m;i++){ 124 int x,y,z; 125 x=read(); 126 y=read(); 127 z=read(); 128 solve(x,y,z); 129 } 130 for(int i=1;i<=n;i++){ 131 ans[pre[i]]=query(1,be[i]); 132 } 133 for(int i=1;i<=n-1;i++){ 134 cout<<ans[i]<<"\n"; 135 } 136 return 0; 137 }
T3:明日之星
Problem:
Solution:
- 1
- 2
- 3
- 4
- 5
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+5; 4 const int maxm=4e5+5; 5 const int maxp=1e7; 6 int n,tp,Q,op,x,y,a[maxn],w[18][maxn],dep[maxn]; 7 char str[maxm],s[maxm]; 8 int len,ls[maxn],rs[maxn]; 9 struct node{ 10 int head[maxn],to[maxn*2],nxt[maxn*2],tot; 11 void add(int x,int y){ 12 nxt[++tot]=head[x]; 13 to[tot]=y; 14 head[x]=tot; 15 } 16 }e; 17 struct node2{ 18 int head[maxp],to[maxm],nxt[maxm],tot; 19 void add(int x,int y){ 20 nxt[++tot]=head[x]; 21 to[tot]=y; 22 head[x]=tot; 23 } 24 }e2; 25 struct node3{ 26 int x,y; 27 }b[maxn*2]; 28 int p[maxn],q[maxn],tt; 29 int ch(char c){ 30 if(c=='A') return 0; 31 if(c=='G') return 1; 32 if(c=='C') return 2; 33 if(c=='T') return 3; 34 return 4; 35 } 36 inline int lowbit(int x){ 37 return x&-x; 38 } 39 inline void dg(int x){ 40 dep[x]=dep[w[0][x]]+1; 41 p[x]=++tt; 42 b[tt].x=x; 43 b[tt].y=1; 44 for(int i=e.head[x];i;i=e.nxt[i]){ 45 if(!p[e.to[i]]){ 46 w[0][e.to[i]]=x; 47 dg(e.to[i]); 48 } 49 } 50 q[x]=++tt; 51 b[tt].x=x; 52 b[tt].y=-1; 53 } 54 inline int lca(int x,int y){ 55 if(dep[x]<dep[y]) swap(x,y); 56 for(int i=17;i>=0;i--){ 57 if(dep[w[i][x]]>=dep[y]){ 58 x=w[i][x]; 59 } 60 } 61 if(x==y) return x; 62 for(int i=17;i>=0;i--){ 63 if(w[i][x]!=w[i][y]){ 64 x=w[i][x]; 65 y=w[i][y]; 66 } 67 } 68 return w[0][x]; 69 } 70 int to[maxp][5],fail[maxp],tc,g[maxn*8],G[maxn*8],d[maxm]; 71 int ed[20][maxn*2],p2[maxp],q2[maxp],pp; 72 inline void dd(int x){ 73 p2[x]=++pp; 74 for(int i=e2.head[x];i;i=e2.nxt[i]){ 75 dd(e2.to[i]); 76 } 77 q2[x]=pp; 78 } 79 int ans,f[maxp]; 80 inline void bt(int i,int x,int y,int dp){ 81 g[i]=++tc; 82 for(int j=x;j<=y;j++){ 83 int p=g[i]; 84 for(int k=ls[b[j].x];k<=rs[b[j].x];k++){ 85 if(!to[p][s[k]]) to[p][s[k]]=++tc; 86 p=to[p][s[k]]; 87 } 88 ed[dp][j]=p; 89 } 90 G[i]=tc; 91 for(int j=1;j<=e2.tot;j++){ 92 e2.nxt[j]=0; 93 } 94 e2.tot=0; 95 for(int j=0;j<=4;j++){ 96 to[0][j]=g[i]; 97 } 98 d[d[0]=1]=g[i]; 99 for(int j=1;j<=d[0];j++){ 100 int x=d[j]; 101 if(j>1) e2.add(fail[x],x); 102 for(int k=0;k<=4;k++){ 103 if(to[x][k]){ 104 int y=to[x][k],p=fail[x]; 105 while(!to[p][k]) p=fail[p]; 106 fail[y]=to[p][k]; 107 d[++d[0]]=y; 108 } 109 } 110 } 111 dd(g[i]); 112 for(int j=x;j<=y;j++){ 113 f[p2[ed[dp][j]]]+=a[b[j].x]*b[j].y; 114 if(q2[ed[dp][j]]<G[i]){ 115 f[q2[ed[dp][j]]+1]-=a[b[j].x]*b[j].y; 116 } 117 } 118 int q=G[i]-g[i]+1; 119 for(int j=1;j<=q;j++){ 120 if(j+lowbit(j)<=q){ 121 f[g[i]+j+lowbit(j)-1]+=f[g[i]+j-1]; 122 } 123 } 124 if(x==y) return ; 125 int mid=(x+y)>>1; 126 bt(i<<1,x,mid,dp+1); 127 bt(i<<1|1,mid+1,y,dp+1); 128 } 129 int pl,pr,px; 130 inline void add(int x,int n,int st,int c){ 131 x-=--st; 132 while(x+st<=n){ 133 f[x+st]+=c; 134 x+=lowbit(x); 135 } 136 } 137 inline void ff(int x,int st){ 138 x-=--st; 139 while(x){ 140 ans+=f[x+st]; 141 x-=lowbit(x); 142 } 143 } 144 inline void xiu(int i,int x,int y,int dp){ 145 if(y<pl||x>pr) return ; 146 add(p2[ed[dp][pl]],G[i],g[i],px); 147 add(q2[ed[dp][pl]]+1,G[i],g[i],-px); 148 if(x==y) return ; 149 int mid=(x+y)>>1; 150 xiu(i<<1,x,mid,dp+1); 151 xiu(i<<1|1,mid+1,y,dp+1); 152 } 153 char t[maxm]; 154 int lt; 155 inline void fi(int i,int x,int y,int dp){ 156 if(y<pl||x>pr) return ; 157 if(x>=pl&&y<=pr){ 158 int p=g[i]; 159 for(int j=0;j<=4;j++){ 160 to[0][j]=p; 161 } 162 for(int j=1;j<=lt;j++){ 163 while(!to[p][t[j]]) p=fail[p]; 164 p=to[p][t[j]]; 165 ff(p2[p],g[i]); 166 } 167 return ; 168 } 169 int mid=(x+y)>>1; 170 fi(i<<1,x,mid,dp+1); 171 fi(i<<1|1,mid+1,y,dp+1); 172 } 173 int main(){ 174 scanf("%d%d",&n,&tp); 175 for(int i=1;i<=n;i++){ 176 scanf("%s",str+1); 177 len=strlen(str+1); 178 ls[i]=rs[i-1]+1; 179 rs[i]=rs[i-1]+len; 180 for(int j=ls[i];j<=rs[i];j++){ 181 s[j]=ch(str[j-ls[i]+1]); 182 } 183 } 184 for(int i=1;i<=n;i++){ 185 scanf("%d",&a[i]); 186 } 187 for(int i=1;i<=n-1;i++){ 188 scanf("%d%d",&x,&y); 189 e.add(x,y); 190 e.add(y,x); 191 } 192 dg(1); 193 for(int i=1;i<=17;i++){ 194 for(int j=1;j<=n;j++){ 195 w[i][j]=w[i-1][w[i-1][j]]; 196 } 197 } 198 bt(1,1,tt,0); 199 scanf("%d",&Q); 200 for(int ii=1;ii<=Q;ii++){ 201 scanf("%d%d%d",&op,&x,&y); 202 x^=ans*tp; 203 y^=ans*tp; 204 if(op==1){ 205 scanf("%s",t+1); 206 lt=strlen(t+1); 207 for(int j=1;j<=lt;j++){ 208 t[j]=ch(t[j]); 209 } 210 int z=lca(x,y); 211 ans=0; 212 pl=p[z]; 213 pr=p[x]; 214 fi(1,1,tt,0); 215 pl=p[z]+1; 216 pr=p[y]; 217 fi(1,1,tt,0); 218 printf("%d\n",ans); 219 } 220 else{ 221 pl=pr=p[x]; 222 px=y-a[x]; 223 xiu(1,1,tt,0); 224 pl=pr=q[x]; 225 px=-px; 226 xiu(1,1,tt,0); 227 a[x]=y; 228 } 229 } 230 return 0; 231 }