Codeforces Round #630 (Div. 2) A~D【思维,数论,字符串,位运算】

A. Exercising Walk

水题一道:在指定空间内你一定要向各个方向走a,b,c,d步问你能否在规定空间内走完这题的坑点样例都给出来了qwq

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define str first
#define blu second
using namespace std;
const int N = 2e6 + 10;
typedef pair<int,int> PII;
typedef long long LL;
map<LL,int> mp;

int main(){
    int t;
    cin>>t;
    while(t--){
        int a,b,c,d;
        int x,y,x1,y1,x2,y2;
        cin>>a>>b>>c>>d;
        cin >>x >> y>>x1>>y1>>x2>>y2;
        x+=b-a;
        y+=d-c;
        if((x1==x2&& (a || b)) ||(y1==y2 && (c || d))) {cout<<"No"<<endl;}
        else if(min(x1,x2)<=x&&x<=max(x1,x2)&&min(y1,y2)<=y&&y<=max(y1,y2)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;

    }
  return 0;
}

B. Composite Coloring

感觉b题在玩文字游戏,题目大意就说,给你一系列的合数,(注意)假如两个数涂相同的颜色,那么他们就的最大公约数大于1,【而不是假如他们最大公约数大于1,就涂相同的颜色】;我们可以知道如果两个数有共同的质因子一定涂同种,因为gcd > 两个公共最小质因子。数据范围太小,直接把1~1000里面的质数筛出来再一个去匹配就好了,最后输出每个数涂的颜色,以及总共的颜色数

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define str first
#define blu second
using namespace std;
const int N = 2e3 + 10;
typedef pair<int,int> PII;
typedef long long LL;
map<LL,int> mp;
int a[N];
int prime[N];
int cnt;
bool vis[N];
int col[N];
int main()
{
    int t;
    for(int i = 2; i <= 2000; ++ i)
    {
        if(!vis[i]) prime[cnt ++] = i;
        for(int j = 0; j < cnt && i * prime[j] <= 2000; ++ j)
        {
            vis[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
    cin>>t;
    while(t--){
       cin >> d;
       for(int i = 0; i < d; ++ i)
         cin >> a[i];
        int m = 1;
        int num = 0;
        for(int i = 0; i < 12; ++ i)    
        {
            bool flag = false;
            for(int j = 0; j < d; ++ j)
            {
                if(!col[j] && a[j] % prime[i] == 0)
                  col[j] = m, num ++, flag = true;
            }
            if(num == d) break;
            if(flag) m ++;
        }
        cout << m << endl;
        for(int i = 0; i < d; ++ i)
        {
            cout << col[i] <<" ";
            col[i] = 0;
        }
        cout << endl;
    }
  return 0;
}

C. K-Complete Word

字符串类型题

给你一个字符串,改变其中的n个字母让它变成一个循环节长度为k的回文字符串,求最小操作数n

这里有两个要点就是回文和周期性

这里我们可以得到一个性质就是:改造后得串每个周期内一定也是回文得

反证法:加入说每个周期内不是回文的,又因为整体回文,所以后边就等于前边的反串,上面我们假设不回文,那么,反串!=原串,那么与周期性相矛盾,所以,上面结论得证

我们知道是周期串了,并且子串回文,那么我们就可以找出一个串中哪些位置应该的字母应该相同,我们统计一下,这些位置上的字母哪些最多,我们再把其他位置上的字母改成它就好了

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define str first
#define blu second
using namespace std;
const int N = 2e5 + 10;
typedef pair<int,int> PII;
typedef long long LL;
map<LL,int> mp;
int  b, c ,d;
char a[N];
int vis[26];
int main()
{
   IOS;
   cin >> b;
   while(b --)
   {
       cin >> c >> d;
       cin >> a + 1;
       int cl = c / d;
       int res = 0;
       
       for(int i = 1; i <= (d + 1) / 2; ++ i)
       {
           int tot = 0;
           for(int j = i; j <= c; j += d)
             vis[a[j] - 'a'] ++, tot ++;
           for(int j = d - i + 1;j != i && j <= c; j += d)
             vis[a[j] - 'a'] ++, tot ++;
           int ans = 0;
           for(int j = 0; j < 26; ++ j)
           {
               ans = max(ans,vis[j]);
               vis[j] = 0;
           }
          res += tot - ans;
       }
       cout << res << endl;
   }
  return 0;
}

D. Walk on Matrix

题目大意:这个人从1,1走到n,m每次按位与且只能向右或者向下这个给你看的是他的算法当然是错的让你构造一个矩阵使得 正确答案-他的答案= k

先构造出一条路径使结果为11111111111

然后再凑出错误答案

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define str first
#define blu second
using namespace std;
const int N = 2e5 + 10;
typedef pair<int,int> PII;
int main()
{
    int maxn = 262143, k;
    cin >> k;
    cout << "3 3" << endl;
    cout << maxn <<" " << k <<" " <<"0" << endl;
    cout << (maxn ^ k) <<" " << maxn << " 0" << endl;
    cout << "0 " << k << " " << k << endl;
    return 0;
}

你可能感兴趣的:(我在cf刷题之路)