1. /*
  2. 做法一:按h sort一遍,对于一段区间[i,j],高度花费就是h[j]-h[i]
  3. 然后枚举区间,把区间内C排序,一个一个尽量选即可。
  4. n^3logn
  5. 标算:n^3 dp
  6. 高度排序,保证从前往后调。
  7. f[i][j]表示当前在第i栋楼,已经跳了j次楼的最小话费。转移枚举下一次跳那座楼。
  8. f[k][j+1]=min(f[i][j],f[i][j]+h[k]-h[i]+c[k]);最后枚举f[i][j]<T,ans=max(ans,j)。
  9. */
  10. #include<iostream>
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<algorithm>
  14.  
  15. #define N 510
  16.  
  17. using namespace std;
  18. int T,n,ans,cnt;
  19. int f[N][N];//当前处于第i座楼房已经跳了j次楼最小花费
  20. struct node{
  21. int h,c;
  22. bool operator < (const node a) const{
  23. return h<a.h;
  24. }
  25.  
  26. }L[N];
  27.  
  28. inline int read()
  29. {
  30. int x=,f=;char c=getchar();
  31. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  32. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  33. return x*f;
  34. }
  35.  
  36. int main()
  37. {
  38. n=read();
  39. for(int i=;i<=n;i++) L[i].c=read();
  40. for(int i=;i<=n;i++) L[i].h=read();
  41. T=read();
  42. sort(L+,L+n+);
  43.  
  44. memset(f,/,sizeof f);
  45. f[][]=f[][]=L[].c;
  46. for(int i=;i<=n;i++)
  47. for(int j=;j<=n+;j++)
  48. for(int k=i+;k<=n;k++)
  49. f[k][j+]=min(f[k][j+],f[i][j]+L[k].h-L[i].h+L[k].c);
  50.  
  51. for(int i=;i<=n;i++)
  52. for(int j=;j<=n+;j++)
  53. if(f[i][j]<=T) ans=max(ans,j);
  54. printf("%d\n",ans);
  55. return ;
  56.  
  57. }

 
  1. /*
  2. 考虑最后要求的数 a1,a2,..an假定从小到大
  3. 给定了b1,b2......bn 从小到大排序
  4. 性质一:a1+a2=b1
  5. 性质二:a1+a3=b2
  6. 假设a2+a3=x,可以解出a1,a2,a3,并可以在b中b1,b2,x删除。则剩下的最小的一定是a1+a4。由于a1已知,a4可解。这个过程可以反复下去。
  7. 枚举a2+a3=b里面哪个数就好
  8. */
  9. #include<cstdio>
  10. #include<cstdlib>
  11. #include<cstring>
  12. #include<algorithm>
  13.  
  14. using namespace std;
  15.  
  16. const int N=;
  17.  
  18. int n,m,res[N],ans[N][N],z[N*N],cnt;
  19.  
  20. bool use[N*N];
  21.  
  22. void check(int p)
  23. {
  24. memset(use,false,sizeof(use));
  25. if ((z[]+z[]+z[p])&) return;
  26. res[]=(z[]+z[]+z[p])/-z[p];
  27. res[]=z[]-res[];
  28. res[]=z[]-res[];
  29. use[]=use[]=use[p]=true;
  30. for (int a=,b=;a<=n;a++)
  31. {
  32. while (b<=m && use[b]) b++;
  33. if (b>m) return;
  34. res[a]=z[b]-res[];
  35. use[b]=true;
  36. for (int c=;c<a;c++)
  37. {
  38. if (res[c]>res[a]) return;
  39. int v=res[c]+res[a];
  40. int p=lower_bound(z+,z+m+,v)-z;
  41. if (z[p]!=v) return;
  42. int px=p;
  43. while (px && z[px]==z[p]) px--;
  44. px++;
  45. while (px<=m && z[px]==z[p] && use[px]) px++;
  46. if (z[px]!=z[p] || use[px]) return;
  47. p=px; use[p]=true;
  48. }
  49. }
  50. cnt++;
  51. for (int a=;a<=n;a++) ans[cnt][a]=res[a];
  52. }
  53.  
  54. int main()
  55. {
  56. freopen("city.in","r",stdin);
  57. freopen("city.out","w",stdout);
  58. scanf("%d",&n);
  59. m=n*(n-)/;
  60. for (int a=;a<=m;a++) scanf("%d",&z[a]);
  61. sort(z+,z+m+);
  62. for (int a=;a<=m;)
  63. {
  64. check(a);int b=a;
  65. while (b<=m && z[b]==z[a])b++;
  66. a=b;
  67. }
  68. printf("%d\n",cnt);
  69. for (int a=;a<=cnt;a++)
  70. for (int b=;b<=n;b++)
  71. {
  72. printf("%d",ans[a][b]);
  73. if (b==n) printf("\n");
  74. else printf(" ");
  75. }
  76. return ;
  77. }

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. #include<algorithm>
  6.  
  7. #define N 100007
  8.  
  9. using namespace std;
  10. int n,m,ans,c,p,v;
  11. int a[N];
  12. vector<int>sum[N];
  13. struct ask{
  14. int l,r,v,p;
  15. }A[N];
  16.  
  17. inline int read()
  18. {
  19. int x=,f=;char c=getchar();
  20. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  21. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  22. return x*f;
  23. }
  24.  
  25. int main()
  26. {
  27. freopen("light.in","r",stdin);
  28. freopen("light.out","w",stdout);
  29. int l,r;
  30. n=read();m=read();
  31. for(int i=;i<=n;i++) a[i]=read();
  32. if(n<=)
  33. {
  34. for(int i=;i<=m;i++)
  35. {
  36. ans=;
  37. l=read();r=read();p=read();v=read();
  38. for(int j=l;j<=r;j++) if(a[j]%p==v) ans++;
  39. printf("%d\n",ans);
  40. }
  41. }
  42. else
  43. {
  44. for(int i=;i<=m;i++)
  45. {
  46. A[i].l=read();A[i].r=read();
  47. A[i].p=read();A[i].v=read();
  48. }
  49. for(int i=;i<=n;i++) a[i]%=A[].p;
  50. for(int i=;i<=n;i++)
  51. sum[a[i]].push_back(i);
  52. for(int i=;i<=m;i++)
  53. {
  54. printf ("%d\n",upper_bound(sum[A[i].v].begin (), sum[A[i].v].end (), A[i].r)
  55. -lower_bound (sum[A[i].v].begin (), sum[A[i].v].end (), A[i].l));
  56. }
  57. }
  58. return ;
  59. }

60暴力

链表?!!wt?!
可以对p分块 。
p在[1,10^4+1]。如果枚举p预处理每个数mod p扔到vector里。O(np) TLE
可以把p在[1,100]里预处理,vector里二分即可。
p>100时,只有v+p,v+2p...v+kp能对答案造成贡献。一定有v+kp<=10^4,p>100-->k<=100。所以每次询问都最多有100个数对答案造成贡献,可以vector预处理,枚举这100个v+jp,vector里二分。
复杂度n*sqrt(n)*lgn。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int maxn = ;
  8. const int maxv = ;
  9. const int bsz = ;
  10. const int maxb = ;
  11.  
  12. int n, m;
  13. int a[maxn], vb[maxb][maxb], ve[maxb][maxb];
  14. int xb[maxn], xe[maxn];
  15. int i_buf[maxn * maxb * ], tib;
  16.  
  17. void pre() {
  18. memset(ve, , sizeof(ve));
  19. memset(xe, , sizeof(xe));
  20. for (int i = ; i <= n; ++ i)
  21. ++ xe[a[i]];
  22. for (int i = ; i <= maxv; ++ i) {
  23. xb[i] = tib;
  24. tib += xe[i];
  25. xe[i] = xb[i];
  26. }
  27. for (int i = ; i <= n; ++ i)
  28. i_buf[xe[a[i]] ++] = i;
  29. for (int m = ; m <= bsz; ++ m) {
  30. for (int i = ; i <= n; ++ i)
  31. ++ ve[m][a[i] % m];
  32. for (int i = ; i < m; ++ i) {
  33. vb[m][i] = tib;
  34. tib += ve[m][i];
  35. ve[m][i] = vb[m][i];
  36. }
  37. for (int i = ; i <= n; ++ i)
  38. i_buf[ve[m][a[i] % m] ++] = i;
  39. }
  40. }
  41.  
  42. int queryb(int l0, int r0, int p, int k) {
  43. if (vb[p][k] == ve[p][k])
  44. return ;
  45. int *x1 = lower_bound(i_buf + vb[p][k], i_buf + ve[p][k], l0);
  46. int *x2 = upper_bound(i_buf + vb[p][k], i_buf + ve[p][k], r0);
  47. return x2 - x1;
  48. }
  49.  
  50. int querys(int v, int l0, int r0) {
  51. if (xb[v] == xe[v])
  52. return ;
  53. int *x1 = lower_bound(i_buf + xb[v], i_buf + xe[v], l0);
  54. int *x2 = upper_bound(i_buf + xb[v], i_buf + xe[v], r0);
  55. return x2 - x1;
  56. }
  57.  
  58. int querya(int l0, int r0, int p, int k) {
  59. int ans = ;
  60. for (int i = k; i <= maxv; i += p)
  61. ans += querys(i, l0, r0);
  62. return ans;
  63. }
  64.  
  65. int main() {
  66. freopen("light.in", "r", stdin);
  67. freopen("light.out", "w", stdout);
  68.  
  69. scanf("%d%d", &n, &m);
  70. tib = ;
  71. for (int i = ; i <= n; ++ i)
  72. scanf("%d", a + i);
  73. pre();
  74. while (m --) {
  75. int l, r, p, k;
  76. scanf("%d%d%d%d", &l, &r, &p, &k);
  77. if (p <= bsz)
  78. printf("%d\n", queryb(l, r, p, k));
  79. else
  80. printf("%d\n", querya(l, r, p, k));
  81. }
  82. }

清北考前刷题day2早安的更多相关文章

  1. 清北考前刷题day4早安

      LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...

  2. 清北考前刷题day7早安

  3. 清北考前刷题day6早安

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  4. 清北考前刷题day5早安

    /* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long ...

  5. 清北考前刷题day2下午好

    #include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...

  6. 清北考前刷题day1早安

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  7. 清北考前刷题day1下午好

    水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...

  8. 清北考前刷题da7下午好

    三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...

  9. 清北考前刷题day6下午好

    /* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...

随机推荐

  1. ASP.net在IE6下乱码问题

    今天处理程序的时候遇到一个坑爹的问题 该死的IE6传中文参数会出现 类似于◆的乱码 不过终于解决了  也许解决的方法有很多  和大家分享下我的解决方案 我用的javascript中 传的参数 < ...

  2. POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A

     poj                         Relatives                                Time Limit: 1000MS   Memory Li ...

  3. 客户端用plsql进行中文条件查询时无结果的解决办法

    1.SELECT * FROM v$nls_parameters ; 查看NLS_CHARACTERSET 的值是多少,我的AL32UTF8- 查找客户机器的注册表,查找NLS_LANG的值,改成AL ...

  4. HDU 2147 找规律博弈

    题目大意: 从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜 到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关 开始写了一个把所有情况都计 ...

  5. SPOJ 3261 (树套树傻逼题)

    As another one of their crazy antics, the N (1 ≤ N ≤ 100,000) cows want Farmer John to race against ...

  6. 好用的window命令

    Nslookup-------IP地址侦测器 chkdsk-----Chkdsk磁盘检查 regedt32-------注册表编辑器 regedit----注册表 perfmon----计算机性能监测 ...

  7. android view自定义

    转载自:http://blog.csdn.net/iispring/article/details/50708044

  8. Ubuntu 16.04通过Magent搭建Memcached集群(转)

    一.下载Magent 官网:https://code.google.com/archive/p/memagent/downloads 离线版本:(链接: https://pan.baidu.com/s ...

  9. cocos2dx 在android平台打开文件问题

        我们有一个项目是基于cocos2dx + lua,在网络部分用到了protobuf, 在初始化protobuf的时候须要读取本地文件,用lua的io.open读取文件在windows,ios上 ...

  10. MyEclipse,Eclipse注释规范模板

    注释的作用:myeclipse中java文件头注释格式设置,最终可用于javadoc.exe生成API文档,同时提高了代码的可读性 设置方法: windows->preferences-> ...