bzoj 4927: 第一题

Description

给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼

出一个正方形。注意木棍不能弯折。问方案数。

正方形:四条边都相等、四个角都是直角的四边形。

Input

第一行一个整数n。

第二行包含n个整数ai,代表每根木棍的长度。

n ≤ 5000, 1 ≤ ai ≤ 10^7

Output

一行一个整数,代表方案数。

考虑正方形每条边由几条木棍组成,只有1122和1113两种情况,分别枚举统计一下

#include<bits/stdc++.h>
typedef long long i64;
int n,a[5007],ap=0,as[5007],at[5007],t[10000007];
i64 ans=0,c3[5007];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%d",a+i);
    std::sort(a+1,a+n+1);
    for(int i=1,j=1;i<=n;i=j){
        int x=a[i];
        for(;j<=n&&a[j]==x;++j);
        c3[ap]=i64(j-i)*(j-i-1)*(j-i-2)/6;
        as[ap]=x;
        at[ap++]=j-i;
    }
    for(int i=1;i<=n;++i){
        for(int j=0;j<ap;++j)if(as[j]>a[i]){
            ans+=c3[j]*t[as[j]-a[i]];
        }
        for(int j=1;j<i&&a[i]+a[j]<=10000000;++j)++t[a[i]+a[j]];
    }
    for(int i=0,l,r;i<ap;++i)if(at[i]>=2){
        i64 s=0,s0=0,s1;
        for(r=i-1,l=0;r>=l;--r){
            for(;r>=l&&as[l]+as[r]<as[i];++l);
            if(r<l||as[l]+as[r]!=as[i])continue;
            int x=at[l];
            if(r==l){
                s1=x*(x-1)/2;
                s+=s1*(x-2)*(x-3)/12;
            }else{
                int y=at[r];
                s1=x*y;
                s+=s1*(x-1)*(y-1)/4;
            }
            s+=s0*s1;
            s0+=s1;
        }
        ans+=at[i]*(at[i]-1)/2*s;
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-11-02 08:04:42

bzoj 4927: 第一题的相关文章

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

POJ 1364 King --差分约束第一题

题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析:典型差分约束题,变换,令Ti = SUM(Xj) (0<=j<=i).  则表达式(1)可以看做T(a+b)-T(a-1) > k,也就是T(a-1)-T(a+b) < -k,又因为全是整数,所以T(a-1)-T(a+b) <= -k-1.  同理,(2)看做T(a+b)-T(

【BZOJ4927】第一题 双指针+DP(容斥?)

[BZOJ4927]第一题 Description 给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼 出一个正方形.注意木棍不能弯折.问方案数. 正方形:四条边都相等.四个角都是直角的四边形. Input 第一行一个整数n. 第二行包含n个整数ai,代表每根木棍的长度. n ≤ 5000, 1 ≤ ai ≤ 10^7 Output 一行一个整数,代表方案数. Sample Input 8 4 5 1 5 1 9 4 5 Sample Output 3 题解:这...这不是沈阳集训的原

NOIP2005-普及组复赛-第一题-陶陶摘苹果

题目描述 Description 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目.假设她碰到苹果,苹果就会掉下来. 输入输出格式 Input/output 输入格式:输入文件apple.in包括两行数据.第一行包含10个100到200之间(包括100和200

2014百度之星资格赛第一题

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11867    Accepted Submission(s): 2861 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大

HDU 2966 Aragorn&#39;s Story 树链剖分第一题 基础题

Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, the enemy has N camps out of his kingdom and M edges c

LeetCode 第一题,Two Sum

今天早上起来去机房的路上还在想,一直不做算法题老是觉得不踏实.做做题总是让自己觉得自己真的在做做学习.... 这也算是一种强迫症吧. 那就从今天开始做做LeetCode,因为好久没做过了,所以第一题还是看了别人的题解和思路,算是找找感觉. 总的来说第一题是个水.... 题目还原 Two Sum Given an array of integers, find two numbers such that they add up to a specific target number. The fu