首页 > 其他分享 >武汉工程大学2020GPLT选拔赛(重现赛)

武汉工程大学2020GPLT选拔赛(重现赛)

时间:2024-07-30 19:41:55浏览次数:10  
标签:2020GPLT fa int cin long 选拔赛 重现 ans define

L2-4 缘之空
1.使用倍增法求最近公共祖先,然后利用公共祖先计算两点的树上距离
2.但是此题并没有提供根节点,所以要先找到根节点以后才可以进行倍增法求lca

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353
const int N=2e5+5;
//-------------倍增法求最近公共祖先---------------------------
int n,q;
vector<int>vct[N];
int dep[N],fa[N][20];//dep存u点的深度,fa存从u点向上跳2的i次方层祖先节点

void dfs(int u,int father){
    dep[u]=dep[father]+1;
    fa[u][0]=father;  ////init跳1步
    for(int i=1;i<=17;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
    for(auto v:vct[u]) if(v!=father) dfs(v,u);
}
int lca(int u,int v){
    if(dep[v]>dep[u]) swap(u,v);
    ////先跳到同一层
    for(int i=17;i>=0;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
    if(u==v) return u;
    for(int i=17;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
    return fa[u][0];
}
int dist(int u,int v){ return dep[u]+dep[v]-2*dep[lca(u,v)];}
//-------------------------------------------------------
//求树上距离使用倍增法方便,只求最近公共祖先使用tarjan方便

signed main()
{
    cin>>n>>q;
    map<int,int>mp;
    for(int i=1;i<n;i++) {
        int a,b;
        cin>>a>>b;
        mp[b]=1;
        vct[a].push_back(b);
        vct[b].push_back(a);
    }   
//------求根节点,看哪个节点没有父节点 -----   
    int head=1;
        for(int i=1;i<=n;i++){
            if(!mp[i]) {
                head=i;
                break;
                
            }
        }
//-------------------------------
    dfs(head,0);
        
    while(q--)
    {
        int u,v; cin>>u>>v;
        int llca=lca(u,v),d=dist(u,v);
        //不能同系
        if(llca==u||llca==v||d<=4) cout<<"NO";
        else cout<<"YES";
        cout<<endl;
        cout<<d;
        cout<<endl;
    }
   
   
   
}




L1-7 拼接梯子
1.本来以为要搜索,其实只需要看二进制位上的1即可,每一个1都代表2的次方,但是如果是奇数或者所有材料的和都比梯子小就无法满足题意,因为材料全为偶数,其次在左移的时候1要写成1ll。

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353
const int N=2e5+5;
int a[68];

signed main()
{

   int k,l; cin>>k>>l;
   int ans=-1,cnt=0;
   if(l&1||(1ll<<(k+1))-1<l) {
       cout<<"No";//||2的n次方的等比求和为2的n+1次方减1
   }
   else //注意-1要放在整个左移外面,不然就会先计算k+1-1,再左移
    {
        while(l)
        {
            if(l&1)  ans=cnt;
            l>>=1;//二进制位往右移检查是不是一,若是更新ans
            cnt++;
        }
        cout<<"Yes"<<endl;
    ans=(1ll<<ans);
   cout<<ans;
    }
    
 
}


L2-1 特殊的沉重球
也是一道dfs的好题,其实这个题可以总结成一类题

有n个物品,每个背包最大可以装w体积的物品,每个物品的体积为ci,且1<=ci<=w,求可以装下这n个物品的最少的背包数量。

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353
int n,w;
int ans;
int a[70],b[1000005];//a为宝可梦的数量,b为每个球装的重量
void dfs(int x,int now)//x为第几个宝可梦,now为现在用了几个球
{
    if(now>=ans) return ;
    if(x>n)
    {   for(int i=1;i<=now;i++) cout<<b[i]<<" ";
        cout<<endl;
        ans=min(now,ans);
        return ;
    }
    
    for(int i=1;i<=now;i++)//注意这里是i<=now
    {
        if(a[x]+b[i]<=w){//之前的球可以装进去,那么就不增加
            b[i]+=a[x];
            dfs(x+1,now);//不增加球数
            b[i]-=a[x];
            
        }
    }
    //前面的球都无法装这个宝可梦,单独开一个
    b[now+1]+=a[x];
    dfs(x+1,now+1);
    b[now+1]-=a[x];
}



signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>w;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    ans=n;//最多用掉n个
    dfs(1,1);
    cout<<ans;
   
}


L1-6 分鸽子
二分答案,枚举鸽子肉重量,看这个重量下可以达到的人数是否大于等于m即可

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353
 int n,m;
int a[100005];
bool check(int x)
{
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>=x) sum+=a[i]/x;//注意要取等
    }
    if(sum>=m) return 1;
    return 0;
    
}

signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int l=1,r=1e10;
    int ans=0;
//---二分板子-----建议背这个--
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid)){
            ans=mid;
            l=mid+1;
        }else r=mid-1;
    }
  //-----------------------
    cout<<ans;
   
}


L1-4 颠倒阴阳
按题意模拟即可,学会转二进制和十进制到相互转换

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353

char c[505][505];
int n,m,flag=1;
int ans[15];
map<int,int>mp;
queue<pii>q;


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int n;
    cin>>n;
    string s;
    while(n)
    {
        s+=n%2+'0';
        n/=2;
    }
    int ans=0;
    //取反过程
    for(int i=0;i<s.size();i++){
        if(s[i]=='0') s[i]='1';
        else s[i]='0';
    }
    //补0
    while(s.size()<32) s+='0';
    
    //cout<<s;
    
    for(int i=0;i<s.size();i++)
    {
        ans=ans*2+s[i]-'0';//可以按十进制理解
    }
    
    cout<<ans;

   
}


L1-5 演唱会
转换为秒数来比较即可

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353

char c[505][505];
int n,m,flag=1;
int ans[15];
map<int,int>mp;
queue<pii>q;


signed main()
{
    //ios::sync_with_stdio(0),cin.tie(0);
    int hh,mm,ss;
    char cc;
    //用cc吃掉百分号,因为实际上没用
    cin>>hh>>cc>>mm>>cc>>ss;
    
 
    int sum=hh*3600+mm*60+ss;
    int tt=3600+22*60+33;
    if(sum+tt<19*3600) cout<<"arrive on time";
    else if(sum+tt<21*3600) cout<<"arrive late";
    else if(sum+tt>=21*3600)cout<<"too late";
    
   
}


L1-3 Pokémon
不是闪光的概率为99,按要求保留两位输出,记得闪光还得多除100

/**   - swj -
   *         
      />_____フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
 
**/
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define ull unsigned long long
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
#define mod 998244353

char c[505][505];
int n,m,flag=1;
int ans[15];
map<int,int>mp;
queue<pii>q;


signed main()
{
    //ios::sync_with_stdio(0),cin.tie(0);
    double a[8];
    for(int i=1;i<=7;i++)  {
        char cc;
        cin>>a[i]>>cc;
    }
    int  xx,f; cin>>xx>>f;
  if(f==1)  printf("%.2lf",a[xx+1]/100);
  else printf("%.2lf",a[xx+1]*0.99);
    cout<<"%";
    
    
   
}


标签:2020GPLT,fa,int,cin,long,选拔赛,重现,ans,define
From: https://www.cnblogs.com/swjswjswj/p/18331003

相关文章

  • ~T 在类型的运行时重现中意味着什么?
    在使用Python的typing模块时,我遇到了一些奇怪的事情:>>>fromtypingimportList,Tuple>>>List[Tuple[int]]typing.List<~T>[typing.Tuple[int]]这个类似Java的语法是什么List<~T>?这是什么意思?在Python的typing模块中,~T......
  • 2024中国工业互联网安全大赛智能家电行业赛道选拔赛
    流量分析的附件链接:https://pan.baidu.com/s/1UlWzfmsmRsZTR56FzXLuEg?pwd=6666提取码:6666恶意攻击流量描述:应用系统被植入了恶意后门,并从流量中识别其中的flag,提交格式:fag{XXXXXXXX}追踪这个流量解码过滤或者工具一把梭flag{39084EEF2D28E941F53E4A1AA1......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 活久见 —— 美国总统被暗杀 —— 经典影视剧重现 —— 美国前总统特朗普被刺杀未遂
    目前来看,特朗普已经提前锁定总统位置,如无重大变化这基本成事实。这次的未遂刺杀必然激起红脖子阵营的愤怒,也必然为特朗普争取更多的选票,或许特朗普要再度创造历史。不得不说,特朗普再度上任美国总统对全世界以至我国都不是很乐见的事情。一个大国总统该有的理智、智慧以及政......
  • 本地部署,Colorizer: 让黑白图像重现色彩的奇迹
    目录引言什么是Colorizer​编辑​编辑Colorizer的特点工作原理应用场景本地部署本地运行实验与结果结语Tip:引言自摄影术发明以来,黑白图像一直是记录历史和艺术创作的重要手段。然而,黑白图像虽然具备其独特的美感,但也失去了色彩信息,使观众难以全面感知图像中......
  • 第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题-附答案
    第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题题目总数:11总分数:400真题下载点我百度网盘......
  • 大一下集训队选拔赛
    rank2还需努力7paoxiaomo不爱DP很简单的一道DP赛时看错数据范围导致陷入思考误区其实只用求每个前缀和对应的答案然后往后合并区间一但有区间和等于pre[i]那么将该区间加入并且计算贡献如果区间和大于pre[i]那么该答案不符合点击查看代码#include<bits/stdc++.h>#de......
  • 老旧照片修复能用什么软件?重现珍贵回忆的老旧照片
    你在打扫的时候,是不是也曾翻到过自己旧时的照片?相信这些照片记录着你的欢笑、家人的团聚,还有你逝去的梦想。如同照片上出现的褪色和破损一样,时间带走的东西太多了。但是不要放弃,老照片修复功能还能帮你。不管是多么严重模糊的老照片修复,只需要上传影像,它就可以逐渐去除每一处......
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 (vp + 补题
    比赛主页:https://ac.nowcoder.com/acm/contest/52244AXorBProblem思路:如果i!=j代表(i,j)&(j,i)是两对,也就是说如果i==j代表只有一对,综上得出公式cnt[i]*cnt[i]的累加就是我要的答案Code:#include<bits/stdc++.h>usingnamespacestd;typedeflo......
  • 第十二届蓝桥杯选拔赛 python
    第一题(难度系数2,18个计分点) 编程实现:输入一个正整数n,计算出n乘100的积。 输入描述:输入一个正整数n输出描述:输出n乘100的积 样例输入:2样例输出:200  第二题(难度系数3,20个计分点) 编程实现:给定一个正整数,判断这个正整......