[关闭]
@dxbdly 2020-12-20T06:59:38.000000Z 字数 2891 阅读 248

C2020 2020.11.1模拟赛

信息学——模拟赛


比赛情况

期望得分VS实际得分

期望得分:

T1 T2 T3 总分
100 100 100 300

实际得分:

T1 T2 T3 总分
100 20 100 220

T1 haybales

分析

考虑对于一组询问,我们考虑将给出的左右端点对应到数组上,将两个下标相减。

将数组排序,二分出第一个小于(类似前缀和,所以要求下小于),二分出第一个小于等于

即为答案。

  1. //The code is from dawn_sdy
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0;
  7. char c=getchar();
  8. bool f=0;
  9. while (!isdigit(c))
  10. f|=(c=='-'),c=getchar();
  11. while (isdigit(c))
  12. x=(x<<3)+(x<<1)+(c^48),c=getchar();
  13. return f?-x:x;
  14. }
  15. int n,q;
  16. int a[100005];
  17. inline int find_l(int x)
  18. {
  19. int l=0,r=n+1;
  20. while (l+1<r)
  21. {
  22. int mid=(l+r)>>1;
  23. if (x>=a[mid])
  24. l=mid;
  25. else
  26. r=mid;
  27. }
  28. return l;
  29. }
  30. inline int find_r(int x)
  31. {
  32. int l=0,r=n+1;
  33. while (l+1<r)
  34. {
  35. int mid=(l+r)>>1;
  36. if (x<a[mid])
  37. r=mid;
  38. else
  39. l=mid;
  40. }
  41. return l;
  42. }
  43. int main(){
  44. n=read(),q=read();
  45. for (register int i=1;i<=n;++i)
  46. a[i]=read();
  47. sort(a+1,a+n+1);
  48. for (register int i=1;i<=q;++i)
  49. {
  50. int l=read(),r=read(),lnum=find_l(l),rnum=find_r(r);
  51. if (a[lnum]==l)
  52. lnum--;
  53. printf("%d\n",rnum-lnum);
  54. }
  55. return 0;
  56. }

反思与总结

开始被某搞了心态,闭着眼睛码了个离散化+树状数组,然后发现排序二分就行了,裂开。

T2 states

分析

因为只考虑前两位,考虑将城市名也只取前两位,开一个,记录对应的数量,每次

这里第一个坑点,不能用,可能有多个城市的前两位相同但名字不同。

然后当前贡献就是反过来,即

这里第二个坑点:如果城市的前两位和名字的前两位相同则不能算进答案中(如,会统计多)。

所以如果当前,就把就好。

  1. //The code is from dawn_sdy
  2. #include<bits/stdc++.h>
  3. #define mp make_pair
  4. using namespace std;
  5. inline int read()
  6. {
  7. int x=0;
  8. char c=getchar();
  9. bool f=0;
  10. while (!isdigit(c))
  11. f|=(c=='-'),c=getchar();
  12. while (isdigit(c))
  13. x=(x<<3)+(x<<1)+(c^48),c=getchar();
  14. return f?-x:x;
  15. }
  16. int n;
  17. int name,shen,ans;
  18. map <pair <int,int>,int> mapp;
  19. int main(){
  20. n=read();
  21. string cnt;
  22. for (register int i=1;i<=n;++i)
  23. {
  24. cin>>cnt;
  25. name=(cnt[0]-'A'+1)*26+(cnt[1]-'A'+1);
  26. cin>>cnt;
  27. shen=(cnt[0]-'A'+1)*26+(cnt[1]-'A'+1);
  28. ans+=mapp[mp(shen,name)];
  29. if (name==shen)
  30. ans-=mapp[mp(name,shen)];
  31. mapp[mp(name,shen)]++;
  32. }
  33. printf("%d",ans);
  34. return 0;
  35. }

反思与总结

题面翻译有那么亿点点问题,不过好像还是有人切了???

T3 moocast

分析

考虑对每两个点都连一条边,边权为这两点的距离。

对于每个点跑,算出能到达的点数,取即可。

  1. //The code is from dawn_sdy
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0;
  7. char c=getchar();
  8. bool f=0;
  9. while (!isdigit(c))
  10. f|=(c=='-'),c=getchar();
  11. while (isdigit(c))
  12. x=(x<<3)+(x<<1)+(c^48),c=getchar();
  13. return f?-x:x;
  14. }
  15. int n;
  16. struct Point{
  17. double x,y,p;
  18. }point[205];
  19. struct node{
  20. int v,nex;
  21. double w;
  22. }edge[80005];
  23. int head[205],len;
  24. int vst[205],tot,ans;
  25. inline void make_map(int u,int v,double w)
  26. {
  27. len++;
  28. edge[len].nex=head[u];
  29. edge[len].v=v;
  30. edge[len].w=w;
  31. head[u]=len;
  32. }
  33. inline double calc(Point x,Point y)
  34. {
  35. return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
  36. }
  37. inline void search(int x)
  38. {
  39. vst[x]=1,tot++;
  40. for (register int i=head[x];i;i=edge[i].nex)
  41. {
  42. int y=edge[i].v;
  43. double z=edge[i].w;
  44. if (vst[y])
  45. continue;
  46. if (z>point[x].p)
  47. continue;
  48. search(y);
  49. }
  50. }
  51. int main(){
  52. n=read();
  53. for (register int i=1;i<=n;++i)
  54. scanf("%lf%lf%lf",&point[i].x,&point[i].y,&point[i].p);
  55. for (register int i=1;i<=n;++i)
  56. for (register int j=1;j<=n;++j)
  57. make_map(i,j,calc(point[i],point[j]));
  58. for (register int i=1;i<=n;++i)
  59. {
  60. memset(vst,0,sizeof(vst)),tot=0;
  61. search(i),ans=max(ans,tot);
  62. }
  63. printf("%d",ans);
  64. return 0;
  65. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注