2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2

2023年多校联训NOIP层测试4

爆零了

T1 幸运数字 \(0pts\)

  • 首先考虑一个结论: \(4\) 的倍数一定满足最后两位能被 \(4\) 整除。
    • \(1\) 进行输入,方便处理。若枚举到 \(i\) 位的位置,判断第 \(i-1\) 位和当前位组成的数( \(10×(s[i-1]-'0')+s[i]-'0'\) )即能否被 \(4\) 整除,如果可以,方案总数加上 \(i-1\)
    • 额外加上 \(0,4,8\) 的个数。
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long 
      #define sort stable_sort 
      #define endl '\n'
      char s[3000010];
      int main()
      {
          ll ans=0,len,i;
          cin>>(s+1);
          len=strlen(s+1);
          s[0]='0';
          for(i=1;i<=len;i++)
          {
              if((10*(s[i-1]-'0')+s[i]-'0')%4==0)
              {
                  ans+=i-1;
              }
              if((s[i]-'0')%4==0)//在这里挂了100pts,if打成了else if,结果minecraft418直接出了个hack
              {
                  ans++;
              }
          }
          cout<<ans<<endl;
          return 0;
      }
      

T2 密码 \(0pts\)

  • 没做到,咕了。

T3 小X和他的朋友们 \(0pts\)

  • 没做到,咕了。

T4 树上询问 \(0pts\)

  • 没做到,咕了。

【LGR-150-Div.2】洛谷 8 月月赛 I & RiOI Round 2

比赛时间又重了, \(4.5h\) 打三场比赛。

T1 luoguP9496 「RiOI-2」hacker \(100pts\)

  • 赛场上读假题了,以为是按位或上一个操作形成的数字,觉得是不可做题,跳到了T2。

    • 解法一:将 \(n,m\) 分别转成二进制,易知答案结果只有 \(0,1,2\) ,然后进行分类讨论:
      • 若转出二进制后第 \(i\)\(n\)的值为 \(1\)\(m\)的值为 \(0\) ,需要进行 「ACCEPT」操作。
      • 若转出二进制后第 \(i\)\(n\)的值为 \(0\)\(m\)的值为 \(1\) ,需要进行 「BOTH」操作。
      //转二进制模拟
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define sort stable_sort
      #define endl '\n'
      ll aa[100],bb[100];
      int main()
      {
          ll n,i,j,a,b,la,lb,sum1,sum2;//十年OI一场空,不开 long long见祖宗
          cin>>n;
          for(i=1;i<=n;i++)
          {
              cin>>a>>b;
              if(a==b)
              {
                  cout<<"0"<<endl;
              }
              else
              {
                  la=lb=sum1=sum2=0;
                  while(a>0)//转二进制,倒序储存,方便处理
                  {
                      la++;
                      aa[la]=a%2;
                      a/=2;
                  }
                  while(b>0)
                  {
                      lb++;
                      bb[lb]=b%2;
                      b/=2;
                  }
                  if(la>lb)
                  {
                      for(j=lb+1;j<=la;j++)//空位补零,下同
                      {
                          bb[j]=0;
                      }
                      lb=la;
                  }
                  if(la<lb)
                  {
                      for(j=la+1;j<=lb;j++)
                      {
                          aa[j]=0;
                      }
                      la=lb;
                  }
                  for(j=1;j<=la;j++)
                  {
                      if(aa[j]==1&&bb[j]==0)
                      {
                          sum1=1;
                      }
                      if(aa[j]==0&&bb[j]==1)
                      {
                          sum2=1;
                      }
                  }
      		    cout<<sum1+sum2<<endl;
              }
          }
          return 0;
      }
      
    • 解法二:利用位运算进行分类讨论:
      • \(a==b\) ,易知不需要进行操作。
      • \((a|b)==a\) ,说明 \(b\) 在二进制下与 \(a\) 同一位不同时存在一种情况( \(1和0\)\(0和1\) ) ;若 \((a|b)==b\) ,同理。
      • \((a|b)\ne a \ne b\),说明 \(b\) 在二进制下与 \(a\) 同一位不同时存在两种情况( \(1和0\)\(0和1\) )
      //位运算
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define sort stable_sort
      #define endl '\n'
      ll aa[100],bb[100];
      int main()
      {
          ll n,i,j,a,b,la,lb,sum1,sum2;
          cin>>n;
          for(i=1;i<=n;i++)
          {
              cin>>a>>b;
              if(a==b)
              {
                  cout<<"0"<<endl;
              }
              else
              {
                  if(((a|b)==a)||((a|b)==b))
                  {
                      cout<<"1"<<endl;
                  }
                  else
                  {
                      cout<<"2"<<endl;
                  }
              }
          }
          return 0;
      }
      

T2 luoguP9497 「RiOI-2」weight \(100pts\)

  • 赛场上又双叒叕读假题了,觉得是不可做题,跳到了T3。

  • 正解:将矩阵压缩成一维, \(sort\) 一遍+二分查找即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define sort stable_sort
    #define endl '\n'
    int a[20000000];
    int main()
    {
        int n,q,i,j,x,num;
        cin>>n>>q;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                cin>>a[j+(i-1)*n];
            }
        }
        sort(a+1,a+1+n*n);
        for(i=1;i<=q;i++)
        {
            cin>>x;
            num=n*n-(lower_bound(a+1,a+1+n*n,x)-a)+1;
            cout<<min(n,num)<<endl;//记得和 n 取min
        }
        return 0;
    }
    

T3 luoguP9498 「RiOI-2」equals \(55pts\)

  • 直接从T3开写,起初爆搜骗到了 \(40pts\) ,优化到 \(55pts\) ,才去打的T1和T2。
  • \(DFS\) 求深度不做讲解。
  • 部分分: 爆搜(C++大法好,先剪枝后爆搜)
  • 正解:贪心
    • 发现一个性质,当深度之和为奇数时一定无解,为偶数时一定有解。
      • 证明:当深度之和为偶数时,此处与luoguP7535 [COCI2016-2017#4] Kas 不同,因为一条链上的深度具有单调递增性,即若存在深度为 \(x(x>1)\) 的点,则一定存在深度为\(x-1\) 的点,用后者代替前者,则导致 \(\sum\limits_{ans_i=1}^{} dep_i\) 或者 \(\sum\limits_{ans_i=0}^{} dep_i\) 减小1,这样就保证了这样贪心不会错过任何一个实际能取到的值,故一定有解。
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define sort stable_sort 
    #define endl '\n'
    struct node
    {
    	ll to,next;
    }e[20000001];
    struct equals
    {
    	ll dep,val;
    }c[20000001];
    ll head[20000001],ans[20000001],cnt=0;
    bool cmp(equals p,equals q)
    {
    	return p.dep>q.dep;
    }
    void add(ll u,ll v)
    {
    	cnt++;
    	e[cnt].next=head[u];
    	e[cnt].to=v;
    	head[u]=cnt;
    }
    void dfs(ll x,ll fa)
    {
    	ll i;
    	c[x].dep=c[fa].dep+1;
    	c[x].val=x;
    	for(i=head[x];i;i=e[i].next)
    	{
    		if(e[i].to!=fa)
    		{
    			dfs(e[i].to,x);
    		}
    	}
    }
    int main()
    {
    	ll n,i,j,u,v,sum=0;
    	cin>>n;
    	for(i=1;i<n;i++)
    	{
    		cin>>u>>v;
    		add(u,v);
    		add(v,u);
    	}
    	dfs(1,0);
    	for(i=1;i<=n;i++)
    	{
    		sum+=c[i].dep;
    	}
    	if(sum%2==0)
    	{
    		sum/=2; 
    		sort(c+1,c+1+n,cmp);
    		for(i=1;i<=n;i++)
    		{
    			if(c[i].dep<=sum)
    			{
    				sum-=c[i].dep;
    				ans[c[i].val]=1;
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			cout<<ans[i]<<" ";
    		}
    	}
    	else
    	{
    		cout<<"-1";
    	}
    	return 0;
    }
    

T4 luoguP9499 「RiOI-2」change \(0pts\)

  • 没做到,咕了。

【LGR-150-Div.1】洛谷 8 月月赛 I & RiOI Round 2

T1 luoguP9498 「RiOI-2」equals \(55pts\)

  • \(2C\)

T2 luoguP9499 「RiOI-2」change \(0pts\)

  • 没做到,咕了。

T3 luoguP9500 「RiOI-2」tnelat \(0pts\)

  • 没做到,咕了。

T4 luoguP9501 「RiOI-2」likely \(0pts\)

  • 没做到,咕了。

总结

  • 当你觉得题很难时,请重读题面,看是不是读假题了。

  • 当你觉得题很简单时,请重读题面,看是不是读假题了。

posted @ 2023-08-05 21:29  hzoi_Shadow  阅读(93)  评论(2编辑  收藏  举报
扩大
缩小