首页 > 其他分享 >Codeforces Round 944 (Div. 4)

Codeforces Round 944 (Div. 4)

时间:2024-05-18 18:40:29浏览次数:20  
标签:片段 int 944 Codeforces 二进制 mp 字符串 Div void

Codeforces Round 944 (Div. 4)

需要一些trick的一场

H: 2 -sat的板子,已经计入2-sat专题,此处不再详细描述。题目用矩阵包装和博弈包装,我们需要慢慢读题,分析样例,找到问题的关键点。

G:题意:给定一个数组,数组中任何两个数异或<4的数对可以交换位置 ,可以交换无限次,求能够形成的字典序最小的数组。

Sol:我们希望能够快速将能够交换的数对都聚集在一起,然后内部排个序,再按顺序送回每个位置上,时间复杂度\(O(nlogn)\)。所以我们只需要思考两个数怎么样才能异或起来<4,那么显然应该二进制位下分析,我们发现只需要高29位一样,剩的低三位随便怎么样我们不在乎,也就是说这样的数共有的特征是x>>2都是一样的,所以我们直接map<int,vector>存一下每个数,再对于每个vector排序.又由于不想存下标,所以我们只能倒着做回去利用vector的pop_back功能

void solve(){
       cin>>n;
       for(int i=1;i<=n;i++)cin>>a[i];
       map<int,vector<int>>mp;
       for(int i=1;i<=n;i++){
       	int u=a[i]>>2;
       	mp[u].push_back(a[i]);
       }
       for(auto &[x,y]:mp){
       	sort(y.begin(),y.end());
       }
      for(int i=n;i>=1;i--){
      	int u=a[i]>>2;
      	a[i]=mp[u].back();
      	mp[u].pop_back();
      }
      for(int i=1;i<=n;i++)cout<<a[i]<<" ";
      cout<<endl;
}

F: 题意:给定整数 \(r\) ,求与 \((0, 0)\) 的欧氏距离大于或等于 \(r\)但严格小于 \(r+1\)的格点个数。大于或等于 \(r\) ,但严格小于 \(r+1\) 的网格点的个数。

网格点是具有整数坐标的点。从 \((0, 0)\) 到点 \((x,y)\) 的欧氏距离为 \(\sqrt{x^2 + y^2}\)。

Sol:敢于枚举,特判边界。四个象限我们只需要计算一个就可以了,计算第一象限,我们考虑枚举横坐标,直接计算与两个圆的交点,从而计算有多少个纵坐标符合要求。对于开方操作,注意其下取整的特性,对于上下边界都有不同的处理,自己看看题目要求想想。

 
void solve(){
       cin>>n;
       int ans=0;
       for(int i=1;i<=n;i++){
       	int low=n*n-i*i;
       	low=sqrt(low);
       	if(low*low<(n*n-i*i))low++;
    	int up=(n+1)*(n+1)-i*i;
       	up=sqrt(up);
       	if(up*up==((n+1)*(n+1)-i*i))up--;
       	ans+=max(0LL,up-low+1);
       }
       ans*=4;
       cout<<ans<<endl;
}

E:普通二分+物理简单计算。然而机器翻译round down翻译四舍五入,但实际上应该下取整,导致早早的陷入浮点数误差。现在我们知道不需要四舍五入了,但计算过程中速度是小数,我们不希望出现引入它,我们就应该把整个数学公式写出来然后变形,只做最后一次下取整的除法。

//原来根本不用浮点数,就是下取整除法
void solve(){
      int k;cin>>n>>k>>m;
      vector<int>a(k+1,0);
      vector<int>b(k+1,0);
      set<int>pos;pos.insert(0);
      for(int i=1;i<=k;i++){
      	cin>>a[i];pos.insert(a[i]);
      }
      map<int,int>mp;mp[0]=0;
      for(int i=1;i<=k;i++){
      	      cin>>b[i];
      	      mp[a[i]]=b[i];
      }
      for(int i=1;i<=m;i++){
      	int x;cin>>x;
      //	bug(x);
      	if(mp.count(x)){
      		cout<<mp[x]<<" ";
      	}
      	else {
      		auto  r=pos.lower_bound(x);
      		auto l=r;
      		l--;
      		//bug(*l);bug(*r);
      		int res=mp[*l];
      		int dx=(*r)-(*l);
      		int dt=mp[*r]-mp[*l];
      		int tt=(x-*l)*dt/dx;
      		//bug(res);
      		res+=tt;
      		//bug(res);
      		baoliu(res,0);cout<<" ";
 
      		//bug(ans);
      	}
      }
      cout<<endl;
}

D:从思路正确到越跑越远,到最后wa5次。

题意:给你一个二进制字符串 s 。请找出最少需要切割成多少个片段,以便将得到的片段重新排列成一个有序的二进制字符串。

请注意

  • 每个字符必须正好位于其中一个片段中;
  • 片段必须是原始字符串的连续子串;
  • 在重新排列时必须使用所有片段。

\(^{\dagger}\) 二进制字符串是由字符 \(\texttt{0}\) 和 \(\texttt{1}\) 组成的字符串。排序后的二进制字符串是指所有字符 \(\texttt{0}\) 都位于所有字符 \(\texttt{1}\)之前的二进制字符串。

考虑最终答案形态:只有一个交界处会是01,其他情况邻居都是和自己一样的,所以我们考虑只要和右边不一样就切割,切割n次,再判断一下有没有01段,得到切割ans次,则答案是ans+1段

void solve(){
   string s;cin>>s;
   bool flag=0;int cnt=0;
   for(int i=0;i<s.size()-1;i++){
   	cnt+=(s[i]!=s[i+1]);
   	if(s[i]=='0'&&s[i+1]=='1')flag=true;
   }
   cout<<(cnt+1-flag)<<endl;
}

标签:片段,int,944,Codeforces,二进制,mp,字符串,Div,void
From: https://www.cnblogs.com/mathiter/p/18199638

相关文章

  • Codeforces Round 945 (Div. 2) A-D
    A.ChessForThree模拟。首先可以发现每一次对局三人的得分总和加\(2\),所以若干次对局后得分总和也一定是\(2\)的倍数,然后为了使和棋数量尽可能多,一直让得分最高的两人和棋且得分数各减\(1\)直到无法做出和棋为止。#include<bits/stdc++.h>usingnamespacestd;#def......
  • Codeforces Round 945 (Div. 2)
    A-ChessForThree因为序列满足a<=b<=c的情况显然通过得分可以观察出得分总和必定为偶数否则不成立求的是最大平局数那么直接假设全部都是平局这时候发现如果c过大会导致后面的局数不是平局那么只用把c>a+b的情况取出而此时平均数为a+b点击查看代码#include<bits/stdc+......
  • Codeforces 769B News About Credit 题解
    题目简述波利卡普在由$n$名学生(包括他自己)组成的小组中学习,编号为$1$到$n$,波利卡普的编号始终是$1$。他们都在社交网络上注册,每个学生都有一个值$a_i$,表示第$i$名学生每天能发送的最大信息数。清晨,波利卡普知道了一个重要消息,他认为有必要通过私人消息紧急通知所有组员......
  • Codeforces 959B Mahmoud and Ehab and the message 题解
    题目简述小A想要给他的朋友小B发送了一条有$m$个单词的消息。他们的语言由编号从$a_1$到$a_n$的$n$个单词组成。一些单词具有相同的意思,因此存在$k$个单词组,其中每个组中的所有单词具有相同的意思。小A知道第$i$个单词可以以成本$m_i$发送。对于他的每个消息......
  • Codeforces 1113B Sasha and Magnetic Machines 题解
    题目简述有一个长度为$n$的正整数序列。你可以对这个数列进行最多$1$次的如下操作:选择两个数$i$和$j$,其中$1\leqi,j\leqn$并且$i\neqj$,并选择一个可以整除$a_i$的正整数$x$,然后将$a_i$变为$\frac{a_i}{x}$,将$a_j$变为$a_j\cdotx$。问你操作后,该序......
  • Codeforces 1178B WOW Factor
    题目简述给定一个只含$v$和$o$的字符串$s$,求字符串中有多少个$wow$(一个$w$即为连续的两个$v$)。题目分析考虑枚举每一个$o$,设下标为$i$,统计它左边和右边各有多少个$w$,分别设为$a_{i-1}$和$b_{i+1}$,依据乘法原理,将它们乘起来即为答案,累加即可。接下来,考虑怎么处......
  • Codeforces 1037C Equalize 题解
    题目描述给定两个长度为$n$的$01$序列$a,b$。每次可以执行如下操作:在$a$中选择一个位置$p$,将$a_p$变为$1-a_p$,代价是$1$。在$a$中选择两个位置$p,q$,将$a_p$和$a_q$互换,代价是$\lvertq-p\rvert$。问最少需要多少代价才能将$a$变成$b$。题目分析......
  • 「比赛总结」CF Round 834 Div.3 比赛总结
    比赛链接最后AC了\(6\)题。首先开局拼手速过了前三题。然后一眼没有瞪出来D,就写了个随机化,然后交上去发现TLEontest#3,发现随机化的时候阙值取太大了,然后就把阙值改小了,然后交上去发现WAontest#3,这也太不牛了吧!于是赶紧跳了。然后看到E,这不是个傻逼题吗?严格小于......
  • D. Deleting Divisors
    https://codeforces.com/contest/1537/problem/D题意:给定数n,alice和bob博弈,alice先手。每次操作可以减去当前n的一个因子,并且该因子不能为n和1。问谁必胜。思路:策略分析。基础分析:如果n是奇数,那么没有偶数因子。如果n是偶数,可能有偶数因子和奇数因子,如果只有偶数因子,n是2的整数......
  • Codeforces 1004B Sonya and Exhibition 题解
    题目简述让你构造一个长度为$n$的$01$字符串。一个区间的价值为其中$0$的数量乘以$1$的数量,给出$m$个区间,最大化它们的价值之和。题目分析设区间$[l,r]$中$1$有$x$个,$0$有$y$个,当$x$和$y$最接近的时候,$x\timesy$最大,此结论可以用二次函数进行证明。......