【比赛记录】24.10.29
记录
A 一个
题解
A. T392580 palin
考虑从左上角和右下角向中间 DP,显然可以设
所以设
一共各走
#include<iostream>
using namespace std;
const int N=5e2+10;
const int mod=993244853;
void add(int &a,int b){a+=b;if(a>=mod)a-=mod;}
int n,m,res,st,f[2][N][N];
char a[N][N];
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m,st=(n+m-2)/2;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=m;j>=1;j--) a[i][j]=a[i][j-1];
}
if(a[1][1]!=a[n][m]) {cout<<0; return 0;}
f[0][0][0]=1;
for(int i=1;i<=st;i++)
{
int now=i%2,last=1-now;
for(int j=0;j<=i;j++) for(int k=0;k<=i;k++)
{
f[now][j][k]=0;
if(j>=n||k>=n||i-j>=m||i-k>=m) continue;
if(a[j+1][i-j+1]!=a[n-k][m-(i-k)]) continue;
if(j&&k) add(f[now][j][k],f[last][j-1][k-1]);
if(j&&i-k) add(f[now][j][k],f[last][j-1][k]);
if(k&&i-j) add(f[now][j][k],f[last][j][k-1]);
if(i-j&&i-k) add(f[now][j][k],f[last][j][k]);
}
}
if((n+m-2)%2) for(int i=0;i<n;i++)
{
add(res,f[st%2][i][n-1-i]);
if(n-2-i>=0) add(res,f[st%2][i][n-2-i]);
}
else for(int i=0;i<n;i++) add(res,f[st%2][i][n-1-i]);
cout<<res;
return 0;
}
B. T392683 Qsort
模拟一下发现,若 nan 作为基准值,则所有的
因此从左到右处理每个数,若已经被其他的数排序时提前,或者该数是 nan 则跳过,否则将后面所有小于
#include<iostream>
#include<vector>
#include<queue>
#define pii pair<int,int>
using namespace std;
const int N=5e5+10;
int n,ct,a[N],res[N];
bool vis[N];
string ts;
int getn()
{
int len=ts.size(),tr=0;
for(int i=0;i<len;i++) tr=tr*10+ts[i]-'0';
return tr;
}
priority_queue <pii,vector<pii>,greater<pii> > q;
void sol()
{
cin>>n,ct=0;
while(q.size()) q.pop();
for(int i=1;i<=n;i++) cin>>ts,a[i]=(ts[0]=='n'?0:getn()),vis[i]=0;
for(int i=1;i<=n;i++) if(a[i]) q.push({a[i],i});
for(int i=1;i<=n;i++) if(!vis[i])
{
if(!a[i]) {res[++ct]=a[i]; continue;}
while(q.size())
{
pii te=q.top(); int x=te.first,y=te.second;
if(x>=a[i]) break;
if(y<=i) {q.pop(); continue;}
vis[y]=1,res[++ct]=a[y],q.pop();
}
res[++ct]=a[i];
}
for(int i=1;i<=ct;i++)
{
if(res[i]) cout<<res[i]<<' ';
else cout<<"nan ";
}
cout<<'\n';
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int TT; cin>>TT;
while(TT--) sol();
return 0;
}
C. T392686 chaoticevil
首先若
考虑如果给
因此我们将
#include<iostream>
#define int long long
using namespace std;
const int N=8e5+10;
int n,m,q,rt,ct,sr,ch[N][2],fa[N],w[N],aa[N][2];
int son[N],top[N],de[N],siz[N],id[N],ta[N];
struct sgmtt
{
int t=1,lc[N],rc[N],le[N],s[N],tag[N];
void pushup(int u) {s[u]=s[lc[u]]+s[rc[u]];}
void pt(int u,int k) {s[u]+=k*le[u],tag[u]+=k;}
void pushdown(int u) {if(tag[u]) pt(lc[u],tag[u]),pt(rc[u],tag[u]),tag[u]=0;}
void build(int u,int l,int r,bool tf)
{
if(l==r) {le[u]=aa[l][tf]; return;}
int mid=(l+r)/2;
lc[u]=++t,build(t,l,mid,tf);
rc[u]=++t,build(t,mid+1,r,tf);
pushup(u),le[u]=le[lc[u]]+le[rc[u]];
}
void update(int u,int l,int r,int ll,int rr,int k)
{
if(l>=ll&&r<=rr) {pt(u,k); return;}
int mid=(l+r)/2; pushdown(u);
if(ll<=mid) update(lc[u],l,mid,ll,rr,k);
if(rr>mid) update(rc[u],mid+1,r,ll,rr,k);
pushup(u);
}
int query(int u,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr) return s[u];
int mid=(l+r)/2,res=0; pushdown(u);
if(ll<=mid) res+=query(lc[u],l,mid,ll,rr);
if(rr>mid) res+=query(rc[u],mid+1,r,ll,rr);
return res;
}
}T[2];
void dfs(int u)
{
siz[u]=1,de[u]=de[fa[u]]+1;
if(u<=n) {w[u]=1; return;}
for(int i=0;i<2;i++)
{
int c=ch[u][i]; dfs(c),w[u]+=w[c],siz[u]+=siz[c];
if(siz[c]>siz[son[u]]) son[u]=c;
}
}
void dfsb(int u,int to)
{
id[u]=++ct,top[u]=to;
if(!son[u]) return;
dfsb(son[u],to);
for(int i=0;i<2;i++)
{
int c=ch[u][i];
if(c!=son[u]) dfsb(c,c),aa[id[u]][i]=w[c];
}
}
void update(bool tf,int l,int r,int k) {T[tf].update(1,1,m,l,r,k);}
int query(bool tf,int l,int r) {return T[tf].query(1,1,m,l,r);}
int flca(int x,int y)
{
if(x<0||y>n) return -1;
while(top[x]!=top[y])
{
if(de[top[x]]<de[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(de[x]>de[y]) swap(x,y);
return x;
}
void add(int x,int to,int k,bool tf)
{
while(top[x]!=top[to])
{
if(x!=top[x]) update(tf,id[top[x]],id[fa[x]],k),x=top[x];
if(x!=ch[fa[x]][tf]) ta[x]+=k;
x=fa[x];
}
if(x!=to) update(tf,id[to],id[fa[x]],k);
}
int ask(int x,int to,bool tf)
{
int res=0;
while(top[x]!=top[to])
{
if(x!=top[x]) res+=query(tf,id[top[x]],id[fa[x]]),x=top[x];
if(x!=ch[fa[x]][tf]) res+=ta[x]*w[ch[fa[x]][tf]];
x=fa[x];
}
if(x!=to) res+=query(tf,id[to],id[fa[x]]);
return res;
}
void opa(int l,int r,int lca,int x)
{
if(l==1&&r==n) sr+=x*n;
else if(l==1) add(r+1,rt,x,0);
else if(r==n) add(l-1,rt,x,1);
else add(l-1,ch[lca][0],x,1),add(r+1,ch[lca][1],x,0);
}
int opb(int l,int r,int lca)
{
if(l==1&&r==n) return sr;
if(l==1) return ask(r+1,rt,0);
if(r==n) return ask(l-1,rt,1);
return ask(l-1,ch[lca][0],1)+ask(r+1,ch[lca][1],0);
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>q,m=n*2-1;
for(int i=n+1;i<=m;i++) cin>>ch[i][0]>>ch[i][1],fa[ch[i][0]]=fa[ch[i][1]]=i;
for(int i=n+1;i<=m;i++) if(!fa[i]) rt=i;
dfs(rt),dfsb(rt,rt),T[0].build(1,1,m,0),T[1].build(1,1,m,1);
while(q--)
{
int op,l,r,x,lca; cin>>op>>l>>r,lca=flca(l-1,r+1);
if(op==1) cin>>x,opa(l,r,lca,x);
else cout<<opb(l,r,lca)<<'\n';
}
return 0;
}