首页 > 其他分享 >COMPFEST 14 - Preliminary

COMPFEST 14 - Preliminary

时间:2022-09-06 21:33:28浏览次数:89  
标签:ch 14 int long getchar read Preliminary dis COMPFEST

A. Accumulation of Dominoes

这题了一个构造矩阵的方法。相邻的两个方块组在一起是一张牌,问有多少张牌是两个数的差值为一的。

根据构造规则发现只有两个方块在一行才可能差值唯一,除非矩阵的宽只有一

#include<bits/stdc++.h>
#define int long long
using namespace std;

int32_t main() {
    int n , m;
    cin >> n >> m;
    if( m == 1 )	cout << n - 1 << "\n";
    else	cout << n * m - n;
    return 0;
}

B. Basketball Together

一个队伍中每个人都价值可以转变成队伍中价值最高的价值。所以把所有人排序,然后选一个价值高,然后一直选择价值低的直到队伍的价值大于D

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5+5;
int p[N];

int read() {
    int x = 0, f = 1, ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x * f;
}

int32_t main() {
    int n = read() , d = read() , res = 0;
    for( int i = 1 ; i <= n ; i ++ ) p[i] = read();
    sort( p + 1 , p + 1 + n , greater<int>() );
    for( int i = 1 , j = n , k; i <= j ; i ++ ){
        k = 1;
        while( i < j && p[i] * k <= d ) k ++ , j --;
        if( p[i] * k > d ) res ++;
    }
    cout << res << "\n";
    return 0;
}

G. Garage

设正方形的边长为\(c\),则正方形的面积为\(c^2=b^2-a^2\)

因为\(b>a\),当\(b=a+1\)时,可得\(c^2=b^2-a^2=2a+1\),此时包含了所有大于三的奇数

当\(b=a+2\)时,可得\(c^2=b^2-a^2=4a+4\),此时包含了所有大于等于 8 所有 4 的倍数

对于其他情况可以验证一定被这两种情况给包含,说有我们可以二分\(c\),然后计算出c是第几大的。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int32_t main() {
    int n;
    cin >> n;
    int l = 3 , r = INT_MAX , mid , res;
    while( l <= r ){
        mid = ( l + r ) >> 1;
        if( ( mid - 1 ) / 2 + max( 0ll , mid / 4 - 1 ) >= n ) res = mid , r = mid - 1;
        else l = mid + 1;
    }
    cout << res << "\n";
    return 0;
}

M. Moving Both Hands

首先在图中加入\((u,v)\)的反向边\((v,u)’\),用\(d(x,y)\)表示从x 到 y 的最短路径,那么令中间点为\(k\),那么题目要求的就是\(d(1,k)+d(p,k)\),然后用反向边表示\(d(1,k)+d’(k,p)\)

然后再图中对于每一个点\(x\)都加入一个点\(x’\),这样在加入\((u,v,w)\)的时候同时加入一个\((v’,u’,w)\),这样题目所求就变成了\(d(1,k)+d(k’,p’)\)。然后整个图中只能从正向点走向方向点一次,所以在图中再加入\((x,x’,0)\)

这样所求就变成了\(d(1,k)+d(k,k’)+d(k’,p’)=d(1,p’)\),从1 跑一遍 dijkstra,然后输出就好了

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 4e5+5;
int n , m , dis[N];
bitset<N> vis;

vector< pair<int,int> > e[N];

int read() {
    int x = 0, f = 1, ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x * f;
}

void dij(){
    fill( dis , dis + N , 1e18 );
    dis[1] = 0;
    priority_queue< pair<int,int> , vector<pair<int,int>> , greater<pair<int,int>> > q;
    q.push( { 0 , 1 } );
    while( q.size() ){
        int u = q.top().second ; q.pop();
        if( vis[u] ) continue;
        vis[u] = 1;
        for( auto [ v , w ] : e[u] )
            if(  dis[v] > dis[u] + w ){
                dis[v] = dis[u] + w;
                q.push( { dis[v] , v } );
            }
    }
}

int32_t main() {
    n = read() , m = read();
    for( int u , v , w ; m ; m -- ){
        u = read() , v = read() , w = read();
        e[u].push_back( { v , w } ) , e[ v+n ].push_back( { u+n , w } );
    }
    for( int i = 1 ; i <= n ; i ++ ) e[i].push_back({ i+n , 0 } ) ;
    dij();
    for( int i = 2 ; i <= n ; i ++ )
        cout << ( dis[i+n] != 1e18 ? dis[i+n] : -1ll ) << " ";
}

标签:ch,14,int,long,getchar,read,Preliminary,dis,COMPFEST
From: https://www.cnblogs.com/PHarr/p/16663390.html

相关文章

  • leetcode 114. Flatten Binary Tree to Linked List 二叉树展开为链表(简单)
    一、题目大意给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。......
  • 14. 最长公共前缀
     难度简单2431收藏分享切换为英文接收动态反馈编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["f......
  • 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002)
    时间限制:1000ms      内存限制:65536KB提交数:26367   通过数:11410【题目描述】棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下......
  • ARC147题解(A~E)
    \(A\)\(Problem\)给定长度为\(n\)的序列\(A\),要求重复执行以下操作,直到\(A\)中的元素个数为\(1\):选出下标\(i\),使得\(A_i\)是\(A\)中剩余的数中最大的;选出......
  • VMware Workstation pro14 虚拟机下安装CentOS6.5图文教程
    VMwareWorkstationpro14虚拟机下安装CentOS6.5图文教程<h1id="h1-vmware-workstation-pro14-centos6-5-"><aname="VMwareWorkstationpro......
  • CF1453D Checkpoints(期望)
    Gildongisdevelopingagameconsistingof......
  • 听说 iPhone14 在 中国时间 9月8日发布, 让我们用python采集看看网友怎么说
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~今天我们来采集一下评论数据! WB态数据抓包+所有的数据提取方式+词云图可视化开发环境:python3.8......
  • 14.Springboot多环境配置2
    1.主配置文件application.ymlspring:profiles:active:@profile.active@#需要在pom文件中指定变量#active:pro#include:mvcgroup:"pro......
  • Atcoder Regular Contest 147
     AtcoderRegularContest147这是本蒟蒻第3次打的\(ARC\),赛时的时候\(B\)题调代码调崩了,\(wa\)了15发。所以来简略的写一下题解A:题目链接题目大意:略题目分析......
  • P1409 骰子
    P1409骰子题目大意\(n\)个人排成一排,你排在第\(m\)个。每轮队首的人投一次骰子。若掷到\(1\),则队首的人获胜。若掷到\(2,4,6\),则队首的人排到队尾。若掷到\(......