http://acm.hdu.edu.cn/showproblem.php?pid=4455

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4384

题目大意就不多说了,官方的解法是dp,没太理解,自己想了一个直接点的方法,O(n)。

既然要计算所有贡献和,对于区间长度为k,假设集合中的元素全都相同,那么这个元素将会贡献给所有长度为k 的子区间。而事实上,所有元素不可能相同,因此就不可能贡献给所有长度为k 的子区间,那么思考,那些子区间是无法贡献的。假设集合中有序列 1......1,如果两个1的间隔为s,那么对于(k<s)的情况,总共有s-k+1个区间是没法贡献的。

而且,只要是任意的k<s,总存在区间是没法贡献的。对于一个k,

s1-k

s2-k
。。。
sum-k*cnt,记录s 的和,记录s>k的个数,就可以求出没法贡献的次数。再用总数减去就行了。有点抽象,能理解的理解理解。
  1. #include<algorithm>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<cmath>
  8. #include<string>
  9. #include<vector>
  10. #include<queue>
  11. #include<stack>
  12. #include<set>
  13. #include<map>
  14. #include<ctime>
  15.  
  16. using namespace std;
  17. #define FOR(i,a,b) for(int i=a;i<b;i++)
  18. #define FORD(i,a,b) for(int i=a;i>b;i--)
  19. #define MST(a,num) memset(a,num,sizeof(a))
  20. #define MCP(d,s) memcpy(d,s,sizeof(s))
  21. #define WH(n) while(scanf("%d", &n) != EOF)
  22. #define WHZ(n) while(scanf("%d", &n) != EOF && n != 0)
  23. #define SCF(a) scanf("%d",&a)
  24. #define PRF(a) printf("%d",a)
  25. #define PRS(a) printf("%s",a)
  26. #define PRFF(a) printf("%d\n",a)
  27. #define PRSF(a) printf("%s\n",a)
  28. #define PRFFU(a) printf("%I64d\n",a)
  29.  
  30. #define PI acos(-1)
  31. #define max3(a,b,c) max(max(a,b),c)
  32. #define max4(a,b,c,d) max(max(a,b),max(c,d))
  33.  
  34. #define FORE(e,x) for(__typeof(x.begin()) e=x.begin(); e!=x.end(); e++) //foreach(it, ans ) cout<<*it<<" ";
  35. #define all(a) (a).begin(),(a).end() //sort(all(v));
  36. #define len(a) ((int)(a).size())
  37. #define pb push_back
  38. #define mk make_pair
  39. #define V(etype) vector<etype>
  40.  
  41. typedef __int64 Uint;
  42. typedef vector<int> Vint;
  43. typedef pair<int,int>mypair;
  44.  
  45. #define INF 0x3f3f3f3f
  46. #define eps 1e-9
  47. #define N 1000000+10
  48. int q[N];
  49. int head[N];
  50. int rt[N];
  51. int cnt[N];
  52. int num[N];
  53. Uint sum[N];
  54. int main()
  55. {
  56. int n,a,m;
  57.  
  58. // freopen("data.in","r",stdin);
  59. // freopen("data2.out","w",stdout);
  60. while((cin>>n)&&n){
  61. MST(cnt,0);
  62. MST(sum,0);
  63. MST(rt,-1);
  64. MST(head,-1);
  65. q[0]=0;
  66. FOR(i,0,n){
  67. SCF(num[i]);
  68. if(head[num[i]]==-1)q[++q[0]]=num[i];
  69. rt[i]=head[num[i]];
  70. head[num[i]]=i;
  71. }
  72. FOR(i,1,q[0]+1){
  73. rt[n]=head[q[i]];
  74. for(int j=n;j!=-1;j=rt[j]){
  75. cnt[j-rt[j]]--;
  76. sum[j-rt[j]]-=j-rt[j];
  77. cnt[0]++;
  78. sum[0]+=j-rt[j];
  79. }
  80. }
  81. FOR(i,1,n){
  82. sum[i]+=sum[i-1],cnt[i]+=cnt[i-1];
  83. //ret[i]=(n-i+1)*q[0]-(sum[i]-num[i]*cnt[i]);
  84. }
  85. Uint s1,s2;
  86. SCF(m);
  87. while(m--){
  88. SCF(a);
  89. if(!a)PRSF("0\n");
  90. else{
  91. s1=(n-a+1);
  92. s1*=q[0];
  93. s2=a;
  94. s2*=cnt[a];
  95. s2=sum[a]-s2;
  96. PRFFU(s1-s2);
  97. }
  98. }
  99.  
  100. }
  101. return 0;
  102. }
  103. /*
  104. 7
  105. 1 1 2 3 4 4 5
  106. 3
  107. 1 2 3
  108. 7
  109. 1 1 2 3 4 4 5
  110. 4
  111. 1 2 3 0
  112.  
  113. */

Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)的更多相关文章

  1. hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

    题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样 ...

  2. hdu 4438 第37届ACM/ICPC 天津赛区现场赛H题

    题意:Alice和Bob两个人去打猎,有两种(只)猎物老虎和狼: 杀死老虎得分x,狼得分y: 如果两个人都选择同样的猎物,则Alice得分的概率是p,则Bob得分的概率是(1-p): 但是Alice事 ...

  3. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)

    题意:给出一棵树,找出一个点,求出所有点到这个点的权值和最大,权值为路径上所有边权的最小值. 用神奇的并查集,把路按照权值从大到小排序,然后用类似Kruskal的方法不断的加入边. 对于要加入的一条路 ...

  4. hdu 4461 第37届ACM/ICPC杭州赛区I题

    题意:给两个人一些棋子,每个棋子有其对应的power,若b没有或者c没有,或者二者都没有,那么他的total power就会减1,total power最少是1,求最后谁能赢 如果b或c出现的话,fl ...

  5. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  6. hdu 4462 第37届ACM/ICPC 杭州赛区 J题

    题意:有一块n*n的田,田上有一些点可以放置稻草人,再给出一些稻草人,每个稻草人有其覆盖的距离ri,距离为曼哈顿距离,求要覆盖到所有的格子最少需要放置几个稻草人 由于稻草人数量很少,所以状态压缩枚举, ...

  7. hdu 4463 第37届ACM/ICPC杭州赛区K题 最小生成树

    题意:给坐标系上的一些点,其中有两个点已经连了一条边,求最小生成树的值 将已连接的两点权值置为0,这样一定能加入最小生成树里 最后的结果加上这两点的距离即为所求 #include<cstdio& ...

  8. 2014 ACM/ICPC 鞍山赛区现场赛 D&amp;I 解题报告

    鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...

  9. zoj 3662 第37届ACM/ICPC长春赛区H题(DP)

    题目:给出K个数,使得这K个数的和为N,LCM为M,问有多少种 f[i][j][k]表示选i个数,总和为j,最小公倍数为k memery卡的比较紧,注意不要开太大,按照题目数据开 这种类型的dp也是第 ...

随机推荐

  1. 17.1.1.5 Creating a Data Snapshot Using mysqldump 创建一个快照使用mysqldump:

    17.1.1.5 Creating a Data Snapshot Using mysqldump 创建一个快照使用mysqldump: 创建一个数据快照的方式是使用mysqldump 工具来备份所有 ...

  2. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  3. stm32之CAN总线基础

    can总线协议概述: CAN是Controller Area Network的缩写,由德国博世公司开发:CAN通过ISO11891以及ISO11519进行了标准化:     CAN总线的特点: 1.多 ...

  4. DP HDIJ1421 搬宿舍

    Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...

  5. 10-UIKit(UIDatePicker、UIPickerView、UIWebView、Storyboard)

    目录: 1. UIDatePicker 2. UIPickerView 3. UIPickerView多列关联 4. UIWebView 5. Storyboard(故事板) 回到顶部 1. UIDa ...

  6. Android应用开发:CardView的使用及兼容

    引言 在Google I/O 2014上,Google公布了Android L Preview版本,此版本的UI有了非常大的改变,很炫很给力!同时,Google也给出了两个可以向下兼容的控件放到了V7 ...

  7. Android项目实战手机安全卫士(02)

    目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01.  SplashActivity.java package com.coderdream.mobilesafe.acti ...

  8. Gora_百度百科

    Gora_百度百科     Gora    编辑    目录         1什么是Apache Gora         2为什么要使用Apache Gora         3Gora的一个源代 ...

  9. cocos2d-x on wp8架构简单介绍

    1,基于C++的开发架构 支持3大移动平台以及3大桌面平台. 分为图形,声音,物理3大模块,另外还有脚本的导出. 在wp8/win32上的图形是基于d3d的,而在其它平台是基于opengl/openg ...

  10. MongoDB(二)——安装配置了解

    前边介绍了MongoDB的大概理论知识,这篇来对MongoDB进行一下安装使用,支持安装在windows和linux上,当然了很多其它情况下我们是安装在linux上,由于毕竟server用linux的 ...