首页 > 其他分享 >2024 暑假友谊赛 2

2024 暑假友谊赛 2

时间:2024-07-20 16:31:03浏览次数:19  
标签:int cin long 2024 55 暑假 友谊赛 id define

B. Tiling Challenge
1.我的方法是按顺序遍历,遇到' . '时就检查一下它的上下左右是不是都是点,如果都是点的话,标记这个点,把这个点和他上下左右都标记为‘?’,但是要加一个条件,如果‘.’的个数不是5的倍数就不符合题意,不加这个会wa37,我也不知道为什么

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
char c[55][55];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool st[55][55];
int n;
bool check(int i,int j)
{
    for(int k=0;k<4;k++){
        int a=i+dx[k],b=j+dy[k];
        if(a>=0&&a<n&&b>=0&&b<n&&(c[a][b]=='#'||c[a][b]=='?')) return 0;
    }
    return 1;
}

void mark(int i,int j)
{
    for(int k=0;k<4;k++){
        int a=i+dx[k],b=j+dy[k];
        if(a>=0&&a<n&&b>=0&&b<n&&c[a][b]!='?') c[a][b]='?';
    }
}

signed main()
{
     ios::sync_with_stdio(0),cin.tie(0);
     cin>>n;
     int fla=0,cnt=0;
     for(int i=0;i<n;i++)
     for(int j=0;j<n;j++) {
         cin>>c[i][j];
         if(c[i][j]=='.') fla=1,cnt++;
     }
     if(!fla||cnt%5!=0){
         cout<<"NO";
         return 0;
     }
     
     for(int i=0;i<n;i++)
     for(int j=0;j<n;j++)
     {
         if(c[i][j]=='.'){

             if(check(i,j)) mark(i,j),c[i][j]='?';
         }
     }
     
     
     for(int i=0;i<n;i++)
     for(int j=0;j<n;j++){
         if(c[i][j]=='.'){
             cout<<"NO";
             return 0;
         }
     }
    cout<<"YES";
    
    
    
    return 0;
}

D - All Assign Point Add
1.主要是要优化操作一,不然就会tle,那怎么优化呢?因为1操作是让数组里的每个数都变成这个值,我不去整体改变这个数组,在1操作以后的第一次操作2后把这个操作2要改变的对应数组元素改为操作1给的数。
2.我的策略是开一个add数组,然后当操作1出现过后,把当前值放进数组里,当每个数第一次被操作2改变的时候,把这个数改为add【对应】,然后处理即可

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
char c[55][55];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool st[55][55];



signed main()
{
     ios::sync_with_stdio(0),cin.tie(0);
        int n; cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++) cin>>a[i];
    int m; cin>>m;
    
    int add[200005];
    map<int,int>mp;
    int p=0;
    for(int i=0;i<m;i++)
    {
        int x; cin>>x;
        if(x==3) {
            int id ;cin>>id;
            if(p!=0)//这个条件
            {
                if(mp[id]==0){//和这个条件可以实现让这个对应的数改为1要求的数
                    a[id]=add[p];
                    mp[id]=1;
                }
            }
            cout<<a[id]<<endl;
        }
        if(x==2){
            int id,z; cin>>id>>z;
            if(p!=0)
            {
                if(mp[id]==0){
                    a[id]=add[p];
                    mp[id]=1;
                }
            }
            a[id]+=z;
        }
        if(x==1) {
            int z;cin>>z;
            add[++p]=z;//放进对应数组里
            mp.clear();//记得清理标记
        }
    
        
    }

    
    
    
    return 0;
}

B - Reserve or Reverse
1.使用双指针,每次检查一下s【l】,是不是l-r这个区间的最小字母,如果不是就用一个离r最近并且最小的字母来替换,也就是要不断维护区间的最小字母,使用multiset来维护最小,当s【r】不是最小的时候,就更新r,删掉set里面这个字母,相当于更新了区间。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
typedef pair<char,int>pci;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};


signed main()
{
     ios::sync_with_stdio(0),cin.tie(0);
    int n; cin>>n;
    string s; cin>>s;
    multiset<char>se;
    for(int i=0;i<n;i++) se.insert(s[i]);
    
    int l=0,r=n-1;
    while(l<r)
    {
        //先检查一下s【l】是不是l-r这段区间的最小字母
        //如果不是,找一个离r最近的并且最小的字母与之交换
        if(s[l]!=*se.begin())
        {
            while(s[r]!=*se.begin()){//如果不是就从set里删掉,维护区间最小字母
                se.erase(se.find(s[r]));//每一次移动都要记得更新区间,达到维护区间最小的目的
                r--;
            }
            swap(s[l],s[r]);
            se.erase(se.find(s[l]));
            l++;
            se.erase(se.find(s[r]));
            r--;
        }else{ 
            se.erase(se.find(s[l]));
            l++;
        }
    }
    cout<<s<<endl;
    
    
    return 0;
}

D. Walk on Matrix
1.位与运算并不是数越大,结果越大的。我们构造一个矩阵,如果按照图片中的意思来走,结果得到为0,而正确的结果是k即可

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
char c[55][55];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool st[55][55];



signed main()
{
     ios::sync_with_stdio(0),cin.tie(0);
    int k; cin>>k;
    int num=0;
    int p=k;
    while(p)
    {
        num++;
        p>>=1;
    }
    int a[3][2];
    cout<<3<<" "<<2<<endl;
    a[0][0]=(1<<(num+1))-1;//具有num+1位个1的二进制数
    a[0][1]=k;
    a[1][0]=(1<<num);
    a[1][1]=(1<<(num+1))-1;
    a[2][0]=0;
    a[2][1]=(1<<num)-1;
    for(int i=0;i<3;i++)
    {for(int j=0;j<2;j++)cout<<a[i][j]<<" ";
        cout<<endl;
    }
    

    
    
    
    return 0;
}

标签:int,cin,long,2024,55,暑假,友谊赛,id,define
From: https://www.cnblogs.com/swjswjswj/p/18313303

相关文章

  • NOI 2024 退役记
    NOI2024结束了,我的OI生涯也告一段落了。怎么说呢,今年变动挺大的,Day1之前确实完全没有做好准备,考场策略全乱套了,最后Day1考151分,直接垫底了,T1是个小难写的ds,我做法反正很难写且常数大,最后调完了也没卡常卡过去,拿了80,还浪费了巨大长时间,场上看到有了pretest我也很......
  • 2024牛客暑期多校训练营2
    H.InstructionsSubstring题目大意:给出一段长为\(n\)的字符串,其中WASD分别代表向上下左右走,给出目的地\((x,y)\),选择一段连续子序列使得从\((0,0)\)出发可以经过目的地,求这样的子序列的总数。思路:用前缀和记录到\(i\)为止到达的位置,从前往后遍历右端点\(r\),找到恰好到......
  • 2024杭电第一场
    1012并考虑两维坐标都离散化后枚举每个格子,用二维前缀和计算其被覆盖的次数,设为cnt则k固定时该格子的贡献为:(1-C[n-cnt][k]/C[n][k])*该格子的面积注意事项:1.处处取模2.给的是点坐标,不是格点坐标,因此计算二维前缀和时要x++,y++#include<bits/stdc++.h>usingnames......
  • NOI2024退役记
    本文仍在不断更新中不知不觉我的OI生涯就结束了,走到这一步才突然发觉。才想起来我还有好多感兴趣的内容没学,还有好多有趣的题没做,还有好多流逝的时间没有抓住。但是都已经走到这一步了,高中的OI之旅就也只能到此为止了。Day-?提前两周来到了重庆,跟着梦熊的模拟赛,又认识了一个......
  • 【2024-ZR-C Day 4】图论(1)
    1.强连通分量1.1.定义在有向图中,选取一个点集\(S\),若对于\(S\)中的任意两点\(u,v\),都满足\(u\)可以到达\(v\),则称\(S\)是强连通的。强连通分量是图中一个极大的强连通的点集。性质:把一个有向图通过强连通分量缩点后,新的图是一个DAG.1.2.Kosaraju算法在无向图......
  • C基础(学习)2024.7.19
             Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC        数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2        运算符和输表达式......
  • 2024/7/20周末总结
    本周,我完美完成了PTA基础编程题目集中的函数部分。对阶乘计算的进阶方法这道上周无法通过的题目进行了学习和复现通过。对超大数的输出方式有了新的理解。同时,完成了编程题三分之一的题目,其中,由于BCD数中需要实现位运算而有些难以理解外,其他均以C++通过。关于本周Java的学习,......
  • 【北航主办丨本届SPIE独立出版丨已确认ISSN号】第三届智能机械与人机交互技术学术会议
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 暑假集训CSP提高模拟2
    T1看到这时限和内存,连一个数组都开不下,更别说离散化了,考试的时候我用了一个栈来模拟,相同留、进,不同退,可以说是很接近正解了,但还是没继续往下想,也是爆零了。正解的思路很简单,这里引出一个概念,摩尔投票法,适用于超过半数(不能等于)的众数,可以在常数的空间下、\(O(n)\)的时间复杂度下......
  • 2024暑假集训测试6
    前言比赛链接。挂分挂的最多的一集。T1不知道摩尔投票,被2M内存限制卡死。T2赛时打了个很像正解的莫队,赛时出题人发现了之后现往里加hack,还一个捆绑里加一个,直接爆零了,我真的谢了,求求以后不要一个捆绑放一个hack了,给条活路吧。T3一眼看出线段树优化建图,但是不会打......