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
- hdu5720Wool
- hdu5720Wool+区间覆盖总长
- servlet编码问题
- 如何让Android Studio的智能感知不区分大小写?
- React-redux使用
- UIWindow、UIView、UIViewController的关系
- git2.9.2使用总结
- hdu5720Wool
- CSS+JS
- 安卓面试题:1-关于Activity
- 洛谷 P1965 [NOIP2013 D1T1] 转圈游戏
- 43.事件分发机制
- css float 关于清除浮动的四个技巧
- javascript运行机制之执行顺序详解
- (python + conda => anaconda ) + qt5 + opencv in ubuntu
- Java单例模式——并非看起来那么简单