ABC 341 A-F题解
D感觉出得很好,ABCEF经典,G不作评价不会哈哈
代码可能不太好,仅供参考
A Print 341
模拟
B Foreign Exchange
能往后面放就一直放,贪心即可
C Takahashi Gets Lost
因为N很小,所以支持每次跑全图的复杂度,建图根据题意bfs跑即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
void solved()
{
int n,m,d;
string s;
cin>>n>>m>>d>>s;
vector<string> g(n+1);
vector<vector<int>> st(n+1,vector<int>(m+1));
for(int i=1;i<=n;i++) cin>>g[i];
for(int i=1;i<=n;i++) g[i]='W'+g[i];
auto check=[&](int i,int j){
int dx=i,dy=j;
for(int i=0;s[i];i++){
if(s[i]=='U') dx--;
if(s[i]=='D') dx++;
if(s[i]=='L') dy--;
if(s[i]=='R') dy++;
if(dx<1||dx>n||dy<1||dy>m||g[dx][dy]=='#'){
pair<int,int> k={-1,-1};
return k;
}
}
pair<int,int> k={dx,dy};
return k;
};
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;g[i][j];j++){
if(g[i][j]=='.'){
auto [u,v]=check(i,j);
if(u==-1) continue;
if(!st[u][v]) st[u][v]=1,ans++;
}
}
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
//cin>>t;
while (t--)
{
solved();
}
}
D Only one of two
题意就是给你一个二个不同的数,除开他们公倍数,求能被他们整除的第k个数
思路:首先考虑公倍数一定是最小公倍数的倍数,假设第K个数为L,那么他满足的性质是什么呢?(L/N)+(L/M)-2(L/公倍数)=k。 可以看出,如果L成立,那么X>=L是一定满足:(X/N)+(X/M)-2(X/公倍数)>=k,故可以二分查找满足当前性质的最小数,即L本身 复杂度log
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
void solved()
{
int n,m,k;
cin>>n>>m>>k;
if(n>m) swap(n,m);
int l=1,r=m*k;
int d=__gcd(n,m);
d=n*m/d;
auto check=[&](int mid){
int a=(mid)/n;
int b=(mid)/m;
int c=(mid)/d;
if(a+b-2*c>=k) return true;
return false;
};
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
//cin>>t;
while (t--)
{
solved();
}
}
E Alternating String
经典题目 01串翻转,根据题意考虑A[i]=(s[i]==s[i+1]?0:1),那么如果(r,l)是好串,那么A[l]+A[l+1]+....+A[r-1] 一定等于r-l,考虑操作1的影响,翻转只影响2个端点不影响中间的关系,操作2需要我们求区间和,考虑树状数组维护,操作1就是端点取反。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=5e5+10;
int tree[N];
void updata(int idx,int k){
if(!idx) return ;
while(idx<=N){
tree[idx]+=k;
idx+=(idx)&(-idx);
}
}
int query(int idx){
int res=0;
while(idx>0){
res+=tree[idx];
idx-=(-idx)&(idx);
}
return res;
}
int rangeq(int l,int r){
return query(r)-query(l-1);
}
void solved(){
int n,q;
cin>>n>>q;
string s;
cin>>s;
s='#'+s;
for(int i=1;s[i+1];i++){
if(s[i]==s[i+1]) updata(i,0);
else updata(i,1);
}
while(q--){
int op,l,r;
cin>>op>>l>>r;
if(op==1){
if(rangeq(l-1,l-1)==1) updata(l-1,-1);
else updata(l-1,1);
if(rangeq(r,r)==1) updata(r,-1);
else updata(r,1);
}
else{
//cout<<rangeq(l,r-1)<<endl;
if(l==r) cout<<"Yes"<<endl;
else if(rangeq(l,r-1)==(r-l)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
//cin>>t;
while (t--)
{
solved();
}
}
F Breakdown
首先考虑一个问题,如果我从端点X发给,A B C,那么我能玩多次呢?,显然是 1+A的次+B的次+C的次,这是一个dp问题,题目限制我们不能全选,有和的限制,其实就是类似背包问题的体积限制,对于点X把所有满足条件的相邻点拿出来跑一个01背包即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=5e3+10;
int dp[N],a[N],w[N],st[N];
vector<int> e[N+1];
void dfs(int u){
st[u]=1;
vector<int> v,f(w[u]);
for(auto &k:e[u]){
if(w[k]>=w[u]) continue;
if(dp[k]){
v.push_back(k);
continue;
}
dfs(k);
v.push_back(k);
}
if(v.size()==0){
dp[u]=1;
return ;
}
for(int i=0;i<v.size();i++){
for(int j=w[u]-1;j>=w[v[i]];j--){
f[j]=max(f[j],f[j-w[v[i]]]+dp[v[i]]);
}
}
dp[u]=f[w[u]-1]+1;
}
void solved(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(!dp[i]) dfs(i);
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=dp[i]*a[i];
}
cout<<ans<<endl;
}
signed main()
{
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
int t = 1;
//cin>>t;
while (t--)
{
solved();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?