ARC 杂题
ARC150C Path and Subsequence
考试题削弱版。
给你一个无向图,点
枚举
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+3;
int n,m,s;
vector<int>e[maxn];
queue<int>q,p;
int vis[maxn];
int c[maxn],b[maxn];
void dfs(int u,int t){
for(int v:e[u]){
if(vis[v]==-1){
vis[v]=t;
if(c[v]!=b[t+1]){
dfs(v,t);
}else{
p.push(v);
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m>>s;
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++) cin>>c[i],vis[i]=-1;
for(int i=1;i<=s;i++) cin>>b[i];
e[0].push_back(1);
vis[0]=0;
q.push(0);
for(int i=0;i<=s;i++){
while(!q.empty()){
int j=q.front();
q.pop();
vis[j]=i;
dfs(j,i);
}
q=p;
while(!p.empty()) p.pop();
}
if(vis[n]==s) cout<<"Yes";
else cout<<"No";
return 0;
}
ARC185E Adjacent GCD
给你一个数列
设
由于有
把与
记
所以最后的式子就是
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+7;
const int mod=998244353;
int n;
int a[maxn];
int f[maxn],g[maxn],po2[maxn],k[maxn],val[maxn];
vector<int>v[maxn];
signed main(){
cin>>n;
po2[0]=1;
for(int i=1;i<=n;i++){
cin>>a[i];
po2[i]=po2[i-1]*2%mod;
}
for(int i=1;i<=100000;i++){
k[i]+=i; v[i].emplace_back(i);
for(int j=2*i;j<=100000;j+=i){
k[j]-=k[i];
v[j].emplace_back(i);
}
}
for(int x=1;x<=n;x++){
f[x]=2*f[x-1];
for(int d:v[a[x]]){
f[x]=(f[x]+k[d]*val[d]%mod)%mod;
val[d]=(val[d]+po2[x-1])%mod;
}
cout<<f[x]<<'\n';
}
return 0;
}
ARC183C Not Argmax
求满足
考虑没有限制时怎么 DP,设
加上限制即记个标记
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=507;
const int maxm=2e5+7;
const int mod=998244353;
int n,m;
int f[maxn][maxn],fac[maxn],ifac[maxn];
bitset<maxn>is[maxn][maxn];
int qpow(int a,int b){
int res=1;
for(;b;b>>=1,a=a*a%mod) if(b&1) res=res*a%mod;
return res;
}
int C(int a,int b){
if(a<b) return 0;
return fac[a]*ifac[a-b]%mod*ifac[b]%mod;
}
signed main(){
cin>>n>>m;
for(int i=1,l,r,x;i<=m;i++){
cin>>l>>r>>x;
is[l][r][x]=1;
if(l==r){
cout<<"0\n";
return 0;
}
}
for(int len=2;len<=n;len++)
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
is[l][r]|=is[l+1][r];
is[l][r]|=is[l][r-1];
}
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
ifac[n]=qpow(fac[n],mod-2);
for(int i=n-1;~i;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
f[1][0]=1;
for(int i=1;i<=n;i++) f[i][i]=f[i+1][i]=1;
for(int len=2;len<=n;len++)
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
for(int k=l;k<=r;k++) if(!is[l][r][k])
f[l][r]=(f[l][r]+f[l][k-1]*f[k+1][r]%mod*C(r-l,k-l)%mod)%mod;
}
cout<<f[1][n];
return 0;
}
ARC186B Typical Permutation Descriptor
给你一个序列
由于保证有解,考虑观察有解的情况所带来的性质:
- 区间
要么把前面的若干区间完全包含,要么左端点与相邻区间端点相交;
由性质 1 与偏序关系可知,假如以偏序关系(大于号连接的两边)连边,
这棵树的性质很好啊,当你用拓扑序遍历这棵树他一定合法,即为充分必要条件了,虽然我没看出来。
接下来就是一个裸的树上拓扑序计数了,也是个结论,即
证明:
考虑树形 DP。设为以 为根子树的拓扑序数量。
考虑合并两棵子树,先把两棵子树的方案数乘起来然后考虑顺序,即在 个数里选掉 个数。更一般的,多个子树相当于叠加,而且组合约掉了,则有转移 考虑把每个
与 相抵消,剩下 以及 ,写得好看点,都乘个 ,即得上式。
时间复杂度
ARC187B Sum of CC
给你一个长为
开始直接看错题,以为是图中的边数,直接干瞪 2h 无果。
考虑发现一些性质,手玩发现所有的连通块形成区间。且左边的最小值大于右边的最大值。这个证明随便找三个数玩一下就出来了。
所以记录前缀
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2007;
const int mod=998244353;
int n,m;
int a[maxn],fac[maxn],ifac[maxn];
int h[maxn],g[maxn],mx[maxn],mi[maxn],pmx[maxn],pmi[maxn];
void add(int &x,int y){x+=y;if(x>=mod) x-=mod;}
void mul(int &x,int y){x=x*y%mod;}
int qpow(int a,int b){
int res=1;
for(;b;b>>=1,a=a*a%mod) if(b&1) res=res*a%mod;
return res;
}
int C(int a,int b){
if(a<b) return 0;
return fac[a]*ifac[b]%mod*ifac[a-b]%mod;
}
signed main(){
cin>>n>>m;
fac[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
ifac[n]=qpow(fac[n],mod-2);
for(int i=n-1;~i;i--)
ifac[i]=ifac[i+1]*(i+1)%mod;
pmi[0]=m;
for(int i=1;i<=n;i++){
cin>>a[i];
g[i]=g[i-1]+(a[i]==-1);
if(a[i]!=-1) pmi[i]=min(pmi[i-1],a[i]);
else pmi[i]=pmi[i-1];
}
for(int i=n;i;i--){
pmx[i]=max(pmx[i+1],a[i]);
h[i]=h[i+1]+(a[i]==-1);
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) mi[j]=mx[j]=0;
for(int j=1;j<=pmi[i];j++) mi[j]=qpow(m-j+1,g[i]);
for(int j=pmx[i+1];j<=m;j++) mx[j]=qpow(j,h[i+1]);
for(int j=2;j<=m;j++) add(ans,mi[j]*(mx[j-1]-mx[j-2]+mod)%mod);
}
add(ans,qpow(m,g[n]));
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通