CF1835 题解
CF1835 题解
A
考虑到
按上述过程模拟,注意细节。
#include<bits/stdc++.h>
using namespace std;
int a,b,c,A,B,C,maxc,maxb,maxa;
long long k;
inline int pow(int x,int tms)
{
int ret = 1;
for(int i = 1;i <= tms;i++) ret *= x;
return ret;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>a>>b>>c>>k;
maxa = pow(10,a); maxb = pow(10,b); maxc = pow(10,c);
if(max(a,b) < c - 1){puts("-1");continue;}
for(A = maxa / 10;A < maxa;A++)
{
B = maxb / 10;
C = A + B;
if(C < maxc / 10){B += maxc / 10 - C;C = maxc / 10;}
if(C >= maxc) break;
if(B >= maxb) continue;
if(k > min(maxc - C,maxb - B)) k -= min(maxc - C,maxb - B);
else
{
B += k - 1; C += k - 1;
cout<<A<<" + "<<B<<" = "<<C<<endl;
k = 0;
break;
}
}
if(k) puts("-1");
}
return 0;
}
B
如果我们确定了最后一个人选的位置
考虑我们不能枚举每一个
从左向右询问
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
ll n,m,k,pm = 1,px = 1;
ll a[N];
inline ll calc(ll x)
{
while(pm <= n && a[pm] < x) ++pm;
while(px <= n && a[px] <= x) ++px;
ll l,r;
l = ((px - k > 0) ? x - (x - a[px - k] + 1) / 2 + 1: 0);
r = ((pm + k - 1 <= n) ? x + (a[pm + k - 1] - x + 1) / 2 - 1 : m);
return max(0ll,r - l + 1);
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i = 1;i <= n;i++) cin>>a[i];
a[n + 1] = m + 1;
sort(a + 1,a + n + 1);
ll ans = calc(0),mxpos = 0;
for(ll i = 1,nl,nr;i <= n;i++)
{
if(i == 1) nl = max(0ll,a[i] - 2);
else nl = max(a[i] - 2,a[i - 1] + 3);
nr = min(m,a[i] + 2);
for(ll j = nl;j <= nr;j++)
{
ll now = calc(j);
if(now > ans) ans = now,mxpos = j;
}
}
cout<<ans<<" "<<mxpos;
return 0;
}
C
我们发现数据十分特殊,异或前缀和一下变成是否有
所以并不存在
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 5;
int n,m,jdg = 0;
ll a[N],pre[N],vis[N];
map <ll,pair<int,int> > p;
inline void calc(int l,int r)
{
if(p.find(a[l - 1] ^ a[r]) == p.end())
{
p[a[l - 1] ^ a[r]] = make_pair(l,r);
return;
}
pair <int,int> res = p[a[l - 1] ^ a[r]];
if(res.second < l) cout<<res.first<<" "<<res.second<<" "<<l<<" "<<r<<endl;
else if(res.first <= l && l <= res.second) cout<<res.first<<" "<<l - 1<<" "<<res.second + 1<<" "<<r<<endl;
else if(res.first > l) cout<<l<<" "<<res.first - 1<<" "<<res.second + 1<<" "<<r<<endl;
jdg = 1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
p.clear();
cin>>n; jdg = 0;
m = (1 << (n + 1));
for(int i = 1;i <= m;i++) cin>>a[i];
for(int i = 2;i <= m;i++) a[i] ^= a[i - 1];
for(int i = 0;i <= m / 2;i++) vis[i] = -1;
vis[0] = 0;
for(int i = 1;i <= m;i++)
{
if(vis[(a[i] >> n)] != -1) calc(vis[(a[i] >> n)] + 1,i);
vis[(a[i] >> n)] = i;
if(jdg) break;
}
}
return 0;
}
D
首先缩点,将原图缩成一些
由裴蜀定理可得,一些环长能凑出的长度是
考虑满足条件的
所以
开桶分别计算即可。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct Edge{
int v,next;
}e[N * 2];
typedef long long ll;
ll k;
int d,n,m,head[N],dfn[N],vis[N],cnt = 0,low[N],belong[N],tot = 0,top = 0,s[N],dep[N],pot[N];
vector <int> pts[N];
inline void add(int x,int y)
{
++tot;
e[tot].v = y;
e[tot].next = head[x];
head[x] = tot;
}
inline void tarjan(int x)
{
dfn[x] = low[x] = ++tot;
vis[x] = 1;
s[++top] = x;
for(int i = head[x];i;i = e[i].next)
{
int to = e[i].v;
if(!dfn[to])
{
tarjan(to);
low[x] = min(low[x],low[to]);
}
else if(vis[to])
low[x] = min(low[x],dfn[to]);
}
if(dfn[x] == low[x])
{
++cnt;
while(s[top + 1] != x)
{
belong[s[top]] = cnt;
pts[cnt].push_back(s[top]);
vis[s[top]] = 0;
--top;
}
}
}
inline void dfs(int x)
{
vis[x] = 1;
for(int i = head[x];i;i = e[i].next)
{
int to = e[i].v;
if(belong[to] != belong[x]) continue;
if(!vis[to])
{
dep[to] = dep[x] + 1;
dfs(to);
}
else
d = __gcd(d,abs(dep[to] - dep[x] - 1));
}
}
int main()
{
cin>>n>>m>>k;
for(int i = 1,x,y;i <= m;i++)
{
cin>>x>>y;
add(x,y);
}
tot = 0;
for(int i = 1;i <= n;i++) if(!dfn[i]) tarjan(i);
memset(vis,0,sizeof(vis));
ll ans = 0;
for(int i = 1;i <= n;i++)
{
if(vis[i]) continue;
dep[i] = 1;
d = 0;
dfs(i);
if(!d) continue;
int max_dep = 0;
for(auto in : pts[belong[i]])
{
pot[dep[in]]++;
max_dep = max(max_dep,dep[in]);
}
if(k % d == 0)
{
for(int j = 1;j <= max_dep;j++)
{
ans += 1ll * pot[j] * (pot[j] + 1) / 2;
if(j > d)
{
ans += 1ll * pot[j] * pot[j - d];
pot[j] += pot[j - d];
}
}
}
else if((k % d) * 2 == d)
{
for(int j = d / 2 + 1;j <= max_dep;j++)
{
ans += 1ll * pot[j] * pot[j - d / 2];
pot[j] += pot[j - d];
}
}
fill(pot,pot + max_dep + 1,0);
}
cout<<ans;
return 0;
}
E
学习了洛谷上 Solystic 神犇的做法。
考虑当前策略只和几个信息有关:是否知道
-
如果不知道
:-
如果知道下一个敲的字母,直接敲即可。
-
如果不知道,就随便乱按,按错了就找出
然后删掉即可。
-
-
如果知道
:-
如果知道下一个敲的字母,直接敲。
-
如果不知道,就随便乱按,按错了就删掉。
-
我们发现只有遇到新字符是我们才可能乱按。
设
1:不知道
2:不知道
3:知道
4:知道
转移有
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5,M = 1005,MOD = 1e9 + 7;
int n,m,a[N],l[M],cnt = 0,vis[M];
typedef long long ll;
ll inv[N],f[M][M][5];
inline void add(ll &x,ll y){x = (x + y) % MOD;}
int main()
{
cin>>n>>m;
memset(l,0,sizeof(l));
for(int i = 1;i <= n;i++)
{
cin>>a[i];
if(!vis[a[i]]) vis[a[i]] = 1,l[cnt] = i - 1,++cnt;
}
l[cnt] = n;
memset(f,0,sizeof(f));
inv[1] = 1;
for(int i = 2;i <= M - 1;i++) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
for(int i = cnt - 1;i >= 0;i--)
for(int j = m - i;j >= 0;j--)
{
if(m - i - j > 0)
{
add(f[i][j][4],inv[m - i - j] * ((f[i + 1][j][3] + l[i + 1] - l[i]) % MOD) % MOD);
add(f[i][j][4],(m - i - j - 1) * inv[m - i - j] % MOD * (f[i][j + 1][4] + 2) % MOD);
}
if(j > 0) add(f[i][j][3],j * inv[m - i] % MOD * ((f[i + 1][j - 1][3] + l[i + 1] - l[i]) % MOD) % MOD);
add(f[i][j][3],(m - i - j) * inv[m - i] % MOD * f[i][j][4] % MOD);
add(f[i][j][2],(m - i - j) * inv[m - i - j + 1] % MOD * (f[i][j + 1][2] + 2) % MOD);
if(j > 0) add(f[i][j][2],inv[m - i - j + 1] * (j - 1) % MOD * inv[m - i - 1] % MOD * ((f[i + 1][j - 1][3] + l[i + 1] - l[i]) % MOD) % MOD);
add(f[i][j][2],inv[m - i - j + 1] * (m - i - j) % MOD * inv[m - i - 1] % MOD * f[i][j][4] % MOD);
if(j == 0)
{
add(f[i][0][1],inv[m - i + 1] * ((f[i + 1][0][1] + l[i + 1] - l[i]) % MOD) % MOD);
add(f[i][0][1],inv[m - i + 1] * (f[i][0][3] + 1 + (i != 0)) % MOD);
add(f[i][0][1],(m - i - 1) * inv[m - i + 1] % MOD * (f[i][1][2] + 2) % MOD);
}
}
cout<<f[0][0][1];
return 0;
}
F
咕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话