1008:

题意:

有20W个数,每个数都在20W以内,现在有20W个询问,每次询问L,R区间内不会打架的数有多少个

定义两个数不互质 就会打架

解法:

脑洞很大的一道题,先要进行预处理,对每一个数预处理出 最大的,没有跟他不互质数(即这个数不会打架)的区间

显然可以通过找到这个数左边和右边的第一个跟他互质的数来求得此区间,那么这个怎么求呢,发现可以通过枚举当前数的质因数找到

我们先处理,每一个数左边的最后一次出现的坐标,这样每扫到一个数,都只需要对这个数及其质因数进行更新

找到了每个数的上述区间后,我们发现设某个数的上述区间为 [L,R],这个数自己的位置为pos,现在对于一个询问[a,b]

这个数是询问中的一个答案的条件就是   L<=a,b<=R 且 a<=pos<=b。现在可以离线进行更新和查询

我们可以在L 处将区间[pos,R]位置的值+1,并在pos处对该区间的值 -1,那么对于某个查询[a,b] 只需要在扫到a的时候,单点查询b的值即可

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[];
  4. int l[];
  5. int r[];
  6. int pre[];
  7. vector<int>d[];
  8. bool np[];
  9. void setprime(int maxn)
  10. {
  11. memset(np,,sizeof(np));
  12. for(int i=; i<=maxn; i++)
  13. {
  14. if(np[i]==)
  15. d[i].push_back(i);
  16. for(int j=i+i; j<=maxn; j+=i)
  17. {
  18. np[j]=;
  19. if(np[i]==)
  20. d[j].push_back(i);
  21. }
  22. }
  23. }
  24. int n,m;
  25. struct node
  26. {
  27. int type; //-1:+1 -2:-1,else &sup2;é&Ntilde;&macr;;
  28. int pos;
  29. int num;
  30. bool operator <(const node a)const
  31. {
  32. if(pos!=a.pos)
  33. return pos<a.pos;
  34. else
  35. {
  36. return type<a.type;
  37. }
  38. }
  39. };
  40. int ans[];
  41. vector<node>q;
  42. int t[];
  43. int lowbit(int x)
  44. {
  45. return x&(-x);
  46. }
  47.  
  48. int getSum(int x)
  49. {
  50. int sum = ;
  51. while(x)
  52. {
  53. sum += t[x];
  54. x -= lowbit(x);
  55. }
  56. return sum;
  57. }
  58.  
  59. void add(int x , int val)
  60. {
  61. while(x <=)
  62. {
  63. t[x] += val;
  64. x += lowbit(x);
  65. }
  66. }
  67. void init()
  68. {
  69. memset(t,,sizeof(t));
  70. q.clear();
  71. memset(l,,sizeof(l));
  72. for(int i=; i<=n; i++)
  73. {
  74. r[i]=n+;
  75. }
  76. }
  77. int main()
  78. {
  79. //freopen("in.txt","r",stdin);
  80. setprime();
  81. while(scanf("%d%d",&n,&m),n+m)
  82. {
  83. init();
  84. for(int i=; i<=n; i++)
  85. {
  86. scanf("%d",a+i);
  87. }
  88. memset(pre,,sizeof(pre));
  89. for(int i=; i<=n; i++)
  90. {
  91. for(int j=; j<(int)d[a[i]].size(); j++)
  92. {
  93. int now=d[a[i]][j];
  94. l[i]=max(pre[now],l[i]);
  95. pre[now]=i;
  96. }
  97. l[i]++;
  98. }
  99. memset(pre,0x3f,sizeof(pre));
  100. for(int i=n; i>; i--)
  101. {
  102. for(int j=; j<(int)d[a[i]].size(); j++)
  103. {
  104. int now=d[a[i]][j];
  105. r[i]=min(pre[now],r[i]);
  106. pre[now]=i;
  107. }
  108. r[i]--;
  109. q.push_back(node {-,l[i],i});
  110. q.push_back(node {m,i,i});
  111. }
  112. for(int i=; i<m; i++)
  113. {
  114. int u,v;
  115. scanf("%d%d",&u,&v);
  116. q.push_back(node {i,u,v});
  117. }
  118. //printf("%d\n",q.size());
  119. sort(q.begin(),q.end());
  120. for(int i=; i<(int)q.size(); i++)
  121. {
  122. node now=q[i];
  123. if(now.type==-)
  124. {
  125. add(now.num,);
  126. add(r[now.num]+,-);
  127. }
  128. if(now.type==m)
  129. {
  130. add(now.num,-);
  131. add(r[now.num]+,);
  132. }
  133. if(now.type>=&&now.type<m)
  134. {
  135. ans[now.type]=getSum(now.num);
  136. }
  137. }
  138. for(int i=; i<m; i++)
  139. {
  140. printf("%d\n",ans[i]);
  141. }
  142. }
  143. return ;
  144. }

1009:

题意:

有g种不同颜色的小球,b个袋子,每个袋子里面有若干个每种小球

两人轮流取袋子,当袋子里面的同色小球有s个时,会合并成一个魔法球,并被此次取袋子的人获得

成功获得魔法球的人可以再次取

求二者都进行最优策略之后两人所得魔法球个数差

解法:

数据不大,考虑搜索,发现不行,于是可以记忆化搜索,转移不难想到

代码:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<string>
  6. #include<ctype.h>
  7. using namespace std;
  8. #define MAXN 10000
  9. typedef struct Node
  10. {
  11. int a,b;
  12. }node;
  13. node dp[];
  14. bool vi[];
  15. int num[][];
  16. int p[];
  17. int g,b,s,k,m,x;
  18. void dfs(int state,int turn)
  19. {
  20. if(state==(<<b)-)
  21. {
  22. dp[state].a=;
  23. dp[state].b=;
  24. return ;
  25. }
  26. if(vi[state])
  27. {
  28. return ;
  29. }
  30. int ok;
  31. node t;
  32. node ans;
  33. ans.a=-;
  34. ans.b=;
  35. int pp[];
  36. memcpy(pp,p,sizeof(pp));
  37. for(int i=;i<b;i++)
  38. {
  39. t.a=;
  40. t.b=;
  41. ok=;
  42. if(state&(<<i))
  43. continue;
  44. int st=state|(<<i); //状态
  45. for(int j=;j<g;j++)
  46. {
  47. p[j]+=num[i][j];
  48. ok+=p[j]/s;
  49. p[j]%=s;
  50. }
  51. int tur=ok?turn:!turn;//是否交换选手
  52. dfs(st,tur);
  53. memcpy(p,pp,sizeof(pp));
  54. t.a+=ok;
  55. if(tur==turn) //子状态的先手所要转移到的状态相同
  56. {
  57. t.a+=dp[st].a;
  58. t.b+=dp[st].b;
  59. }
  60. else //选手交换了
  61. {
  62. t.b+=dp[st].a;
  63. t.a+=dp[st].b;
  64. }
  65. if(t.a-t.b>ans.a-ans.b)
  66. {
  67. ans=t;
  68. }
  69. }
  70. vi[state]=;
  71. dp[state]=ans;
  72. return ;
  73. }
  74. int main()
  75. {
  76. while(scanf("%d%d%d",&g,&b,&s),g+b+s)
  77. {
  78. memset(num,,sizeof(num));
  79. for(int i=;i<b;i++)
  80. {
  81. scanf("%d",&k);
  82. while(k--)
  83. {
  84. scanf("%d",&x);
  85. num[i][x-]++;
  86. }
  87. }
  88. memset(p,,sizeof(p));
  89. memset(vi,,sizeof(vi));
  90. dfs(,);
  91. printf("%d\n",dp[].a-dp[].b);
  92. }
  93. return ;
  94. }

【2013杭州区域赛】部分题解 hdu4770—4780的更多相关文章

  1. HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  2. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 【2013南京区域赛】部分题解 hdu4802—4812

    上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...

  7. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  8. 【2013长沙区域赛】部分题解 hdu4791—4801

    1001: 签到题,二分一下即可 代码: #include <set> #include <map> #include <cmath> #include <c ...

  9. 2013 ACM区域赛长沙 C Collision HDU 4793

    题意:在平面上0,0点,有一个半径为R的圆形区域,并且在0,0点固定着一个半径为RM(<R)的圆形障碍物,现在圆形区域外x,y,有一个半径 为r的,并且速度为vx,vy的硬币,如果硬币碰到了障碍 ...

随机推荐

  1. [转] restrict关键字用法

    PS: 在函数中,指针参数指定了restrict,表示这个指针指向的这段区域只能通过这个指针修改 c99中新增加了一个类型定义,就是restrict. 看了下网上的相关贴子,但还是问题解决的不够.下面 ...

  2. 浅谈Android架构之MVP,MVVM

    概述 MVP(Model-View-Presenter)是传统MVC(Model-View-Controller)在Android开发上的一种变种.进化模式.主要用来隔离UI.UI逻辑和业务逻辑.数据 ...

  3. Have trouble in your life

    当你烦恼的时候不知道如何是好时,你可以下载此程序,可以帮助你化解烦恼! 下载地址: http://pan.baidu.com/s/1i3FtxHF

  4. C#—委托分析

    1.简单委托示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; names ...

  5. html.day01

    1.web标准: 1. 结构  (xhtml)  2. 表现(css)  3.行为(js) html   超文本标记语言 xhtml  (严格型超文本标记语言) 2.规范: 1. 所有标签(标记)都要 ...

  6. 学习JAVA第一部分总结

    把自己这几天的学习情况记录下来. 第一章,认识JAVA,了解JAVA的运行机制,虚拟机. 第二章,了解java的注释,标识符,关键字.. 第三章,基本的数据类型,byte short int long ...

  7. IDisposable 接口2

    定义一种释放分配的资源的方法. 命名空间:  System程序集:  mscorlib(在 mscorlib.dll 中) 语法 C# C++ F# VB [ComVisibleAttribute(t ...

  8. Sql Server 远程过程调用失败

    很多搞开发的同志们,相信在刚刚使用sql server2008+c#2012(2012以上版本)会出现下面图片中的问题,这时因为安装Visual Studio 2013或者2012版本的时候,会自动安 ...

  9. 安卓 报错 Check the Eclipse log for stack trace.

    移除Android Dependencies就行了. 在properties的Libraries里

  10. hibernate_validator_05

    校验约束 一,认识Validator---Validation中最主要的接口 1.怎么获取一个Validator--Validation.buildDefaultValidatorFactory() ...