7.22 校内模拟赛

题面和数据 : 二次联通门

难度 : 普及-

/*
    T1 

    求多项式结果的后k位,由于k<=8,
    所以不必考虑高精了,直接把多项式一遍算,
    一边取模,注意用快速幂,最后补0输出即可。
    复杂度 O (n log b)
*/
#include <cstdio>

#define Max 100090

void read (int &now)
{
    register char word = getchar ();
    bool temp = false;
    for (now = 0; word < ‘0‘ || word > ‘9‘; word = getchar ())
        if (word == ‘-‘)
            temp = true;
    for (; word >= ‘0‘ && word <= ‘9‘; now = now * 10 + word - ‘0‘, word = getchar ());
    if (temp)
        now = -now;
}

int Mod = 1;
int N, K, X;

int a[Max], b[Max];

long long Fast_Pow (long long x, long long p)
{
    register long long res = 1;
    for (; p; p >>= 1)
    {
        if (p & 1)
            res = res * x % Mod;
        x = x % Mod * x % Mod;
    }
    return res;
}

#define Judge
long long Answer;

int number[Max / 1000];

int main (int argc, char *argv[])
{

#ifdef Judge

    freopen ("digits.in", "r", stdin);
    freopen ("digits.out", "w", stdout);

#endif 

    read (N);
    read (K);

    for (int i = 1; i <= N; i ++)
    {
        read (a[i]);
        read (b[i]);
    }

    for (int i = K, res = 10; i; i >>= 1)
    {
        if (i & 1)
            Mod = Mod * res;
        res *= res;
    }
    read (X);

    for (int i = 1; i <= N; i ++)
        Answer = (Answer + (a[i] * Fast_Pow (X, b[i]) % Mod)) % Mod; 

    int Count = 0;
    for (; Answer > 0; number[++ Count] = Answer % 10, Answer /= 10);

    for (int i = Count; i < K; i ++, printf ("0\n"));

    for (; Count >= 1; printf ("%d\n", number[Count --]));
    return 0;
} 

/*
    T2

    把多项式左边的负项移到右边,
    O(N^3)预处理出右边的结果,用一个桶记录下来,
    后O(N^3)枚举左边的结果, 加减就好了
    复杂度O(N^3)
*/
#include <cstdio>

#define Max 60000002

#define N 6

void read (int &now)
{
    register char word = getchar ();
    bool temp = false;
    for (now = 0; word < ‘0‘ || word > ‘9‘; word = getchar ())
        if (word == ‘-‘)
            temp = true;
    for (; word >= ‘0‘ && word <= ‘9‘; now = now * 10 + word - ‘0‘, word = getchar ());
    if (temp)
        now = -now;
}

#define Judge

int K;

short z_count[Max];
short f_count[Max];

int a1, a2, a3, a4, a5, a6;

int main (int argc, char *argv[])
{

#ifdef Judge 

    freopen ("equation.in", "r", stdin);
    freopen ("equation.out", "w", stdout);

#endif

    read (K);
    read (a1);
    read (a2);
    read (a3);
    read (a4);
    read (a5);
    read (a6);    

    register int x;

    for (register int i = 1, j, k; i <= K; i ++)
        for (j = 1; j <= K; j ++)
            for (k = 1; k <= K; k ++)
            {
                x = a2 * i + a4 * j + a6 * k;
                if (x >= 0)
                    z_count[x] ++;
                else
                    f_count[-x] ++;
            }

    int Answer = 0;

    for (register int i = 1, j, k; i <= K; i ++)
        for (j = 1; j <= K; j ++)
            for (k = 1; k <= K; k ++)
            {
                x = a1 * i + a3 * j + a5 * k;
                if (x >= 0)
                    Answer += z_count[x];
                else
                    Answer += f_count[-x];
            }

    printf ("%d", Answer);
    return 0;
}

/*
    T3 

    由于k>=n,所以一天最多走一条边,
    则问题转化为了求最小瓶颈生成树的裸题。。。。
    若一直到最后起点与终点都不联通,那么则无解

    复杂度 O(M logM + M) = O (M log M)
*/
#include <algorithm>
#include <cstdio>

#define Max 8000

void read (int &now)
{
    register char word = getchar ();
    for (now = 0; word < ‘0‘ || word > ‘9‘; word = getchar ());
    for (; word >= ‘0‘ && word <= ‘9‘; now = now * 10 + word - ‘0‘, word = getchar ());
}

inline int max (int a, int b)
{
    return a > b ? a : b;
}

struct Edge
{
    int from;
    int to;
    int dis;

    bool operator < (const Edge &now) const
    {
        return this->dis < now.dis;
    }
};

class Unio_Find_Set
{

    private :

        int father[Max];

    public :

        void Prepare (int N)
        {
            for (int i = 1; i <= N; i ++)
                father[i] = i;
        }

        int Find (int x)
        {
            return father[x] == x ? x : father[x] = Find (father[x]);
        }

        inline void Unio (int a, int b)
        {
            father[a] = b;
        }
};

Unio_Find_Set Ufs;

int N, M, K;

Edge edge[Max * 30];
#define Judge

int main (int argc, char *argv[])
{

#ifdef Judge 

    freopen ("graph.in", "r", stdin);
    freopen ("graph.out", "w", stdout);

#endif

    read (N);
    read (M);
    read (K);

    for (int i = 1; i <= M; i ++)
    {
        read (edge[i].from);
        read (edge[i].to);
        read (edge[i].dis);
    }

    Ufs.Prepare (N);
    std :: sort (edge + 1, edge + 1 + M);

    int Count = 0;
    for (register int i = 1, x, y; i <= M; i ++)
    {
        x = Ufs.Find (edge[i].from);
        y = Ufs.Find (edge[i].to);

        if (x != y)
        {
            Ufs.Unio (x, y);
            Count ++;
        }
        if (Ufs.Find (1) == Ufs.Find (N))
        {
            printf ("%d", edge[i].dis);
            return 0;
        }
        if (Count == N - 1)
            break;
    }
    printf ("-1");
    return 0;
}
时间: 2024-10-31 16:28:18

7.22 校内模拟赛的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

校内模拟赛 Zbq&#39;s Music Challenge

Zbq's Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$.对于一个序列$S$,它的得分是 $$BasicScore=A\times \sum_{i=1}^{n}{S_i} \tag{1}$$ $$ combo(i)=\left\{ \begin{aligned} &S_i & &i=1 \\ &combo(i-1)+1 & &i\neq 1 ~\mathrm{and}~ S_i=1 \\ &

校内模拟赛:确定小组

  [问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确的答案,但是由于时间仓促,记者不一定询问了每个人,我们记录一个长度为n的答案序列,序列的第i个数表示第i个人的回答,如果为0则表示记者没有询问过这个人. 记者发现,对于一些情况,他可以唯一确定这排所有人的分组,而对于另外一些情况则不能,于是记者开始好奇,对于某一个答案序列,他能不能做到这一点,如

[20180816]校内模拟赛

T1 清理(clear) 问题描述 小 C 最近自己开发了一款云盘软件,目前已有??个用户.小C 的云盘上的文件会被后台分成两种类型,活动 文件和非活动文件,活动文件即可能常用的文件,会被放在高速服务器上给用户提供高速下载服务.用户 上传一个文件时,这个文件会被设置为活动文件.由于高速服务器内存大小有限,小 C 需要把一些文件 设为非活动文件,有以下两种设置方式:1.把上传时间前??早的文件全部设为非活动文件:2.把第??个用户上 传的文件全部设为非活动文件.注意这两种方式操作的对象都是所有文件

校内模拟赛T1大美江湖

这就是一个模拟题,注意1234分别对应左右上下横坐标和纵坐标的判断就好了 题解: 需要注意的是,向上取整ceil函数是对于一个double值返回一个double值,也就是说在ceil里面的类型一定要是double,否则会炸 代码: #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #include<cstring> #include<string>

校内模拟赛20170604

香蕉锤--双向链表 #include<iostream> #include<cstdio> using namespace std; inline int read(){ int num=0,t=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();} ret

5.13 校内模拟赛

... 果然是dalao们做难题做多了后 简单题水不起来了吗.. 5.13解题报告 300分 T1写了差不多30~40分钟 T2写了不到5min (当时怀疑有坑..) T3推了大概1个多小时的式子, 然后又加上调试差不多一个半小时 时间分配就这样..感觉T2出的太过简单了..直接是个模板 T1 并查集 + 乱搞 T2 快速幂模板 T3 Dp T1 : codevs 2796 最小完全图 二次联通门 : codevs 2796 最小完全图 /* codevs 2796 最小完全图 并查集 + 乱搞

校内模拟赛(20170924)

四校很丧,但是学长的题目更简单 lrb学长的题目为什么都要倒着切,不懂QAQ ----------------我是分割线---------------- T1:个人卫生综合征 每天BBS都要从家里经过城市中的一段路到学校刷五三.城市中一共有n个路口和m条双向道路,每条双向道路都连接着两个路口ai.bi且有一定的时间花费vi.BBS家编号为1,学校编号为n.今天,BBS由于个人卫生综合征导致他很迟才离开家,他想用膜法改变k条道路的长度使通过其的时间花费vi变为0.现在他问你改变道路长度之后他到学校

校内模拟赛(20170921)

救命啊,救命啊!学长出丧题啦!!! 学长他们压榨我们的劳动力,然后带着我们的成绩跑了,无奈的我们只好玩命的调程序,把学长留给我们的丧题做完(划掉) 65分的rank 1跑路. ----------------我是分割线---------------- T1:粉饰(decorate) [题目描述] 小D有一块被分为n*m个格子的矩形鱼片.为了装饰鱼片,小D决定给每个格子上色.由于小D很喜欢红白,所以小D给每个格子涂上了红色或白色,第i行第j列的格子颜色记为c[i,j].涂完之后,小D想评估这块鱼片