zoukankan      html  css  js  c++  java
  • CCPC2016合肥现场赛

    A(hdu5961):(BFS)

        题意:给两个有向图=P=(V,EP​​)Q=(V,EQ​​), 满足1.EP​​EQ​​没有交;2、EP​​EQ​​是竞赛图。判断PQ是否同时为传递的。一个有向图G是传递的,当且仅当对任意三个不同的顶点a,b,c,若有一条边从ab且有一条边从bc,则同样有一条边从ac

        分析:首先的想法是从所有入度为0的点开始BFS,如果有某个点第一次被更新的时间>=2就肯定不行,然而就发现反例了,后来一想,从每个点开始BFS判断就行了

    C(hdu5963):(博弈论)

        题意:给一棵n个节点的树,边有权,为0或1。在树上进行游戏,游戏开始时会确定一个节点为根,两人交替进行操作。一方操作时,选一个非根节点u满足u和其父亲之间的边权为1,然后把u到根路径上所有边权翻转。一方无法操作时,另一方胜利。有m次修改:0 x询问以x为根开始游戏谁会赢;1 x y zxy之间的边权改为z

        分析:对于每个询问的root,我们看它的儿子,如果有一个儿子到root的权值为1,那么先手可以把它翻转,那么后手如果在子树里选,那么这个边肯定要重新被翻转为1,那么先手就一直处于不败。综合考虑所有的root的儿子,也就是看看权值为1的边有多少个,如果有奇数个那么就说明先手必胜,否则后手必胜。

    D(hdu5964):(解析几何)

        题意:给定两条定直线和一个点集,在两条定直线上各取一个点,点集中取两个点,一共四个点,需要它们构成平行四边形,问构成平行四边形最大面积为多大(点数<=1e6)

        分析:枚举点集中的两个点,那么中点就定下来了,那么直线上的两点也就固定下来了,面积也就固定了,写出表达式发现结果为(f(i)-f(j))/C,所以只要O(n)扫描出f()的最大值和最小值就行了。

    E(hdu5965):(递推)

        题意:三行n列的扫雷,第二行全是数字,第一行第二行全是雷区。问有多少种填的方案。

        分析:dp[i][0/1/2][j]表示当前第i列,第i列填的雷数为0/1/2个,第i列和第i-1列总雷数位j个的方案数,递推一下就行。注意dp[i][1][j]的结果要乘2,因为雷可以放第一行也可以放第三行。

    H(hdu5968):(预处理+二分)

        题意:给一个长度n的非负整数序列ai​​,有m个询问,每次询问xi​​,问a的所有连续子序列的异或和中,与xi​​之差的绝对值最小的子序列的长度。若有多个输出最长的。n,m100

        分析:预处理出所有的连续异或和,对于每个询问二分查找。

    I(hdu5969):(贪心)

        题意:给定两个自然数lr,选两个数x,y满足lxyr 且xy最大。输出这个最大值。

        分析:从最高位开始找,直到找到第一个位置r=1,l=0,那么l后面位置就可以全部为1,再计算l和r的或值即可

    J(hdu5970):(数学)

        题意:求题目中所给公式的值。

        分析:先尝试想想求gcd的步数有什么特殊意义,后来发现并没有。注意到j很小,所以想到枚举j,观察i的规律。

           发现模j余数相同的i对应的分母的值是相同的,而分子正好是等差数列。

             但是题目中又套上了个向下取整数,这就不好办了。

           看了别人的题解才发现对于余数相同的一列数,可以找到一个整数t,使得t*j*j是分母的倍数,即增量是整数。

           也就是说只需要枚举0~t-1,后面的仍旧是等差数列。

           贴波代码:

     1         long long ans=0;
     2         scanf("%lld %lld %lld",&n,&m,&p);
     3         for(int j=1;j<=m;++j)
     4             for(int i=0;i<=j-1;++i)
     5             {
     6                 int step=0,d;
     7                 gcd(i,j,d,step);
     8                 long long q=d*d*step;
     9                 long long t=((long long)step)/ggcd(j/d*j/d,step);
    10                 long long dd=(t*j*j/q)%p;
    11                 for(int k=0;k<t;++k)
    12                 {
    13                     long long a0=((k*j*j+i*j)/q)%p;
    14                     if((n-i)/j-k<0) break;
    15                     long long len=((n-i)/j-k)/t+1;
    16                     ans=(ans+(len*a0)%p+(((len*(len-1)/(long long)2)%p)*dd)%p)%p;
    17                 }
    18             }
    19         printf("%lld
    ",ans);
    View Code

           

  • 相关阅读:
    React实现新闻网站--使用动态路由获取不同列表内容
    Bootstrap4 轮播+模态框+提示框+弹出框
    JDK 升级问题小结
    JDK8 指南(译)
    如何学习一门编程语言
    redis 系列5 数据结构之字典(上)
    sql server 临时表(上) Tempdb概述
    redis 系列4 数据结构之链表
    redis 系列3 数据结构之简单动态字符串 SDS
    redis 系列2 知识点概述
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6034864.html
Copyright © 2011-2022 走看看