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

           

  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6034864.html
Copyright © 2011-2022 走看看