首页 > 其他分享 >信友队2024CSP-S第二轮(复赛)模拟赛

信友队2024CSP-S第二轮(复赛)模拟赛

时间:2024-10-20 11:10:31浏览次数:1  
标签:confess int ll stdout freopen ans 友队 2024CSP 复赛

2024CSP-S第二轮(复赛)模拟赛

\(T1\) A. 坦白 \(30pts\)

  • 部分分

    • \(30pts\) :爆搜。

      点击查看代码
      ll ans[300010];
      char s[300010];
      int main()
      {
          freopen("confess.in","r",stdin);
          freopen("confess.out","w",stdout);
          ll t,n,cnt,i,j,k;
          __int128_t I=1ull<<63,tmp;
          I*=2;
          scanf("%lld",&t);
          for(k=1;k<=t;k++)
          {
              scanf("%s",s);
              n=strlen(s);
              memset(ans,-0x3f,sizeof(ans));
              for(i=0;i<=(1<<n)-1;i++)
              {
                  tmp=I;
                  cnt=0;
                  for(j=0;j<=n-1;j++)
                  {
                      if((i>>j)&1)
                      {
                          cnt++;
                          tmp^=1;
                      }
                      else
                      {
                          if(s[j]=='+')
                          {
                              tmp++;
                          }
                          else
                          {
                              tmp--;
                          }
                      }
                  }
                  ans[cnt]=max(ans[cnt],(ll)(tmp-I));
              }
              for(i=0;i<=n;i++)
              {
                  printf("%lld ",ans[i]);
              }
              printf("\n");
          }
          fclose(stdin);
          fclose(stdout);
          return 0;
      }
      
    • \(70pts\) :设 \(f_{i,j,0/1}\) 表示前 \(i\) 个数选择了 \(j\) 个数进行异或且是偶数/奇数的最大收益,直接转移即可。

      点击查看代码
      __int128_t f[2][300010][2];
      char s[300010];
      int main()
      {
          freopen("confess.in","r",stdin);
          freopen("confess.out","w",stdout);
          ll t,n,cnt,i,j,k;
          __int128_t I=1ull<<63;
          I*=2;
          scanf("%lld",&t);
          for(k=1;k<=t;k++)
          {
              scanf("%s",s+1);
              n=strlen(s+1);
              memset(f,-0x3f,sizeof(f));
              f[0][0][0]=I;
              for(i=1;i<=n;i++)
              {
                  for(j=0;j<=i;j++)
                  {
                      f[i&1][j][0]=f[(i-1)&1][j][1]+((s[i]=='+')?1:-1);
                      f[i&1][j][1]=f[(i-1)&1][j][0]+((s[i]=='+')?1:-1);
                      if(j-1>=0)
                      {
                          f[i&1][j][0]=max(f[i&1][j][0],f[(i-1)&1][j-1][1]-1);
                          f[i&1][j][1]=max(f[i&1][j][1],f[(i-1)&1][j-1][0]+1);
                      }
                  }
              }
              for(i=0;i<=n;i++)
              {
                  printf("%lld ",(ll)(max(f[n&1][i][0],f[n&1][i][1])-I));
              }
              printf("\n");
          }
          fclose(stdin);
          fclose(stdout);
          return 0;
      }
      
    • \(90pts\) :考虑 Slope Trick 优化上述过程。

  • 正解

    • 因为有 \(2^{64}\) 的进、退位存在,故每次操作都会使数的奇偶性发生变化。
    • 那么 \(\bigoplus\) 放在奇数个事件等价于 \(+1\) ,放在偶数个事件等价于 \(-1\) 。
    • 统计 \(\bigoplus\) 用来可能和必须更改贡献的次数即可。
    点击查看代码
    char s[300010];
    int main()
    {
        freopen("confess.in","r",stdin);
        freopen("confess.out","w",stdout);
        int t,n,sum,maybe,must,i,j,k;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            cin>>(s+1);
            n=strlen(s+1);
            sum=maybe=must=0;
            for(i=1;i<=n;i++)
            {
                sum+=(s[i]=='+'?1:-1);
                maybe+=((i%2==0&&s[i]=='-')||(i%2==1&&s[i]=='+'));
                must+=(i%2==1&&s[i]=='-');
            }
            for(i=0;i<=must;i++)
            {
                cout<<sum+i*2<<" ";
            }
            for(i=must+1;i<=must+maybe;i++)
            {
                cout<<sum+must*2<<" ";
            }
            for(i=must+maybe;i<=n;i++)
            {
                cout<<sum+must*2-(i-must-maybe)*2<<" ";
            }
            cout<<endl;
        }
        fclose(stdin);
        fclose(stdout);	
        return 0;
    }
    

\(T2\) B. 秘密 \(0pts\)

  • 最左/右边的人一定会往右/左走。

  • 以 \(x\) 向右走为例,设 \(x\) 遇到的第一个人是 \(y\) ,在他们相遇后,让 \(y\) 接着往左走, \(x\) 接着往右走更新其他人。而更新的其他人往哪个方向走已经不重要了,因为完全可以被 \(x,y\) 所替代。

  • 左右两种情况取 \(\min\) 即可。

    点击查看代码
    set<ll>s;
    set<ll>::iterator it;
    int main()
    {
        freopen("secret.in","r",stdin);
        freopen("secret.out","w",stdout);
        ll n,q,x,i;
        double ans;
        char pd;
        cin>>n>>q;
        for(i=1;i<=n;i++)
        {
            cin>>x;
            s.insert(x);
        }
        for(i=1;i<=q;i++)
        {
            cin>>pd>>x;
            if(pd=='+')
            {
                s.insert(x);
            }
            if(pd=='-')
            {
                s.erase(x);
            }
            if(pd=='?')
            {
                ans=0x7f7f7f7f;
                it=s.upper_bound(x);
                if(it!=s.end())
                {
                    ans=min(ans,max(*it-*s.begin(),*(--s.end())-x)/2.0);
                }
                it=s.find(x);
                if(it!=s.begin())
                {
                    it=prev(it);
                    ans=min(ans,max(x-*s.begin(),*(--s.end())-*it)/2.0);
                }
                printf("%.2lf\n",ans);
            }	
        }
        fclose(stdin);
        fclose(stdout);	
        return 0;
    }
    

\(T3\) C. 潜力值 \(0pts\)

  • 部分分

    • 测试点 \(1,2\) :模拟。

      点击查看代码
      const ll p=1000000007;
      ll b[510],id[510];
      deque<ll>q;
      int main()
      {
          freopen("potential.in","r",stdin);
          freopen("potential.out","w",stdout);
          ll n,m,ans=0,i;
          cin>>n>>m;
          for(i=1;i<=n;i++)
          {
              cin>>b[i];
              id[i]=i;
          }
          do
          {
              q.clear();
              for(i=1;i<=m;i++)
              {
                  q.push_back(0);
              }
              for(i=1;i<=n;i++)
              {
                  if(q.front()<b[id[i]])
                  {
                      q.pop_front();
                      q.push_back(b[id[i]]);
                  }
              }
              for(i=0;i<q.size();i++)
              {
                  ans=(ans+q[i])%p;
              }
          }while(next_permutation(id+1,id+1+n));
          cout<<ans<<endl;
          fclose(stdin);
          fclose(stdout);
          return 0;
      }
      
  • 正解

    • 等有时间再来补,先咕了。
    • 挂下 官方题解

\(T4\) D. 括号 \(5pts\)

  • 部分分

    • 测试点 \(6\) :不存在子序列 () ,故输出 \(0\) 即可。
  • 正解

    • 等有时间再来补,先咕了。
    • 挂下 官方题解

总结

  • \(T1\)
    • 因为不想处理负数的异或,所以直接手动判断 \(+/-1\) ,然后就把符号写反了,导致 \(DP\) 没调出来。
    • 观察样例和手摸后发现有一堆连续段,然后就不会做了。
  • \(T2\) 处理传递完消息后的行动方向赛时因为基本没看题所以没去想,要是正儿八经地想或许能想出来。
  • \(T3\) 文件粘成 \(T1\) 文件了,挂了 \(10pts\) 。
  • \(T4\) 输出文件后缀名写的是输入文件后缀名了,挂了 \(5pts\) 。

标签:confess,int,ll,stdout,freopen,ans,友队,2024CSP,复赛
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18487032

相关文章

  • 信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分
    PDF文档公众号回复关键字:202410171P8814[CSP-J2022]解密[题目描述]给定一个正整数k,有k次询问,每次给定三个正整数ni,ei,di,求两个正整数pi,qi,使ni=pi×qi、ei×di=(pi−1)(qi−1)+1[输入格式]第一行一个正整数k,表示有k次询问。接下来k行,第i行三个正整数......
  • 2024CSP-J模拟赛9————S12678
    一,赛中得分T1100T2100T350T440总分290二,赛中概括  T1T2较快过,T3T4骗了90分(意料之中,这么好骗分!!!)。三,题目解析涂格子(paint)问题描述现在有一个 n 行 m 列的网格纸,一开始每个格子都是白色的。现在你可以任意挑选恰好 x 行和 y 列,将挑......
  • 信息学奥赛复赛复习16-CSP-J2022-01乘方-循环特判、pow函数、快速幂
    PDF文档公众号回复关键字:20241012此前解析题,P8813[CSP-J2022]乘方,给出了循环的解题思路,当时在洛谷提交是通过的,后台收到留言,a=1,b=1e9会炸吧?,确实啊整除要求1s内循环次数最大可以到10^7,现在测试数据明显大很多,按测试数据有这个可能,没想到CSP普及组第1题竟然翻车,去CCF官网......
  • 白鲸开源WhaleStudio项目获得“创客北京2024”企业组优秀奖,晋级复赛!
    近日,“创客北京2024”海淀区复赛名单正式公布,白鲸开源凭借其全球领先的云原生DataOps平台——WhaleStudio,荣获企业组优秀奖,并成功进入复赛名单。此次“创客北京2024”海淀区级赛由中关村科学城管理委员会主办,北京中关村科学城科创服务有限公司与中国北京(海淀)留学人员创业园(海淀......
  • coduck 复赛模拟赛三 补题报告 侯锦呈
    自测160分第一题30分第二题100分第三题30分(后来100分 自己改的)第四题0分第一题十五的月亮题目描述假设一个每个月都是30天,用0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1表示一个月30天中的月亮......
  • 2024CSP-J模拟赛————S12678
    禁止抄袭!!!一,赛中得分硬币(coin)100数位(digit)100划分(partition)0路径(path)0总分200二,赛中概括第一第二题30分钟做完,三四题不会。三,题目解析硬币(coin)1.1问题描述小明很喜欢 100这个数字,父母给他一些零花钱,这些零花钱的面值是 a 和 b,即小明......
  • 2024CSP前集训10.9
    不想学东西了,,,T1普及题,之前还做过,没啥好说的。T295kmp不对,挂了5分。莫队奇偶性优化还是要加的。对\(s_{i,\dots,n}\)跑kmp,也就是跑了\(n\)遍,答案是: while(m--){ intl=read(),r=read(); intres=0; for(inti=l;i<=r;i++) for(intj=......
  • 信息学奥赛复赛复习15-CSP-J2022-01乘方-数据类型、类型转换、数据类型溢出、指数、模
    PDF文档公众号回复关键字:202410091P8813[CSP-J2022]乘方[题目描述]小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数a和b,求a^b的值是多少。a^b即b个a相乘的值,例如2^3即为3个2相乘,结果为2×2×2=8“简单!”小文心想,同时很快就写出了......
  • 信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map
    PDF文档公众号回复关键字:202410071P7911[CSP-J2021]网络连接[题目描述]TCP/IP协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。在本问题中,计算机分为两大类:服务机(Server)和客户机(Client)。服务机负责建立连接,客户机......
  • 信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体
    PDF文档公众号回复关键字:202410061P7910[CSP-J2021]插入排序[题目描述]插入排序是一种非常常见且简单的排序算法。小Z是一名大一的新生,今天H老师刚刚在上课的时候讲了插入排序算法。假设比较两个元素的时间为O(1),则插入排序可以以O(n^2)的时间复杂度完成长度为......