首页 > 其他分享 >板刷codeforces构造题

板刷codeforces构造题

时间:2024-06-21 16:36:06浏览次数:6  
标签:typedef 板刷 codeforces long int 构造 c2 -- include

前言

听说多写构造题可以提升思维能力...


C. Turtle and an Incomplete Sequence

题目大意

给定一个数组a,只有正整数和-1,-1可以改为正整数,问数组能否满足$\lfloor a[i]/2 \rfloor = a[i+1] 或 \lfloor a[i+1]/2 \rfloor = a[i] $,能则输出方案

解题思路

可以发现,相邻2个数在完全二叉树上一定是相邻的,其实这个数列就是一个在完全二叉树上游走的过程,我们只要看相邻的2个数能否在树上以特定的步数达到即可
构造要找到相关的因素,然后大胆猜测与探索

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;

const int N=2e5+10;
int a[N];
int n;

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    if(count(a+1,a+1+n,-1)==n){
        for(int i=1;i<=n;i++)cout<<(i%2==1?1:2)<<' ';
        cout<<endl;
        return;
    }

    for(int i=1,j=1;i<=n;i++){
        if(a[i]==-1)continue;
        j=max(i+1,j);
        while(j<=n and a[j]==-1)j++;
        if(j<=n){
            int v1=a[i],v2=a[j];
            int c1=31,c2=31;
            while((v1>>c1&1)==0)c1--;
            while((v2>>c2&1)==0)c2--;
            while(c1>=0 and c2>=0){
                if((v1>>c1&1) != (v2>>c2&1))break;
                c1--,c2--;
            }
            c1++,c2++;
            for(int k=i+1;k<=i+c1 and k<=j-1;k++)a[k]=a[k-1]/2;
            for(int k=j-1;k>=j-c2 and k>=i+1;k--)a[k]=a[k+1]/2;
            for(int k=i+c1+1,t=0;k<=j-c2-1;k++,t^=1)a[k]=(t==0?a[k-1]*2:a[k-1]/2);
        }
    }
    int p=1;
    while(a[p]==-1)p++;
    for(int i=p-1;i>=1;i--){
        if(a[i+1]*2>1e9)a[i]=a[i+1]/2;
        else a[i]=a[i+1]*2;
    }
    p=n;
    while(a[p]==-1)p--;
    for(int i=p+1;i<=n;i++){
        if(a[i-1]*2>1e9)a[i]=a[i-1]/2;
        else a[i]=a[i-1]*2;
    }
    for(int i=2;i<=n;i++){
        if(a[i-1]/2==a[i] or a[i]/2==a[i-1])continue;
        cout<<-1<<endl;
        return;
    }
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
    cout<<endl; 
}  

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

E. Permutation of Rows and Columns

题目大意

给2个n * m的矩阵,里面的数是1~n * m的排列,能够任意交换行和列,问是否能够使得2个矩阵一致

解题思路

发现操作后,原来在同一列的仍然会在同一列,在同一行的仍然会在同一行,只是顺序变了,于是我们验证第二个矩阵中的每一行每一列,看其在第一个矩阵中行列是否相同
写构造题要对特性敏感,同时要敢于猜测,大胆猜测

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;


void solve(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>>a(n,vector<int>(m)),b(n,vector<int>(m));
    vector<PII>at(n*m+5);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>a[i][j];
            at[a[i][j]]={i,j};
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>b[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(at[b[i][j]].first!=at[b[i][0]].first){
                cout<<"NO"<<endl;
                return;
            }
        }
    }
    for(int j=0;j<m;j++){
        for(int i=0;i<n;i++){
            if(at[b[i][j]].second!=at[b[0][j]].second){
                cout<<"NO"<<endl;
                return;
            }
        }
    }
    cout<<"YES"<<endl;
   
}  

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

C. Nene's Magical Matrix

题目大意

对于一个n * n的矩阵,我们每次可以选择1行(或1列),给该行(该列)赋值一个1~n的排列,要在2 * n步内实现矩阵所有数的和最大,输出方案

解题思路

构造题也要多利用样例,看了样例,再加上自己尝试,可以大概清楚最大的情况就是第二个点那样,向外一层层增大的
那么如何操作呢?往简单方面想就是先做完行的操作,然后再做列的操作,发现这样做没法在2 * n内完成,然后另一种可能就是交叉着做,确实可行
构造题排除法来做也是不错的

神奇的代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<cstring>

using namespace std;

#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;


void solve(){
    int n;cin>>n;
    LL s=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int v=max(i,j)+1;
            s+=v;
        }
    }
    cout<<s<<' '<<2*n<<endl;
    for(int j=n;j>=1;j--){
        cout<<1<<' '<<j<<' ';
        for(int k=1;k<=n;k++)cout<<k<<' ';
        cout<<endl;

        cout<<2<<' '<<j<<' ';
        for(int k=1;k<=n;k++)cout<<k<<' ';
        cout<<endl;

    }
}  

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

标签:typedef,板刷,codeforces,long,int,构造,c2,--,include
From: https://www.cnblogs.com/F-beginner/p/18259501

相关文章

  • C++ 面向对象高级开发 3、构造函数
    1、内联函数inline 内联函数速度比较快 最终是不是inline实际上是由编译器决定的。 一般比较简单,编译器就能确定inline函数 2、AccessLevel访问级别  3、构造函数Construct默认实参。Defaultargument.充分利用构造函数的特殊语法,对数据进行初始化,这是一种比......
  • 【CF1773K】King‘s Puzzle(构造)
    King‘sPuzzle题目链接:CF1773K题目大意要你构造一个n个点的无向图,让所有点之间连通且无重边,且所有点的度数恰好有k种。输出方案或无解。思路高考完来复建了/hsh首先发现全部连成环就是\(m=1\)。然后思考最多能有多少种度数。然后发现除了\(1\1\)可以之外,一定要......
  • 【C++】类和对象(三)构造与析构
    文章目录一、类的6个默认成员函数二、构造函数干嘛的?语法定义特性综上总结什么是默认构造函数?三、析构函数干嘛的?语法定义析构顺序一、类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中并不是真的什么都没有。任何类在什么都不写时,编译器会自......
  • 从0开始C++(三):构造函数与析构函数详解
    目录构造函数 构造函数的基本使用构造函数也支持函数重载构造函数也支持函数参数默认值构造初始化列表拷贝构造函数浅拷贝和深拷贝析构函数 总结练习一下ヽ( ̄▽ ̄)ノ 构造函数 构造函数的基本使用构造函数是一种特殊的成员函数,用于创建对象时初始化,写法上有以下......
  • Codeforces Round 952 (Div. 4)
    知识点模块1.一个正方体x,y,z里面可以放多少个边长为a,b,c的长方体ans=(x-a+1)*(y-b+1)*(z-c+1)题解模块A.CreatingWords交换两个字母的首字母即可swap实现即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>......
  • YC302A [ 20240617 CQYC省选模拟赛 T1 ] 构造字符串(string)
    题意你需要构造一个长度为\(n\)的字符串。使得后缀数组为给定的序列\(a\),\(\text{manacher}\)的回文序列为\(b\)。Sol注意到后缀数组实际上是一系列\(\le\)的限制,而\(\text{manacher}\)是一堆相等以及两个不相等的限制。若直接建边很难搞。考虑将限制统一,后缀数组......
  • java构造器
    构造器分为无参构造与有参构造每一个类都有一个隐藏起来的无参构造这个午餐构造没有返回值和返回类型,且方法名必须与类名相同,且必须是public1.使用new关键字必须要有构造器2.构造器用来初始化alt+insert快捷键快速创建构造器当有有参构造,却想调用无参构造时,必须有一个显示......
  • Codeforces Round 953 (Div. 2) A - F
    A编号为\(n\)的一定选,第二叠书在\(1\simn-1\)选最大的。voidsolve(){ cin>>n; for(inti=1;i<=n;++i){ cin>>a[i]; } intans=a[n]; intx=0; for(inti=1;i<n;++i){ x=max(x,a[i]); } cout<<ans+x<&......
  • Codeforces Round 953 Div.2 F 题解
    连通块计数的一种常见思路是钦定代表元,但发现这题的连边方式并不好指定一个代表元,那么只能尝试优化建图。我们尝试观察一下连边的情况,通过手玩样例获得一些几何直观的感受:345534453这个样例也许比较小,不过你真的把边画出来就会发现:连边形如\(2n-1\)条完整的斜线,中间......
  • Codeforces Round 953 (Div. 2)(A~D题解)
    这次比赛是我最顺利的一次比赛,也是成功在中途打进前1500,写完第三道题的时候也是保持在1600左右,但是后面就啥都不会了,还吃了点罚时,虽说如此也算是看到进步了,D题学长说很简单,但是我当时分析错了,出了一点小问题,不然最后也能定格在2000左右,下次加油。A.AliceandBooks 题意:......