• AC修炼计划(AtCoder Regular Contest 165)


    传送门:AtCoder Regular Contest 165 - AtCoder

    本次习题参考了樱雪猫大佬的题解,大佬的题解传送门如下:Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com)

    A - Sum equals LCM

    第一题不算特别难

    B - Sliding Window Sort 2

    对于这道题而言,我们不难看出,如果想让该字符串尽可能的大,那最好的方式就是不改变,如果改变了,尽可能的向右边改变,同时尽可能的少改变。我们不如从前向后进行枚举,从而筛选出是第一个交换尽可能向右的下标,并记录。代码如下:

    1. #include
    2. using namespace std;
    3. // #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. int n,k;
    8. int b[5000005];
    9. void icealsoheat(){
    10. cin>>n>>k;
    11. for(int i=1;i<=n;i++){
    12. cin>>b[i];
    13. }
    14. set<int>q;
    15. for(int i=1;i<=k;i++)q.insert(b[i]);
    16. vector<int>c(n+5,0);
    17. int id=0;
    18. int mx=0;
    19. for(int i=1;i<=n-k+1;i++){
    20. if(i-1)q.erase(b[i-1]),q.insert(b[i+k-1]);
    21. if(c[i])continue;
    22. int l=0;
    23. auto it=q.begin();
    24. for(int j=i;j
    25. if((*it)!=b[j]){
    26. l=j;
    27. break;
    28. }
    29. it++;
    30. }
    31. if(!l){
    32. id=0;
    33. break;
    34. }
    35. for(int j=i;j<=l;j++)c[j]=1;
    36. if(l>mx){
    37. mx=l;
    38. id=i;
    39. }
    40. }
    41. if(id)sort(b+id,b+id+k);
    42. for(int i=1;i<=n;i++)cout<" ";
    43. }
    44. signed main(){
    45. ios::sync_with_stdio(false);
    46. cin.tie();
    47. cout.tie();
    48. int _=1;
    49. // cin>>_;
    50. while(_--){
    51. icealsoheat();
    52. }
    53. }

    C - Social Distance on Graph

    首先,没有重边,没有环,简单的无向图。最开始我想到了最小生成树,但是没搞出来,后来看佬的码,惊讶的发现确实是最小生成树,只是我想的还是太浅了,不够深入。

    既然我们想让最小值最大,那么我们尽可能的让最小的边通过涂色和其他边和在一起。如果是不同的颜色的两个点,则这条边不存在,无法相连。所以我们可以用最小生成树来将最小的顶点优先考虑。并且将其进行染色,将这两个点儿染成不同的颜色。同时并继续向后慢慢更新,这里可以通过并查集来进行实现。在最后,我们比较出最小值即可。

    代码如下:

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const int MX=0x3f3f3f3f3f3f3f3f;
    8. int n,k,m;
    9. int c[5000005];
    10. int pre[1000005];
    11. struct we{
    12. int l,r,w;
    13. bool operator <(const we &k)const{
    14. return w
    15. }
    16. }hh[1000005];
    17. int find(int x){
    18. if(pre[x]==x)return x;
    19. return pre[x]=find(pre[x]);
    20. }
    21. bool cmp(PII ax,PII bx){
    22. return ax.second
    23. }
    24. void icealsoheat(){
    25. cin>>n>>m;
    26. for(int i=1;i<=n;i++){
    27. pre[i]=i;
    28. c[i]=-1;
    29. }
    30. vector>ve(n+5);
    31. for(int i=1;i<=m;i++){
    32. int l,r,w;
    33. cin>>l>>r>>w;
    34. hh[i].l=l;
    35. hh[i].r=r;
    36. hh[i].w=w;
    37. }
    38. sort(hh+1,hh+1+m);
    39. for(int i=1;i<=m;i++){
    40. int xx=find(hh[i].l);
    41. int yy=find(hh[i].r);
    42. if(xx==yy){
    43. continue;
    44. }
    45. pre[xx]=yy;
    46. ve[hh[i].l].push_back({hh[i].r,hh[i].w});
    47. ve[hh[i].r].push_back({hh[i].l,hh[i].w});
    48. }
    49. auto dfs=[&](auto self,int x,int fa)->void{
    50. for(auto [i,j]:ve[x]){
    51. if(i==fa||c[i]!=-1)continue;
    52. c[i]=c[x]^1;
    53. self(self,i,x);
    54. }
    55. };
    56. for(int i=1;i<=n;i++){
    57. if(pre[i]==i){
    58. c[i]=0;
    59. dfs(dfs,i,-1);
    60. break;
    61. }
    62. }
    63. int ans=MX;
    64. for(int i=1;i<=m;i++){
    65. if(c[hh[i].l]==c[hh[i].r]){
    66. ans=min(ans,hh[i].w);
    67. }
    68. }
    69. for(int i=1;i<=n;i++){
    70. sort(ve[i].begin(),ve[i].end(),cmp);
    71. }
    72. for(int i=1;i<=n;i++){
    73. if(ve[i].size()>1){
    74. ans=min(ans,ve[i][0].second+ve[i][1].second);
    75. }
    76. }
    77. cout<
    78. }
    79. signed main(){
    80. ios::sync_with_stdio(false);
    81. cin.tie();
    82. cout.tie();
    83. int _=1;
    84. // cin>>_;
    85. while(_--){
    86. icealsoheat();
    87. }
    88. }

    D - Substring Comparison

    本题对于算法的考察比较多,我认为是一道比较好的题。这题我没有一点思路,是直接看佬的代码和思路的,让我恍然大悟。既然n是2000,那就支持双重循环了。首先,如果a=c并且d>=b的话,那一定是输出no的,我们可以优先排前面的,最开始让a

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const int MX=0x3f3f3f3f3f3f3f3f;
    8. int n,m;
    9. bool f=0;
    10. int b[1000005];
    11. int pre[100005];
    12. int dfn[10000];
    13. int low[10000];
    14. vector<int>ve[10000];
    15. int find(int x){
    16. if(x==pre[x])return x;
    17. else return pre[x]=find(pre[x]);
    18. }
    19. struct we{
    20. int a,b,c,d;
    21. }hh[20005];
    22. int num;
    23. int top,col;
    24. int a[10000];
    25. int c[10000];
    26. void tarjan(int u){
    27. dfn[u]=low[u]=++num;
    28. a[++top]=u;
    29. for(auto i:ve[u]){
    30. if(dfn[i]==0){
    31. tarjan(i);
    32. low[u]=min(low[u],low[i]);
    33. // pre[find(i)]=find(u);
    34. }
    35. else{
    36. if(!c[i]){
    37. low[u]=min(low[u],dfn[i]);
    38. }
    39. }
    40. }
    41. if(low[u]==dfn[u]){
    42. c[u]=++col;
    43. while(a[top]!=u){
    44. if(find(a[top])!=find(u)){
    45. pre[find(a[top])]=find(u);
    46. }
    47. f=1;
    48. c[a[top]]=col;
    49. top--;
    50. }
    51. top--;
    52. }
    53. }
    54. void icealsoheat(){
    55. cin>>n>>m;
    56. for(int i=1;i<=m;i++){
    57. cin>>hh[i].a>>hh[i].b>>hh[i].c>>hh[i].d;
    58. }
    59. for(int i=1;i<=n;i++)pre[i]=i;
    60. for(int i=1;i<=n;i++){
    61. for(int j=1;j<=n;j++){
    62. ve[j].clear();
    63. }
    64. for(int j=1;j<=m;j++){
    65. while(find(hh[j].a)==find(hh[j].c)&&hh[j].a<=hh[j].b&&hh[j].c<=hh[j].d){
    66. hh[j].a++;
    67. hh[j].c++;
    68. }
    69. if(hh[j].c>hh[j].d){
    70. cout<<"No";
    71. return;
    72. }
    73. if(hh[j].a<=hh[j].b){
    74. ve[find(hh[j].a)].push_back(find(hh[j].c));
    75. // ve[find(hh[j].c)].push_back(find(hh[j].a));
    76. }
    77. }
    78. for(int j=1;j<=n;j++){
    79. dfn[j]=0;
    80. low[j]=0;
    81. c[j]=0;
    82. a[j]=0;
    83. }
    84. top=col=num=0;
    85. f=0;
    86. for(int j=1;j<=n;j++){
    87. if(!dfn[j]){
    88. tarjan(j);
    89. }
    90. }
    91. if(!f){
    92. cout<<"Yes";
    93. return;
    94. }
    95. }
    96. cout<<"Yes";
    97. }
    98. signed main(){
    99. ios::sync_with_stdio(false);
    100. cin.tie();
    101. cout.tie();
    102. int _=1;
    103. // cin>>_;
    104. while(_--){
    105. icealsoheat();
    106. }
    107. }

  • 相关阅读:
    QT:MainWIndow的使用
    Visual Studio Code 实用快捷键
    【正点原子STM32连载】 第四十二章 IIC实验 摘自【正点原子】APM32F407最小系统板使用指南
    Metabase学习教程:系统管理-2
    ubuntu 客服端同步ntp服务器时间
    GBASE观察:扩展分析型数据库
    Linux进程概念
    DevExpress WinForms HeatMap组件,一个高度可自定义热图控件!
    【Python入门与进阶】综合练习题:学生成绩管理系统
    【原创】FFMPEG录屏入门指南
  • 原文地址:https://blog.csdn.net/kyrietheshy/article/details/133852386