第二场
男女排队
#include<iostream>
using namespace std;
long n,i=3,f[20016]{1,2,4,6};
int main() {
cin >> n;
for (; i < n % 20016;)
f[++i] = (f[i] + f[i - 2] + f[i - 3]) % 10007;
cout << f[i];
}
树上最多不相交路径
#include<bits/stdc++.h>
using namespace std;
struct Path
{
int x,y,lca,d;
bool operator <(Path b)const{return d>b.d;}
}t[100050];
int n,m,f[100050][20],d[100050];
bool mk[100050];
vector<int>v[100050];
void dfs(int x,int p)
{
f[x][0]=p;
d[x]=d[p]+1;
for(int i=0;i<v[x].size();i++)
if(v[x][i]!=p)dfs(v[x][i],x);
}
void fill(int x,int p)
{
if(mk[x])return;
mk[x]=1;
for(int i=0;i<v[x].size();i++)
if(v[x][i]!=p)fill(v[x][i],x);
}
int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
for(int i=18;~i;i--)
if((1<<i)&(d[x]-d[y]))x=f[x][i];
if(x==y)return x;
for(int i=18;~i;i--)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
int main()
{
cin>>n>>m;
for(int i=1,x,y;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=m;i++)scanf("%d%d",&t[i].x,&t[i].y);
dfs(1,0);
for(int i=1;i<=18;i++)
for(int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1];
for(int i=1;i<=m;i++)
{
t[i].lca=LCA(t[i].x,t[i].y);
t[i].d=d[t[i].lca];
}
sort(t+1,t+m+1);
int ans=0;
for(int i=1;i<=m;i++)
{
if(mk[t[i].x]||mk[t[i].y])continue;
ans++;
fill(t[i].lca,f[t[i].lca][0]);
}
cout<<ans;
}
XB的生日
#include<bits/stdc++.h>
using namespace std;
const int M=55,N=505,P=5557;
int n,m,T,EA[N],EB[N],EC[N],mp[N];
int A[M][M],B[M][M];
void mult(int A[M][M],int B[M][M],int C[M][M]){
int T[M][M];
for(int i=0;i<=2*n;i++)
for(int j=0;j<=2*n;j++){
T[i][j]=0;
for(int k=0;k<=2*n;k++)
T[i][j]+=A[i][k]*B[k][j];
}
for(int i=0;i<=2*n;i++)
for(int j=0;j<=2*n;j++)
C[i][j]=T[i][j]%P;
}
int solve(int has){
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
A[0][0]=1;
B[1][1]=1;
for(int i=1;i<=n;i++)A[i][i+n]=1;
for(int i=1;i<=m;i++){
int a=EA[i],b=EB[i];
A[a][b]++;
if((EC[i]|has)==has)A[a+n][b]++;
}
for(int i=1;i<=2*n;i++)A[i][0]=A[i][1];
for(int i=0;(1<<i)<=T;i++){
if(T&(1<<i))mult(B,A,B);
mult(A,A,A);
}
return B[1][0]%P;
}
int main(){
scanf("%d%d",&n,&m);
mp['B']=1,mp['J']=2,mp['M']=4,mp['P']=8;
for(int i=1;i<=m;i++){
char str[9];
scanf("%d%d%s",&EA[i],&EB[i],str);
for(int j=0;j<strlen(str);j++)
EC[i]|=mp[str[j]];
}
scanf("%d",&T);
int ans=0;
for(int i=0;i<16;i++){
int f=1;
for(int j=0;j<4;j++)
if((i>>j)&1)f=-f;
ans=(ans+solve(i)*f+P)%P;
}
printf("%d\n",ans);
return 0;
}
球球
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;
ll n,Q,sum;
ll m,a[N],ans[N];
map<pair<ll,int>,ll> mp;
unordered_map<ll,ll> dp;
ll f(ll x,ll y){
if(x<y) return 0;
if(x==y) return 1;
if(dp.find(x)!=dp.end()) return dp[x];
return dp[x]=f(x>>1,y)+f(x-1>>1,y);
}
ll query(ll l,ll r,ll len,ll sum){
ll mid=l+r>>1;
if(r-l+1==len) return mid;
if(f(mid-l,len)>=sum) return query(l,mid-1,len,sum);
else return query(mid+1,r,len,sum-f(mid-l,len));
}
int main(){
scanf("%lld%d%d",&m,&n,&Q);sum=n;
for(int i=1;i<=n;i++) scanf("%lld",a+i);
a[n+1]=m+1;
for(int i=1;i<=n+1;i++)
if(a[i]-a[i-1]-1>0) mp.insert(make_pair(make_pair(-(a[i]-a[i-1]-1),i-1),1));
while(Q--){
ll x;scanf("%lld",&x);
if(x<=n){
printf("%lld\n",a[x]);
continue;
}
while(1){
auto cur=*mp.begin();
ll len=-cur.first.first,idx=cur.first.second;
if(cur.second+sum<x){
sum+=cur.second;
mp.erase(cur.first);
if(len>>1>0) mp[make_pair(-(len>>1),idx)]+=cur.second;
if(len-1>>1>0) mp[make_pair(-(len-1>>1),idx)]+=cur.second;
}else{
dp.clear();
printf("%lld\n",query(a[idx]+1,a[idx+1]-1,len,x-sum));
break;
}
}
}
return 0;
}
第10场
A. 博弈
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <complex>
#include <random>
#define itn int
#define nit int
#define ll long long
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define re register
#define ri re int
#define il inline
#define pii pair<int,int>
#define cp complex<double>
using namespace std;
const double Pi=acos(-1);
namespace fastIO {
template<class T>
inline void read(T &x) {
x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
if(fu)x=-x;
}
inline int read() {
int x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
return fu?-x:x;
}
template<class T,class... Args>
inline void read(T& t,Args&... args) {
read(t);
read(args...);
}
char _n_u_m_[40];
template<class T>
inline void write(T x ) {
if(x==0){
putchar('0');
return;
}
T tmp = x > 0 ? x : -x ;
if( x < 0 ) putchar('-') ;
register int cnt = 0 ;
while( tmp > 0 ) {
_n_u_m_[ cnt ++ ] = tmp % 10 + '0' ;
tmp /= 10 ;
}
while( cnt > 0 ) putchar(_n_u_m_[ -- cnt ]) ;
}
template<class T>
inline void write(T x ,char ch) {
write(x);
putchar(ch);
}
}
using namespace fastIO;
int n,a[200002];
int main(){
F(whqsing,1,read()){
memset(a,0,sizeof(a));
read(n);
F(i,1,n)read(a[i]);
ll tot=0;
F(i,1,n+30){
tot+=(a[i]>>1);
a[i+1]+=(a[i]>>1);
}
putchar((tot&1)?'Q':'W');
putchar('\n');
}
return 0;
}
B. 序列
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <complex>
#include <random>
#define itn int
#define nit int
#define ll long long
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define re register
#define ri re int
#define il inline
#define pii pair<int,int>
#define cp complex<double>
using namespace std;
const double Pi=acos(-1);
namespace fastIO {
template<class T>
inline void read(T &x) {
x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
if(fu)x=-x;
}
inline int read() {
int x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
return fu?-x:x;
}
template<class T,class... Args>
inline void read(T& t,Args&... args) {
read(t);
read(args...);
}
char _n_u_m_[40];
template<class T>
inline void write(T x ) {
if(x==0){
putchar('0');
return;
}
T tmp = x > 0 ? x : -x ;
if( x < 0 ) putchar('-') ;
register int cnt = 0 ;
while( tmp > 0 ) {
_n_u_m_[ cnt ++ ] = tmp % 10 + '0' ;
tmp /= 10 ;
}
while( cnt > 0 ) putchar(_n_u_m_[ -- cnt ]) ;
}
template<class T>
inline void write(T x ,char ch) {
write(x);
putchar(ch);
}
}
using namespace fastIO;
int n,m,mmax[400002],a[100002];
#define mid ((l+r)>>1)
inline void pushup(int pos){
mmax[pos]=max(mmax[pos<<1],mmax[pos<<1|1]);
}
inline void build(int pos,int l,int r){
if(l==r)mmax[pos]=a[l];
else{
build(pos<<1,l,mid),build(pos<<1|1,mid+1,r);
pushup(pos);
}
}
inline void modify(int pos,int l,int r,int q,int v){
if(l==r){
mmax[pos]=v;
return;
}
if(q<=mid)modify(pos<<1,l,mid,q,v);
else modify(pos<<1|1,mid+1,r,q,v);
pushup(pos);
}
inline void modify(int pos,int l,int r,int ql,int qr,int k){
if(mmax[pos]<k)return;
if(l==r){
mmax[pos]%=k;
return;
}
if(ql<=mid)modify(pos<<1,l,mid,ql,qr,k);
if(qr>mid)modify(pos<<1|1,mid+1,r,ql,qr,k);
pushup(pos);
}
inline int query(int pos,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return mmax[pos];
if(ql>mid)return query(pos<<1|1,mid+1,r,ql,qr);
if(qr<=mid)return query(pos<<1,l,mid,ql,qr);
return max(query(pos<<1,l,mid,ql,qr),query(pos<<1|1,mid+1,r,ql,qr));
}
int main(){
cin>>n>>m;
F(i,1,n)read(a[i]);
build(1,1,n);
F(i,1,m){
int tp=read();
if(tp==1){
int p=read(),x=read();
modify(1,1,n,p,x);
}else if(tp==2){
int l=read(),r=read(),k=read();
modify(1,1,n,l,r,k);
}else{
int l=read(),r=read();
write(query(1,1,n,l,r),'\n');
}
}
return 0;
}
C. 逆序对
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <complex>
#define itn int
#define nit int
#define ll long long
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define re register
#define ri re int
#define il inline
#define pii pair<int,int>
#define cp complex<double>
#define vi vector<int>
#define ull unsigned long long
#define mem0(x) memset(x,0,sizeof(x))
#define mem0x3f(x) memset(x,0x3f,sizeof(x))
using namespace std;
using std::bitset;
const double Pi=acos(-1);
namespace fastIO {
template<class T>
inline void read(T &x) {
x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
if(fu)x=-x;
}
inline int read() {
int x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
return fu?-x:x;
}
template<class T,class... Args>
inline void read(T& t,Args&... args) {
read(t);
read(args...);
}
char _n_u_m_[40];
template<class T>
inline void write(T x) {
if(x==0){
putchar('0');
return;
}
T tmp = x > 0 ? x : -x ;
if( x < 0 ) putchar('-') ;
register int cnt = 0 ;
while( tmp > 0 ) {
_n_u_m_[ cnt ++ ] = tmp % 10 + '0' ;
tmp /= 10 ;
}
while( cnt > 0 ) putchar(_n_u_m_[ -- cnt ]) ;
}
template<class T>
inline void write(T x ,char ch) {
write(x);
putchar(ch);
}
}
using namespace fastIO;
#define mod 998244353
#define inv2 499122177
#define inv6 166374059
inline long long pw(long long x,long long p) {
long long res=1;
for(; p; p>>=1,x=x*x%mod)
if(p&1)res=res*x%mod;
return res;
}
inline ll getm(long long top,long long bot) {
return (top*pw(bot,mod-2))%mod;
}
int d[10000002],n;
int main() {
d[0]=1;
F(i,2,10000000)d[i]=1ll*(i-1)*(d[i-1]+d[i-2])%mod;
F(asdf,1,read()){
read(n);
ll ans=1ll*(d[n]+d[n-2])*inv2%mod*n%mod*(n-1)%mod*inv2%mod;
ll qwq=1ll*n*(n-1)%mod*inv6%mod;
write((ans+qwq*d[n-1]%mod)%mod,'\n');
}
return 0;
}
D. 唱歌
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <complex>
#include <random>
#define itn int
#define nit int
#define ll long long
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define re register
#define ri re int
#define il inline
#define pii pair<int,int>
#define cp complex<double>
using namespace std;
const double Pi=acos(-1);
namespace fastIO {
template<class T>
inline void read(T &x) {
x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
if(fu)x=-x;
}
inline int read() {
int x=0;
bool fu=0;
char ch=0;
while(ch>'9'||ch<'0') {
ch=getchar();
if(ch=='-')fu=1;
}
while(ch<='9'&&ch>='0') x=(x*10-48+ch),ch=getchar();
return fu?-x:x;
}
template<class T,class... Args>
inline void read(T& t,Args&... args) {
read(t);
read(args...);
}
char _n_u_m_[40];
template<class T>
inline void write(T x ) {
if(x==0){
putchar('0');
return;
}
T tmp = x > 0 ? x : -x ;
if( x < 0 ) putchar('-') ;
register int cnt = 0 ;
while( tmp > 0 ) {
_n_u_m_[ cnt ++ ] = tmp % 10 + '0' ;
tmp /= 10 ;
}
while( cnt > 0 ) putchar(_n_u_m_[ -- cnt ]) ;
}
template<class T>
inline void write(T x ,char ch) {
write(x);
putchar(ch);
}
}
using namespace fastIO;
int n,m;
char s[100002],t[100002];
bitset<100002>b[256],res;
int main(){
cin>>n>>m;
scanf("%s",s+1);
F(i,1,n)b[s[i]][i]=1;
F(i,1,m){
int tp=read(),l=read(),r=read();
scanf("%s",t);
if(tp==1){
F(i,l,r){
b[s[i]][i]=0;
b[s[i]=t[i-l]][i]=1;
}
}else{
res=b[t[0]];
for(int i=1;t[i]!='\0';++i){
--r;
res&=(b[t[i]]>>i);
}
write((res>>l<<(l+100001-r)).count(),'\n');
}
}
return 0;
}
第九场
A. 坏对
#include <bits/stdc++.h>
#define For(a,b,c) for(int a=b;a<=c;++a)
int n,m,x,l,t,A[101000];
long long s;
int main () {
scanf("%d%d",&n,&m);
For(i,1,n) {
scanf("%d",&x);
if ((x-=m)>0) {
if (t>l) l=t;
if (A[x+m]>l) l=A[x+m];
For(j,1,sqrt(x))
if (x%j==0) A[j]=A[x/j]=i;
} else if (!x) t=i;
s+=i-l;
}
printf("%lld",s),exit(0);
}
B. 贪吃蛇
#include <bits/stdc++.h>
#define _ int
using namespace std;_ mod=1000000009;_ n,m,k,k2,p1,p2,mp[25][25],dx[15]={0,1,0,-1},dy[15]={1,0,-1,0};
struct snk{_ x[11];_ y[11];_ cnt;_ hsh(){_ res=0;for(_ i=1;i<=k;i++)res=((res*31+x[i])%mod*11+y[i])%mod;return res;}void upd(_ dir){cnt++;_ a=x[1],b=y[1];
a+=dx[dir],b+=dy[dir];for(_ i=1;i<=k;i++)if(a==x[i]&&b==y[i])cnt=-1;if(a<=0||a>n||b<=0||b>m||mp[a][b]==1||cnt==-1){cnt=-1;return ;}
for(_ i=k;i>=2;i--)x[i]=x[i-1],y[i]=y[i-1];x[1]=a,y[1]=b;}};snk s;queue<snk>q;map<_,_>hs;_ main(){s.cnt=0;cin>>n>>m>>k;for(_ i=1;i<=k;i++)cin>>s.x[i]>>s.y[i];
cin>>k2;for(_ i=1;i<=k2;i++)cin>>p1>>p2,mp[p1][p2]=1;q.push(s);while(!q.empty()){snk a=q.front();q.pop();if(a.x[1]==1&&a.y[1]==1){cout<<a.cnt<<endl;return 0;}for(_ i=0;i<4;i++){snk b=a;b.upd(i);if(b.cnt!=-1){_ c=b.hsh();if(!hs[c])
hs[c]=1,q.push(b);}}}cout<<-1<<endl;return 0;}
C. 六花的勇者
#include<bits/stdc++.h>
using namespace std;
vector<int>d[1000005];
int tp[1000005],sz[1000005],son[1000000],sum[1000005],dp[1000005],fa[1000005];
long long dq,ans;
void dfs(int x,int f){
sz[x]=1,dp[x]=dp[f]+1,fa[x]=f;
for(int i=0;i<d[x].size();++i){
int v=d[x][i];
if(v==f)continue;
dfs(v,x);
sum[x]+=sum[v];
sz[x]+=sz[v];
if(sz[v]>sz[son[x]])son[x]=v;
}
}
void rdfs(int x,int tp1){
tp[x]=tp1;
for(int i=0;i<d[x].size();++i){
int v=d[x][i];
if(v==fa[x])continue;
if(v==son[x])rdfs(v,tp1);
else rdfs(v,v);
}
}
int lca(int x,int y){
while(tp[x]!=tp[y]){
if(dp[tp[x]]>=dp[tp[y]])x=fa[tp[x]];
else y=fa[tp[y]];
}
return dp[x]>dp[y]?y:x;
}
void cl(int x,int f){
dq+=1ll*(x-f)*sum[x];
ans^=dq;
for(int i=0;i<d[x].size();++i){
int v=d[x][i];
if(v==f)continue;
cl(v,x);
}
dq-=1ll*(x-f)*sum[x];
}
int main(){
int n,q;
scanf("%d %d",&n,&q);
for(int i=2,a,b;i<=n;++i){
scanf("%d %d",&a,&b);
d[a].push_back(b);
d[b].push_back(a);
}
dfs(1,0);
rdfs(1,1);
for(int i=1,x,y;i<=q;++i){
scanf("%d %d",&x,&y);
sum[x]++,sum[y]++;
int la=lca(x,y);
sum[la]-=2;
dq+=la;
}
dfs(1,0);
cl(1,0);
printf("%lld",ans);
}
D. 图操作
#include<bits/stdc++.h>
using namespace std;
int n,m,k,qx[500050],qy[500050];
int cnt[500050],f[500050],sz[500050],rt[500050],now;
long long tot[500050];
char op[500050][8];
int F(int x){return x==f[x]?x:F(f[x]);}
void Ad(int x,int y,int c)
{
now++;
tot[now]=tot[now-1];
cnt[now]=cnt[now-1];
rt[now]=0;
int fx=F(x),fy=F(y);
if(fx==fy)return;
if(sz[fy]>sz[fx])swap(fx,fy);
f[fy]=fx;
sz[fx]+=sz[fy];
cnt[now]++;
tot[now]+=c;
rt[now]=fy;
}
void Del(int x)
{
while(x--)
{
int r=rt[now--];
sz[f[r]]-=sz[r];
f[r]=r;
}
}
void Pr(int x)
{
printf("%lld\n",cnt[x]==n-1?tot[x]:0);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i,sz[i]=1;
for(int i=1;i<=m;i++)
{
scanf("%s",op[i]);
if(*op[i]=='A')scanf("%d%d",&qx[i],&qy[i]);
if(*op[i]=='D')scanf("%d",&qx[i]);
}
for(int i=1;i<=m;i++)
{
if(*op[i]=='A')
{
Ad(qx[i],qy[i],i);
Pr(now);
if(*op[i+1]=='R')Del(1);
}
else if(*op[i]=='D')
{
Pr(now-qx[i]);
if(*op[i+1]!='R')Del(qx[i]);
}
else Pr(now);
}
}
第78场组卷
A 二叉树
#include<cstdio>
#include<cstring>
const int P=1e8;
char s[10005];int L;
struct Bigint {
int n[705],l;
void operator +=(const Bigint &b) {
if(b.l>l)l=b.l;
for(int i=0; i<l; i++){n[i]+=b.n[i];if(n[i]>=P)n[i]-=P,n[i+1]++;}
while(n[l])l++;
}
void operator *=(const int &b) {
for(int i=0; i<l; i++)n[i]*=b;
for(int i=0; i<l; i++)n[i+1]+=n[i]/P,n[i]%=P;
while(n[l])l++;
}
void Print() {
printf("%d",n[l-1]);
for(int i=l-2; i>=0; i--)printf("%08d",n[i]);
}
} a,b;
int main() {
scanf("%s",s),L=strlen(s);
a.l=b.l=a.n[0]=b.n[0]=1;
for(int i=0; i<L; i++)
if(s[i]=='*')a*=5,a+=b,b*=3;
else if(s[i]!='P'){a*=2;if(s[i]=='R')a+=b;}
a.Print();
return 0;
}
B 字典序迷宫
#include<bits/stdc++.h>
using namespace std;
char a[2005][2005];
bool f[2005][2005];
int main(){
int n,m,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)cin>>a[i]+1;
f[1][1]=true;
cout<<a[1][1];
for(i=3;i<=n+m;i++){
char c='z';
for(j=1;j<i && j<=n;j++)if(i-j<=m && (f[j-1][i-j] || f[j][i-j-1]))c=min(c,a[j][i-j]);
cout<<c;
for(j=1;j<i&&j<=n;j++)if(i-j<=m && (f[j-1][i-j] || f[j][i-j-1]) && a[j][i-j]==c)f[j][i-j]=true;
}
return 0;
}
C热带花园
#include <bits/stdc++.h>
#define For(a,b,c) for(int a=b;a<=c;++a)
using namespace std;
enum{N=150100};
typedef int arr[N*2];
int n,m,p,q,x,y,e,sz1,sz2,tp,fi[N],se[N];
arr D1,D2,F1,F2,G1,G2,S,A;
bool B[N*2];
int fly (int u) {
S[++tp]=u;
B[u]=true;
if (!B[A[u]]) return fly(A[u]);
else if (A[u]==e) {
int sz=0;
do ++sz; while (S[tp--]!=A[u]);
return sz;
}
return 0;
}
void run (int *D,int u) {
D[u]=-1000000000;
if (D[A[u]]==-1) run(D,A[u]);
D[u]=D[A[u]]+1;
}
void eat (int *D,int *F,int *G,int &sz,int u) {
memset(D,-1,sizeof(A));
memset(B,false,sizeof(B));
tp=0,sz=fly(e=u),D[e]=0;
For(i,1,m*2)
if (D[i]==-1) run(D,i);
For(i,1,n)
if (D[fi[i]]>=0) {
if (sz) ++F[D[fi[i]]%sz];
++G[D[fi[i]]];
}
if (sz) For(i,sz,m*2) G[i]+=G[i-sz];
}
int main () {
scanf("%d%d%d",&n,&m,&p),++p;
For(i,1,m) {
scanf("%d%d",&x,&y),++x,++y;
if (!fi[x]) fi[x]=i*2-1;
else if (!se[x]) se[x]=i*2-1;
if (!fi[y]) fi[y]=i*2;
else if (!se[y]) se[y]=i*2;
A[i*2-1]=y,A[i*2]=x;
}
For(i,1,m*2)
if ((i+1)/2==(fi[A[i]]+1)/2&&se[A[i]]) A[i]=se[A[i]];
else A[i]=fi[A[i]];
eat(D1,F1,G1,sz1,fi[p]);
eat(D2,F2,G2,sz2,se[p]);
scanf("%d",&q);
while (q--) {
scanf("%d",&n);
if (n<=2*m) printf("%d\n",G1[n]+G2[n]);
else printf("%d\n",(sz1?F1[n%sz1]:0)+(sz2?F2[n%sz2]:0));
}
return 0;
}
D 树上统计
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5,MLOGM=2e6+5;
int h[M],to[M<<1],nx[M<<1],tot;
void add(int a,int b){
to[++tot]=b;
nx[tot]=h[a];
h[a]=tot;
}
int rt[M],lson[MLOGM],rson[MLOGM],n;
long long ans;
struct node{
int ls0,ls1,rs0,rs1,all;
long long sum;
}tr[MLOGM];
void add(node &now,node &ls,node &rs){
now.ls0=ls.ls0==ls.all?ls.ls0+rs.ls0:ls.ls0;
now.ls1=ls.ls1==ls.all?ls.ls1+rs.ls1:ls.ls1;
now.rs0=rs.rs0==rs.all?rs.rs0+ls.rs0:rs.rs0;
now.rs1=rs.rs1==rs.all?rs.rs1+ls.rs1:rs.rs1;
now.sum=1ll*ls.all*rs.all+ls.sum+rs.sum
-1ll*ls.rs0*rs.ls0-1ll*ls.rs1*rs.ls1;
}
void up(int p){
node ls,rs;
if(!lson[p]){
int len=tr[p].all-tr[rson[p]].all;
ls=(node){len,0,len,0,len,0};
rs=tr[rson[p]];
}else if(!rson[p]){
int len=tr[p].all-tr[lson[p]].all;
ls=tr[lson[p]];
rs=(node){len,0,len,0,len,0};
}else {
ls=tr[lson[p]];
rs=tr[rson[p]];
}
add(tr[p],ls,rs);
}
void build(int x,int &p,int l=1,int r=n){
p=++tot;
tr[p].all=r-l+1;
if(l==r){
tr[p]=(node){0,1,0,1,1,0};
return;
}
int mid=(l+r)>>1;
if(x<=mid)build(x,lson[p],l,mid);
else build(x,rson[p],mid+1,r);
up(p);
}
int Merge(int x,int y){
if(!x||!y)return x|y;
lson[x]=Merge(lson[x],lson[y]);
rson[x]=Merge(rson[x],rson[y]);
up(x);
return x;
}
void dfs(int x=1,int f=0){
build(x,rt[x]);
for(int i=h[x];i;i=nx[i]){
int y=to[i];
if(y==f)continue;
dfs(y,x);
rt[x]=Merge(rt[x],rt[y]);
}
ans+=tr[rt[x]].sum;
}
int main(){
scanf("%d",&n);
for(int a,b,i=1;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
dfs();
printf("%lld\n",ans);
return 0;
}