A. Shortest Path with Obstacle

当两个点的x坐标或者y坐标相同的时候,需要多花2费绕开

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
void solve()
{int x1,y1,x2,y2,x3,y3;cin>>x1>>y1>>x2>>y2>>x3>>y3;int ans;if(x1==x2&&x2==x3&&y3<=max(y1,y2)&&y3>=min(y1,y2))ans=abs(y2-y1)+2;else if(y1==y2&&y2==y3&&x3<=max(x1,x2)&&x3>=min(x1,x2))ans=abs(x2-x1)+2;else ans=abs(x1-x2)+abs(y1-y2);cout<<ans<<endl;
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

B. Alphabetical Strings

某个字符数量大于1则无解,记录a的位置。若没有a的位置则无解。然后从a的位置用双指针l r,看看l-1或者r+1位置的字符是不是我们要的,是的话移动指针,依次判断每个字符,最后判断r-l+1是否是(最大字符-最小字符+1)即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char s[N];
void solve()
{map<char,int>cnt;    cin>>s+1;int n=strlen(s+1),l=0,r=0;char ma='a';for(int i=1;i<=n;i++){cnt[s[i]]++;if(s[i]=='a')l=r=i;ma=max(ma,s[i]);}for(auto i:cnt){if(i.second>1||!l){puts("no");return ;}}char now='b';while(now<=ma){if(s[l-1]==now)l--;else if(s[r+1]==now)r++;now++;}if(r-l+1==ma-'a'+1)puts("yes");else puts("no");
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

C. Pair Programming

每次取出a,b数组中较小的数字即可。如果较小的取出来也不合法,那就无解。最后如果某个数组有剩余元素也记得取出来。用两个队列或者两个指针模拟即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;int a[N],b[N];
void solve()
{int k,n,m;cin>>k>>n>>m;for(int i=1; i<=n; i++)cin>>a[i];for(int i=1; i<=m; i++)cin>>b[i];int i=1,j=1;vector<int>ans;bool f=1;while(i<=n&&j<=m){if(k<min(a[i],b[j])){f=0;break;}if(a[i]<b[j]){if(a[i]==0)k++;ans.push_back(a[i]);i++;}else{if(b[j]==0)k++;ans.push_back(b[j]);j++;}}while(i<=n){if(k<a[i]){f=0;break;}if(a[i]==0)k++;ans.push_back(a[i]);i++;}while(j<=m){if(k<b[j]){f=0;break;}if(b[j]==0)k++;ans.push_back(b[j]);j++;}if(f){for(auto i:ans)printf("%d ",i);puts("");}else puts("-1");
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

D. Co-growing Sequence

首先确定b数组可以用递推的方式,先看第一个和第二个数,我肯定是对第二个数操作更好,因为这样字典序更小。所以b[1]=0。若要满足a[i-1]&a[i]=a[i-1],即让a[i]=a[i-1]|a[i],记录一下上一个a[i-1]^b[i-1]的值记做x。那么(x|a[i])^a[i]就是b[i]的值。^b[i]相当于补一些值给他。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
void solve()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];printf("0");int now;for(int i=2;i<=n;i++){now=(a[i-1]|a[i])^a[i];printf(" %d",now);a[i]|=a[i-1];}puts("");
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

E. Air Conditioners(dp)

l[i]为只考虑i左侧所有空调对i的温度最小值。那么l[i]=min(l[i-1]+1,c)c为i这个点的空调温度,如果这个点没有空调c取无穷大即可,或者写个if判断一下。同理记录一个r[i]最后对每个点取min(l[i],r[i])就是答案

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,inf=0x3f3f3f3f;
int l[N],r[N],a[N],b[N];
void solve()
{int n,k;cin>>n>>k;for(int i=1;i<=k;i++)cin>>a[i];for(int i=1;i<=k;i++)cin>>b[i];map<int,int>m;for(int i=1;i<=k;i++)m[a[i]]=b[i];l[0]=inf,r[n+1]=inf;for(int i=1;i<=n;i++){l[i]=l[i-1]+1;if(m[i])l[i]=min(l[i],m[i]);}for(int i=n;i>=1;i--){r[i]=r[i+1]+1;if(m[i])r[i]=min(r[i],m[i]);}for(int i=1;i<=n;i++)printf("%d ",min(l[i],r[i]));puts("");
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

F. Array Stabilization (GCD version)(二分,线段树)

建立一颗线段树,维护l-r的gcd
将原来的数组复制一份到数组的尾巴。
二分操作次数k。然后检查是不是所有的i~i+k+1-1gcd都一样即可。

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10,inf=0x3f3f3f3f;
int w[N],n,q,k;
struct node
{int l,r;int v;
} tr[4*N];
inline void pushup(int u)
{tr[u].v=__gcd(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r)
{if(l==r){tr[u]= {l,l,w[l]};return ;}tr[u]= {l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
int query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;int mid=tr[u].l+tr[u].r>>1;int v=0;if(l<=mid)v=query(u<<1,l,r);if(r>mid)v=__gcd(query(u<<1|1,l,r),v);return v;
}
bool check(int mid)
{mid++;int now=query(1,1,mid);for(int i=2;i+mid-1<=n;i++){if(query(1,i,i+mid-1)!=now)return 0;}return 1;
}
void solve()
{cin>>n;for(int i=1;i<=n;i++)scanf("%d",&w[i]),w[i+n]=w[i];n*=2;build(1,1,n);int l=0,r=1e6;while(l<r){int mid=l+r>>1;if(check(mid))r=mid;else l=mid+1;}printf("%d\n",r);
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}

G. How Many Paths? (tarjan缩点,拓扑排序,dp)

首先缩点,然后对强连通分量建图,在强连通分量上跑拓扑排序dp即可。
有几个坑点
1.注意自环要特判
2.假如某个点x存在自环。若1号点到不了x,那么x点的答案应该是0,而不是-1
3.强连通分量大小>1则这个分量里所有点距离设成无穷大
具体看代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10,inf=0x3f3f3f3f;
int dfn[N],low[N],scc_cnt,id[N],Size[N],times,stk[N],top;
ll ans[N],res[N];
bool in[N],vis[N];
vector<int>g[N];
vector<int>G[N];
void tarjan(int u)
{dfn[u]=low[u]=++times;stk[++top]=u,in[u]=1;for(auto j:g[u]){if(!dfn[j]){tarjan(j);low[u]=min(low[u],low[j]);}else if(in[j])low[u]=min(low[u],dfn[j]);}if(dfn[u]==low[u]){int y;scc_cnt++;do{y=stk[top--];in[y]=0;id[y]=scc_cnt;Size[scc_cnt]++;}while(y!=u);}
}
void solve()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){res[i]=ans[i]=vis[i]=0;g[i].clear();G[i].clear();times=scc_cnt=in[i]=dfn[i]=low[i]=Size[i]=stk[i]=id[i]=top=0;}unordered_map<int,int>ban;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;if(u!=v)g[u].push_back(v);else ban[u]=1;}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=n;i++)for(auto j:g[i]){int a=id[i],b=id[j];if(a!=b)G[a].push_back(b);}ans[id[1]]=1;vis[id[1]]=1;for(auto i:ban)ans[id[i.first]]=-inf;for(int i=1;i<=n;i++)if(Size[id[i]]>1)ans[id[i]]=-inf;for(int i=id[1];i;i--)for(auto j:G[i]){ans[j]+=ans[i];if(vis[i])vis[j]=1;ans[j]=min(ans[j],2ll);}for(int i=1;i<=n;i++){if(!vis[id[i]])res[i]=0;else if(ans[id[i]]<0)res[i]=-1;else res[i]=ans[id[i]];printf("%lld ",res[i]);}puts("");
}
int main()
{int t;cin>>t;while(t--){solve();}return 0;
}
/*
1
3 3
1 1
2 2
3 3
*/

Codeforces Round #731 (Div. 3)(ABCDEFG)相关推荐

  1. Codeforces Round #249 (Div. 2) (模拟)

    Codeforces Round #249 (Div. 2) (模拟) C. Cardiogram time limit per test 1 second memory limit per test ...

  2. Codeforces Round #791 (Div. 2)(A-D)

    Codeforces Round #791 (Div. 2)(A-D) A. AvtoBus 题意: 给你 n, 问满足 4x+6y=n4x+6y=n4x+6y=n 的 x+yx+yx+y的最小值和最 ...

  3. Codeforces Round #613 (Div. 2)(B-D)

    Codeforces Round #613 (Div. 2) B -抢时间&手感生疏->(第n + 1次)被long long卡掉- C 又一次败给了常识-EC的M题也是一个关于素数的暴 ...

  4. Codeforces Round #736 (Div. 2)(B-C)

    Codeforces Round #736 (Div. 2) 花了十分钟帮朋友写了B,C就睡觉了,自己没打 B 先看上,再看左后看右 #include <iostream> #includ ...

  5. Codeforces Round #735 (Div. 2)(A-D)没有B

    Codeforces Round #735 (Div. 2) A 一道小思维题 #include <bits/stdc++.h> using namespace std; #define ...

  6. Codeforces Round #644 (Div. 3)(A-E)

    这场的A-E都是水题,就简单记录一下吧. Minimal Square CodeForces - 1360A 思路:我们令b=max(a,b),a=min(a,b). 如果b>=2*a的话,最终 ...

  7. Codeforces Round #573 (Div. 2)(ABCD)

    Tokitsukaze and Enhancement CodeForces - 1191A Tokitsukaze is one of the characters in the game &quo ...

  8. Codeforces Round #572 (Div. 2)(ABCD1D2E)

    Keanu Reeves CodeForces - 1189A After playing Neo in the legendary "Matrix" trilogy, Keanu ...

  9. Codeforces Round #640 (Div. 4)(ABCDE)

    Sum of Round Numbers CodeForces - 1352A 思路:按照题意模拟即可. 代码如下: #include<bits/stdc++.h> #define ll ...

最新文章

  1. Docker容器中数据两种持久化存储方式:卷和挂载宿主目录
  2. linux mysql5.7.11安装_Linux下安装MySQL 5.7.11
  3. ubuntu安装node.js
  4. Python3——网络编程基础
  5. C#开发命令执行驱动程序 之 控制标志的命令行参数
  6. 推荐系统中所需的概率论与数理统计知识
  7. 2018.3.13校内互测总结-bitset-凸包-扫描线
  8. 微信小程序云开发教程-互联网软件的运作模式
  9. 系统设计---分层,分级,分块
  10. 贝叶斯网络 神经网络_随机贝叶斯神经网络
  11. 水利水电工程施工导截流方案辅助设计系统DivClose软件特色
  12. 《凤凰项目-一个IT运维从传奇故事》总结
  13. 中英文国际机场三字代码
  14. 一款基于VUE3.0的开源卡密发卡系统
  15. 【msm8953】gpio口模拟pwm详细步骤
  16. VS2005中UNICODE和ANSI以及MBCS的问题
  17. 搭建Terraria服务器[Centos7/LGSM/泰拉瑞亚]
  18. postfix邮箱服务器安装和配置
  19. BPM 应用系统开发案例实战
  20. ChinaSoft 论坛巡礼 | 软件工程教学案例交流与竞赛

热门文章

  1. 增长的营收,扩大的亏损,水滴如何给业绩“上保险”?
  2. from表单点击submit提交后没有反应
  3. MySql——忘记密码怎么办
  4. unity编辑器拓展十一——将两张RGB图合并成一张
  5. web服务验证事件合法请求,使用到了__VIEWSTATE、__EVENTVALIDATION、cookie来验证
  6. 电子书籍下载大汇总,超级经典,超级汇总!
  7. Flutter Text / Text.rich
  8. 常用的计算机有哪些台式的还有哪些,现在台式电脑的主流配置有哪些?
  9. shell之find
  10. Linux文件查找find