hdu5720Wool

来源:互联网 发布:数据分析员发展前景 编辑:程序博客网 时间:2024/06/06 06:50

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5720

题意:给定n个数a[i]和l,r。要求计算l~r之间有多少个数不能和a数组中的两个数构成三角形。

分析:简单分析一下我们就能知道将a排序,然后对于a[i]来说1~i-1中和它构成最大的不可取的区间是a[i-1],因为不可取区间是a[i]-a[j]+1~a[i]+a[j]-1。那么我们用这些不可取区间去和[l,r]交出可取区间就行了。PS:我比赛的代码实现好丑!还是多学习学习别人的吧。

代码:

#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<vector>#include<string>#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=100010;const int mod=100000000;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=1000000007;const int INF=1000000010;const double pi=acos(-1.0);typedef double db;typedef unsigned long long ull;int f[5*N];ll a[N],c[5*N],d[5*N];int main(){    int i,k,g,n,t,w,u,v;    ll l,r,ans;    scanf("%d", &t);    while (t--) {        memset(d,0,sizeof(d));        scanf("%d%I64d%I64d", &n, &l, &r);        for (i=1;i<=n;i++) scanf("%I64d", &a[i]);        sort(a+1,a+n+1);        k=0;d[++k]=l;d[++k]=r+1;        for (i=1;i<n;i++) {            if (a[i+1]-a[i]>=l) d[++k]=a[i+1]-a[i]+1;            if (a[i+1]+a[i]<=r) d[++k]=a[i+1]+a[i];        }        sort(d+1,d+k+1);        g=unique(d+1,d+k+1)-(d+1);        for (i=1;i<=k;i++) c[lower_bound(d+1,d+g+1,d[i])-d]=d[i];        u=lower_bound(d+1,d+g+1,l)-d;        v=lower_bound(d+1,d+g+1,r+1)-d;        memset(f,0,sizeof(f));        for (i=1;i<n;i++) {            if (a[i+1]-a[i]>=l) {                if (a[i+1]-a[i]>r) {                    f[u]++;f[v]--;                } else {                    w=lower_bound(d+1,d+g+1,a[i+1]-a[i]+1)-d;                    f[u]++;f[w]--;                }            }            if (a[i+1]+a[i]<=r) {                if (a[i+1]+a[i]<l) {                    f[u]++;f[v]--;                } else {                    w=lower_bound(d+1,d+g+1,a[i+1]+a[i])-d;                    f[w]++;f[v]--;                }            }        }        for (i=1;i<=g;i++) f[i]+=f[i-1];        ans=0;        for (i=1;i<g;i++)        if (f[i]==n-1) ans+=c[i+1]-c[i];        printf("%I64d\n", ans);    }    return 0;}

代码:

#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<vector>#include<string>#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=100010;const int mod=100000000;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=1000000007;const int INF=1000000010;const double pi=acos(-1.0);typedef double db;typedef unsigned long long ull;ll a[N];int main(){    int i,n,t;    ll l,r,L,R,ans;    scanf("%d", &t);    while (t--) {        scanf("%d%I64d%I64d", &n, &L, &R);        for (i=1;i<=n;i++) scanf("%I64d", &a[i]);        sort(a+1,a+n+1);ans=0;        for (i=n-1;i;i--) {            l=a[i+1]-a[i]+1;            r=a[i]+a[i+1]-1;            if (l>R||r<L) continue ;            if (R>r) ans+=R-r;            R=l-1;if (L>R) break ;        }        if (L<=R) ans+=R-L+1;        printf("%I64d\n", ans);    }    return 0;}

0 0
原创粉丝点击