\(T1\)递归

给出 \(Thue-Morse\) 序列的定义三

每次 \(0\rightarrow 01\),\(1\rightarrow 10\)

\(0\rightarrow 01 \rightarrow 0110 \rightarrow 01101001\rightarrow...\)

我们现在已知串 \(010010\) 考虑将其划分

\(0\ 10\ 01\ 0\) 或者 \(01\ 00 \ 10\)

显然第二个是不合法的。

我们把第一个补全,为 \(10\ 10\ 01\ 01\)

然后合并一下为 \(1100\) ,我们假设 \(1100\) 出现的位置是 \(i\) 我们 \(010010\) 出现的位置为 \(2i+1\)

然后我们得到递推式 \(f(l,r)=f(\lfloor l/2\rfloor,\lfloor r/2\rfloor)+(l\mod 2)\)

我们只需要暴力求小数据即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int f[3][8]={{0,1},{5,2,0,1},{0,4,3,1,5,2}};
  4. long long slo(long long l,long long r)
  5. {
  6. if(r-l+1>=4) return 2*slo(l/2,r/2)+(l&1);
  7. long long S=0;
  8. for(long long i=l;i<=r;i++)
  9. {
  10. S|=(__builtin_popcountll(i)&1)<<(i-l);
  11. }
  12. return f[r-l][S];
  13. }
  14. int main()
  15. {
  16. int q;
  17. scanf("%d",&q);
  18. while(q--)
  19. {
  20. long long l,r;
  21. scanf("%lld%lld",&l,&r);
  22. cout<<slo(l,r)<<"\n";
  23. }
  24. }

$T2\ $加边

按照原图跑以 \(1\) 为根的 \(bfs\) 树

\(b>2\times a\)答案是 \(dep\times a\)

否则对于 \(b\) 边进行 \(bfs\) ,类似三元环进行删边,复杂度可以保证在 \(O(m\sqrt m)\)

  1. #define Eternal_Battle ZXK
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define MAXN 200005
  5. using namespace std;
  6. #define FastIO
  7. #ifdef FastIO
  8. char buf[1<<21],*p1,*p2;
  9. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  10. #endif
  11. template<class T>
  12. T Read()
  13. {
  14. T x=0,f=1;
  15. char ch=getchar();
  16. while(ch<'0'||ch>'9')
  17. {
  18. if(ch=='-')
  19. f=-1;
  20. ch=getchar();
  21. }
  22. while(ch>='0'&&ch<='9')
  23. {
  24. x=(x<<1)+(x<<3)+(ch^'0');
  25. ch=getchar();
  26. }
  27. return x*f;
  28. }
  29. int (*read)()=Read<int>;
  30. #define read Read<int>
  31. vector<int>rd[MAXN],gd[MAXN];
  32. int dis[MAXN],dep[MAXN],n,m,a,b;
  33. void add(int u,int v)
  34. {
  35. rd[u].push_back(v);
  36. gd[u].push_back(v);
  37. }
  38. void bfs()
  39. {
  40. queue<int>q;
  41. memset(dep,-1,sizeof(dep));
  42. q.push(1);
  43. dep[1]=0;
  44. while(q.size())
  45. {
  46. int now=q.front();
  47. q.pop();
  48. for(int i=0;i<rd[now].size();i++)
  49. {
  50. int y=rd[now][i];
  51. if(dep[y]!=-1) continue;
  52. q.push(y); dep[y]=dep[now]+1;
  53. }
  54. }
  55. }
  56. bitset<MAXN>Min;
  57. void bfs_dis()
  58. {
  59. queue<int>q;
  60. memset(dis,-1,sizeof(dis));
  61. q.push(1);
  62. dis[1]=0;
  63. while(q.size())
  64. {
  65. int now=q.front();
  66. q.pop();
  67. // Min.reset();
  68. for(vector<int>::iterator it=rd[now].begin();it!=rd[now].end();)
  69. {
  70. int y=*it;
  71. Min[y]=1;
  72. it++;
  73. }
  74. for(vector<int>::iterator it=rd[now].begin();it!=rd[now].end();)
  75. {
  76. int y=*it;
  77. if(dis[y]!=-1) it=rd[now].erase(it);
  78. else it++;
  79. for(vector<int>::iterator it1=gd[y].begin();it1!=gd[y].end();)
  80. {
  81. int ty=*it1;
  82. if(dis[ty]!=-1)
  83. {
  84. it1=gd[y].erase(it1);
  85. }
  86. else
  87. {
  88. it1++;
  89. if(Min[ty]) continue;
  90. dis[ty]=dis[now]+b;
  91. q.push(ty);
  92. }
  93. }
  94. }
  95. for(int i=0;i<rd[now].size();i++)
  96. {
  97. int y=rd[now][i];
  98. Min[y]=0;
  99. }
  100. }
  101. }
  102. signed main()
  103. {
  104. scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
  105. for(int i=1,u,v;i<=m;i++)
  106. {
  107. u=read();v=read();
  108. add(u,v); add(v,u);
  109. }
  110. bfs();
  111. if(b>=2*a)
  112. {
  113. for(int i=2;i<=n;i++)
  114. {
  115. cout<<dep[i]*a<<"\n";
  116. }
  117. }
  118. else
  119. {
  120. bfs_dis();
  121. for(int i=2;i<=n;i++)
  122. {
  123. if(dep[i]%2==0)
  124. {
  125. cout<<(dep[i]/2)*b<<"\n";
  126. }
  127. else
  128. {
  129. if(dis[i]==-1) cout<<dep[i]/2*b+a<<"\n";
  130. else cout<<min(dep[i]/2*b+a,dis[i])<<"\n";
  131. }
  132. }
  133. }
  134. }

$T3\ $虐场

考虑枚举 \(k\),考虑已知 \(k\) 之后应该怎么求解

设 \(c_i=b_{j+1}-b_{j}-k\)表示空场的和

我们先选定连续 \(n\) 场,向左右移动,可以导致 \(b\) 整体加减 \(1\),\(c\) 不变

首先最大化收益,先考虑选最右侧 \(n\times k\) 场,然后往左移动

设 \(d_i=b_i-a_i\) 我们要 $d_i\leq 0 $,并且 \(\sum |b_i|\) 尽可能小

每次贪心的话,就把目前后缀最大值位置向左平移,最后每个位置移动的位置是后缀的最大值

设后缀最大值 \(suf_i\),答案是 \(\sum (suf_i-b_i)\)

至于移动限制考虑我们只能进行 \(m-k\times n\) 次前缀减,后面的只能进行整体减就好了

发现答案是关于 \(k\) 的凸函数,可以三分找极值点

  1. #define Eternal_Battle ZXK
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define MAXN 200010
  5. using namespace std;
  6. int n,m,k,lim,a[MAXN],b[MAXN];
  7. int check(int x)
  8. {
  9. long long nw=0;
  10. for(int i=1;i<=n;i++)
  11. {
  12. b[i]=m*x-x*(x+1)/2*n+i*x-a[i];
  13. nw=max(nw,b[i]);
  14. }
  15. long long an=0,sum=max(nw-m+x*n,0ll);
  16. for(int i=n;i>=1;i--)
  17. {
  18. sum=max(sum,b[i]);
  19. an+=sum-b[i];
  20. }
  21. return an;
  22. }
  23. signed main()
  24. {
  25. scanf("%lld%lld",&n,&m);
  26. k=lim=m/n;
  27. for(int i=1;i<=n;i++)
  28. {
  29. scanf("%lld",&a[i]);
  30. int l=1,r=m/n;
  31. while(l<=r)
  32. {
  33. long long mid=(l+r)>>1;
  34. if(mid*(mid-1)/2*n+i*mid<=a[i]) l=mid+1;
  35. else r=mid-1;
  36. }
  37. lim=min(lim,r);
  38. l=1,r=lim;
  39. while(l<=r)
  40. {
  41. long long mid=(l+r)>>1;
  42. if(m*mid-mid*(mid+1)/2*n+i*mid-a[i]-m+mid*n<=0) l=mid+1;
  43. else r=mid-1;
  44. }
  45. k=min(l,k);
  46. }
  47. int ans=check(min(lim,k));
  48. int l=0,r=k-1;
  49. while(r-l>10)
  50. {
  51. int mid=(l+r)>>1;
  52. long long an1=check(mid),an2=check(mid+1);
  53. if(an1<an2) r=mid-1;
  54. else l=mid+2;
  55. }
  56. for(int i=l;i<=r;i++)
  57. {
  58. ans=min(ans,check(i));
  59. }
  60. ans=-ans;
  61. for(int i=1;i<=n;i++)
  62. {
  63. ans+=a[i];
  64. }
  65. cout<<ans<<endl;
  66. }

6.22 NOI 模拟的更多相关文章

  1. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  2. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  3. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  4. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  5. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  6. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  9. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

随机推荐

  1. Java 15 新特性:隐藏类

    什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类.引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们.可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! ...

  2. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...

  3. Calico网络插件

    以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...

  4. C# 与LINQ有关的语言特性

    1.隐式类型 我们知道强类型语言 C  C++ C#  Java 对变量的定义前必须要确定这个变量是什么类型的   例如  string str="abc";    int num ...

  5. cuda在ubuntu的安装使用分享

    前言 之前给大家分享过opencv在jetson nano 2gb和ubuntu设备中使用并且展示了一些人脸识别等的小demo.但是对于图像处理,使用gpu加速是很常见 .(以下概念介绍内容来自百科和 ...

  6. 看看CabloyJS是如何实现编辑页面脏标记的

    应用场景 我们在使用Word.Excel时,当修改了内容之后在标题栏会显示脏标记,从而可以明确的告知用户内容有变动.此外,如果在没有保存的情况下关闭窗口,系统会弹出提示框,让用户选择是否放弃修改 那么 ...

  7. ubuntu使用postfix和AWS-SES发送邮件

    在日常开发中,邮件发送是个比较常见的场景.因此出现了很多相关的软件和服务,各大云厂商也推出自己的邮件服务.今天笔者就像大家介绍一种常见的组合,AWS的邮件服务 SES 与邮件服务器 postfix 的 ...

  8. 字符串的操作、 Math类

    字符串的操作 我们先来定义一个字符串,如果来进行过去长度,获取内容. 我们来写一个小测试! public static void main(String[] args) { String aa = & ...

  9. 在Rally上,上传测试报告(文件)到每个Test Case方法

    本文链接: https://www.cnblogs.com/hchengmx/p/how-to-upload-test-result-to-test-case-result-in-rally.html ...

  10. 搭建个人博客,Docsify+Github webhook+JGit解决方案

    一开始博客使用的 Halo,发现问题比较多啊,时不时的莫名其妙主题各种报错,有时候还要升级,麻烦的要死,于是就想弄简单点. 这两天抽空反复倒腾了一遍,不小心还把镜像给尼玛删了,发的文章都没了,痛定思痛 ...