2010 ACM-ICPC Multi-University Training Contest(2)——Host by BUPT
2012-03-01 21:54
267 查看
依然是树状数组+离散化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3450
AC
题意:找一共有多少个这样的序列(length>=2),保证相邻的两个数的绝对值不超过d:
思路:以每个值为基准点找到大于x-d最小的数a,和小于x+d的最大数b,那么就可已找到一共有多少可满足区间[x-d,x+d]的数。。。
http://acm.hdu.edu.cn/showproblem.php?pid=3450
AC
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #define N 100005 #define M 9901 using namespace std; typedef long long L; int kp ; int a ; int s ; int n,m; int tot; inline int lowbit(int x) {return x&(-x);} void update(int x,int v) { while(x<N) { s[x]+=v; if(s[x]>=M) s[x]%=M; x+=lowbit(x); } } L Quary(int x) { L sum=0; while(x>0) { sum+=s[x]; if(sum>=M) sum%=M; x-=lowbit(x); } return sum; } int lisan(int x) { int l=1,r=tot; while(l<=r) { int mid=(l+r)>>1; if(a[mid]==x) return mid; else if(a[mid]>x) r=mid-1; else if(a[mid]<x) l=mid+1; } return -1; } int lisanlift(int x) { int l=1,r=tot; int ans=0; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x)//找到比x大的最小的那个数 { r=mid-1; ans=mid; } else l=mid+1; } return ans; } int lisanright(int x) { int l=1,r=tot; int ans=0; while(l<=r) { int mid=(l+r)>>1;//找到比x小的最大的那个数 if(a[mid]<=x) { l=mid+1; ans=mid; } else r=mid-1; } return ans; } int main() { while(~scanf("%d%d",&n,&m)) { memset(s,0,sizeof(s)); tot=0; for(int i=1;i<=n;++i) { scanf("%d",&kp[i]); a[i]=kp[i]; } sort(a+1,a+n+1); for(int i=1;i<=n;++i) if(i==1||(a[i]!=a[i-1])) a[++tot]=a[i]; L res=0; for(int i=1;i<=n;++i) { int num=lisan(kp[i]); int l=lisanlift(kp[i]-m); int r=lisanright(kp[i]+m); L k=Quary(r)-Quary(l-1); if(k<0) k+=M; if(k>=M) k%=M; res+=k+1; if(res>=M) res%=M; update(num,k+1); } printf("%d\n",((res-n)%M+M)%M); }return 0; }
题意:找一共有多少个这样的序列(length>=2),保证相邻的两个数的绝对值不超过d:
思路:以每个值为基准点找到大于x-d最小的数a,和小于x+d的最大数b,那么就可已找到一共有多少可满足区间[x-d,x+d]的数。。。
相关文章推荐
- 2010 ACM-ICPC Multi-University Training Contest(11)——Host by BUPT
- hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
- HDU 3602 2012(2010 ACM-ICPC Multi-University Training Contest(16)——Host by NUDT)
- Computer Assembling //2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
- HDU 3605 Escape 最大流or二分图多重匹配 2010 ACM-ICPC Multi-University Training Contest(17)——Host by ZSTU
- HDU3523 Image copy detection 最小权匹配KM 2010 ACM-ICPC Multi-University Training Contest(9)——Host by HNU
- hdu 3496 Watch The Movie //2010 ACM-ICPC Multi-University Training Contest(6)——Host by BIT
- hdu 2010 ACM-ICPC Multi-University Training Contest(1)——Host by FZU(杯具了)
- 2010 ACM-ICPC Multi-University Training Contest(12)——Host by WHU 部分题目解题报告
- 2010 ACM-ICPC Multi-University Training Contest(14)——Host by BJTU
- SPY //2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
- Tree //2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
- Subsequence //2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
- Max Angle //2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
- hdu 3491 Thieves //2010 ACM-ICPC Multi-University Training Contest(6)——Host by BIT
- HDU 3488 Tour //2010 ACM-ICPC Multi-University Training Contest(6)——Host by BIT
- 2010 ACM-ICPC Multi-University Training Contest(2)——Host by BUPT 解题报告[部分]
- hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)
- hdu3555 - Bomb(2010 ACM-ICPC Multi-University Training Contest(12))数位dp
- 2010 ACM-ICPC Multi-University Training Contest(1) ——A Task Process