题解 | #打靶#

打靶

https://ac.nowcoder.com/acm/contest/72389/A

A
模拟,判断y>=x且y<=x+n-m是否成立。
#include<bits/stdc++.h>
using namespace std;
#define maxx 3000
int n,a,b,c,s,m,t,x,y;
map<int,int> M; 
pair<int,int> all[maxx];
int ans=0;
int anss=0;

int main()
{
    cin>>t;
    for(int i=1;i<=t;++i)
    {cin>>n>>m>>x>>y;
     if(y>=x&&y<=x+n-m)
     cout<<"Yes\n";
     else
     cout<<"No\n";


    }
     
   
  
}
B
设一个合法解为a,b,则gcd(a,b)=x,lcm(a,b)=y,而gcd(a,b)*lcm(a,b)=x*y=a*b。
则a与b是xy的约数,枚举所有约数后判断是否gcd(a,b)=x,从小到大枚举。
#include<bits/stdc++.h>
using namespace std;
#define maxx 3000
#define int long long
int n,a,b,c,s,m,t,x,y;
pair<int,int> all[maxx];
int ans=0;
int anss=0;

signed main()
{
    cin>>t;
    for(int i=1;i<=t;++i)
    {cin>>x>>y;
     int z=x*y;
     for(int i=1;i<=sqrt(z);++i)
     {
       if(z%i!=0) continue;
       if(__gcd(i,z/i)==x)
       {
        cout<<i<<" "<<z/i<<"\n";
        goto h;
       } 
     } 
     cout<<-1<<"\n";
     h:;
   

    }
     
   
  
}
C
贪心
题目可以转换为bi∈[ai-k,ai+k],且bi非减。
为了减少前数字对后面的影响,每个点尽量向右取和向左取且保证合法,分别判断。
#include<bits/stdc++.h>
using namespace std;
#define maxx 1200000
int n,a,b,c,s,m,t,x,y,k;
int all[maxx];
int ans=0;
int anss=0;

int main()
{
    cin>>t;
    for(int i=1;i<=t;++i)
    {cin>>n>>k;
     for(int i=1;i<=n;++i)
      cin>>all[i];
      int x=all[1]-k;
      int wr=0;
      for(int i=2;i<=n;++i)
      {
        if(all[i]+k<x) 
        {
          ++wr;
          break;
        }
        else if(all[i]-k<=x&&all[i]+k>=x) ;
        else x=all[i]-k;
      }
      x=all[1]+k;
        for(int i=2;i<=n;++i)
      {
        if(all[i]+k<x) 
        {
          ++wr;
          break;
        }
        else x=all[i]+k;
      }
      if(wr==2) cout<<"No\n";
      else cout<<"Yes\n";

    }
     
   
  
}
D
注意题意:1.是翻转不是反转,2.每次处理独立,而不是逐步修改。
如果1,2均满足后者,需要使用线段树来进行处理,大约如下代码,没做验证。

#include<bits/stdc++.h>
using namespace std;
#define INF 1e18
#define maxx 5080000
#define maxx2 0x3f3f3f3f
int a,b,d,k,m,t,n,ansmax,Smax,x,ans1,ans2,neww,c;
int l,r,q;
string s;
int xmax,ymax;
int pj;
int sum=0;
int all[maxx];
struct point
{
  int sum0,sum1;//连续的个数
  int ld,rd;
  int leng;
  int tag;
}JD[maxx];
int ls(int root)
{
  return 2*root;
}
int rs(int root)
{
  return 2*root+1;
}
void update_from_son(int root,int l,int r)
{
 
  int mid=(l+r)/2;
  JD[root].ld=JD[ls(root)].ld;
  JD[root].rd=JD[rs(root)].rd;
  JD[root].sum0=JD[ls(root)].sum0+JD[rs(root)].sum0;
  JD[root].sum1=JD[ls(root)].sum1+JD[rs(root)].sum1;
  JD[root].leng=JD[ls(root)].leng;
  if(JD[ls(root)].rd==JD[rs(root)].ld&&JD[ls(root)].rd==0)
  --JD[root].sum0;
 
   if(JD[ls(root)].rd==JD[rs(root)].ld&&JD[ls(root)].rd==1)
  --JD[root].sum1;
  if(JD[ls(root)].leng==mid-l+1&&JD[ls(root)].rd==JD[rs(root)].ld)
  JD[root].leng=JD[root].leng+JD[rs(root)].leng;
}
void push_down(int root)
{
  if(JD[root].tag==0) return ;
  JD[ls(root)].tag=(JD[ls(root)].tag+1)%2;
  JD[rs(root)].tag=(JD[rs(root)].tag+1)%2;
 
  JD[ls(root)].ld=(JD[ls(root)].ld+1)%2;
  JD[ls(root)].rd=(JD[ls(root)].rd+1)%2;
  swap(JD[ls(root)].sum0,JD[ls(root)].sum1);
  JD[rs(root)].ld=(JD[rs(root)].ld+1)%2;
  JD[rs(root)].rd=(JD[rs(root)].rd+1)%2;
  swap(JD[rs(root)].sum0,JD[rs(root)].sum1);
}
void build(int root,int l,int r)
{
  if(l==r) 
  {
    if(all[l]==1) JD[root].sum1=1;
    else JD[root].sum0=1;
    JD[root].ld=all[l];
    JD[root].rd=all[l];
    JD[root].leng=1;
    return;
  }
  int mid=(l+r)/2;
  build(ls(root),l,mid);
  build(rs(root),mid+1,r);
  update_from_son(root,l,r);
  
}
void modify(int root,int l,int r,int ql,int qr)
{
  if(l==ql&&r==qr)
  {
  JD[root].ld=(JD[root].ld+1)%2;
  JD[root].rd=(JD[root].rd+1)%2;
  swap(JD[root].sum0,JD[root].sum1);
  JD[root].tag=(JD[root].tag+1)%2;
    return ;
  }
  int mid=(l+r)/2;
  push_down(root);
  if(ql<=mid) modify(ls(root),l,mid,ql,min(qr,mid));
  if(qr>=mid+1) modify(rs(root),mid+1,r,max(mid+1,ql),qr);
  update_from_son(root,l,r);
}
int query(int root,int l,int r)
{
  return JD[1].sum1;
}
  
signed main()
{
    cin>>n>>q>>s; 
    for(int i=0;i<n;++i)
    all[i+1]=s[i]-'0';
     build(1,1,n);
    for(int i=1;i<=q;++i) 
     {
       cin>>l>>r;
       modify(1,1,n,l,r);
       cout<<query(1,1,n)<<"\n";
     }
   
   
   
}


正解为如下
首先处理出所有连续1段的长度,然后翻转在左右端点不一致的时候会影响端点的数值,在端点分类讨论即可。
#include<bits/stdc++.h>
using namespace std;
#define INF 1e18
#define maxx 88
#define maxx2 0x3f3f3f3f
int a,b,d,k,m,t,n,ansmax,Smax,x,ans1,ans2,neww,c;
int q;
string s;
int l,r;
int xmax,ymax;
int pj;
int sum=0;

int all[maxx];
int ans;



signed main()
{
   cin>>n>>q>>s; 
    for(int i=0;i<n;++i)
    all[i+1]=s[i]-'0';
    int x=1;
    for(int i=1;i<=n;)
    {
      x=i;
      while(++i<=n)
      {
        if(all[i]!=all[x]) 
        {
         if(all[x]==1) ++ans;
         x=i;
        break;
        }
      }

    }
    if(all[n]==1)
    ++ans;
    all[0]=all[n+1]=-1;
    for(int i=1;i<=q;++i) 
     {
      cin>>l>>r;
      int qq=ans;

      if(all[l]==0&&all[r]==1&&all[l-1]!=1) ++qq;
      if(all[l]==0&&all[r]==1&&all[r+1]!=1) --qq;
      
      if(all[l]==1&&all[r]==0&&all[l-1]!=1) --qq;
      if(all[l]==1&&all[r]==0&&all[r+1]!=1) ++qq;

    
      cout<<qq<<"\n";
     } 
  
}






全部评论
D题直接分类讨论就好了吧,用线段树太麻烦了 #include<bits> using namespace std; int main() { int n,q; cin>>n>>q; string str; cin>>str; str.insert(str.begin(),'0'); str += "0"; int ret = 0; for(int i = 1;i <= n;i++) { if(str[i-1] == '0' && str[i] == '1') { ret ++; } } while(q--) { int l,r; cin>>l>>r; if(str[l-1] == '1' && str[r+1] == '1') { cout << ret <</bits>
1 回复 分享
发布于 2023-12-22 22:16 河南
dailao第二题还有别的思路吗
点赞 回复 分享
发布于 2023-12-22 21:51 四川

相关推荐

07-28 16:10
门头沟学院 Java
连笔试都没有就直接挂了&nbsp;这是学历厂吗两段大厂实习一段中厂一点机会都没有吗真的很难绷
xiaolihuam...:校招挂了,然后反手给我捞了个社招
投递虾皮信息等公司10个岗位
点赞 评论 收藏
分享
07-29 14:57
门头沟学院 Java
复盘中的钝角很想踢足...:别说ppt了,我简历去面试都不带的
点赞 评论 收藏
分享
07-10 14:08
已编辑
江西农业大学 Java
拒绝无效加班的小学生...:期望3k吗?java这辈子有了
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务