洛谷NOIp热身赛题解


A 最大差值

简单树状数组,维护区间和、区间平方和,方差按照给的公式算就行了

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. #define mod 1000000007
  5. typedef long long ll;
  6. namespace IO{
  7. const int maxn=(1<<21)+1;
  8. char ibuf[maxn],*iS,*iT,c;int f;
  9. inline char getc(){
  10. return iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,maxn,stdin),iS==iT?EOF:*iS++):*iS++;
  11. }
  12. inline int gi(){
  13. int x=0;
  14. for(f=1,c=getc();(c<'0'||c>'9');c=getc())f=c=='-'?-1:1;
  15. for(x=0;(c>='0'&&c<='9');c=getc())x=(x<<1)+(x<<3)+(c^48);
  16. return x*f;
  17. }
  18. }
  19. using IO::gi;
  20. int b[100010];
  21. int inv[100010];
  22. int sum[100010<<4],SUM[100010<<4],N;
  23. #define mid ((l+r)>>1)
  24. il vd build(int n){
  25. N=1<<(int)ceil(log(n+2)/log(2));
  26. for(int i=1;i<=n;++i)sum[i+N]=b[i],SUM[i+N]=1ll*b[i]*b[i]%mod;
  27. for(int i=N-1;i;--i)sum[i]=(sum[i<<1]+sum[i<<1|1])%mod,SUM[i]=(SUM[i<<1]+SUM[i<<1|1])%mod;
  28. }
  29. il vd update(int p,int d){
  30. p+=N,sum[p]=d,SUM[p]=1ll*d*d%mod;
  31. for(p>>=1;p;p>>=1)sum[p]=(sum[p<<1]+sum[p<<1|1])%mod,SUM[p]=(SUM[p<<1]+SUM[p<<1|1])%mod;
  32. }
  33. il std::pair<int,int> query(int l,int r){
  34. --l,++r;l+=N,r+=N;
  35. int ret=0,RET=0;
  36. while(l^r^1){
  37. if(~l&1)ret=(sum[l^1]+ret)%mod,RET=(SUM[l^1]+RET)%mod;
  38. if(r&1)ret=(sum[r^1]+ret)%mod,RET=(SUM[r^1]+RET)%mod;
  39. l>>=1;r>>=1;
  40. }
  41. return std::make_pair(ret,RET);
  42. }
  43. int main(){
  44. int n=gi(),m=gi();
  45. inv[1]=1;for(int i=2;i<=n;++i)inv[i]=mod-1ll*(mod/i)*inv[mod%i]%mod;
  46. for(int i=1;i<=n;++i)b[i]=gi();
  47. build(n);
  48. int o,l,r;
  49. while(m--){
  50. o=gi();
  51. if(o==1)l=gi(),r=gi(),update(l,r);
  52. else{
  53. l=gi(),r=gi();
  54. std::pair<int,int>A=query(l,r);
  55. int sa=A.first,SA=A.second;
  56. int pa=1ll*sa*inv[r-l+1]%mod;
  57. printf("%lld\n",1ll*inv[r-l+1]*(1ll*pa*pa%mod*(r-l+1)%mod+SA-1ll*2*sa*pa%mod+mod)%mod);
  58. }
  59. }
  60. return 0;
  61. }

B 攀爬者

C 蜈蚣

简单dp,设f[i][j]为1-j分成i段的最大收益,f[i][j]=max(f[i-1][k]+(A[k+1] xor ... xor A[j]))

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(!isdigit(ch)){
  9. if(ch=='-')f=-1;
  10. ch=getchar();
  11. }
  12. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. int f[2][1010],W[1010];
  16. il vd chkmx(int&a,int b){if(b>a)a=b;}
  17. int main(){
  18. int n=gi(),m=gi();
  19. register int x=0,i,j,k;
  20. for(i=1;i<=n;++i)W[i]=gi()^W[i-1];
  21. memset(f[x]+1,-127,n<<2);
  22. for(i=1;i<=m;++i){
  23. x^=1;
  24. memset(f[x],-127,i<<2);
  25. for(j=i;j<=n;++j){
  26. f[x][j]=0;
  27. for(k=i-1;k<=j;++k)
  28. chkmx(f[x][j],f[x^1][k-1]+(W[j]^W[k-1]));
  29. }
  30. }
  31. printf("%d\n",f[x][n]);
  32. return 0;
  33. }

D 漂浮的鸭子

同消息传递,略

E 最大差值

F 随机数生成器

70分可以dp,设\(f[i]\)表示\(i\)到\(1\)的期望,那么\(f[1]=0,f[i]=1+\frac{\sum_{j=1}^{i}f[j]}{i}(i>1)\)

\(\frac{i-1}{i}f[i]=1+\frac{\sum_{j=1}^{i-1}f[j]}{i}\)

然后100分可以发现\(f[i]=1+(1/1+1/2+...+1/(i-1))\),后面的调和级数可以直接套公式

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(!isdigit(ch)){
  9. if(ch=='-')f=-1;
  10. ch=getchar();
  11. }
  12. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. int main(){
  16. int n=gi();if(n==1)return puts("0.00000"),0;
  17. double ans=1;
  18. if(n<=1000000)for(int i=1;i<n;++i)ans+=1.0/i;
  19. else ans=1+log(n-1)+0.5772156649015;
  20. printf("%.5lf\n",ans);
  21. return 0;
  22. }

G 大循环

题面看着很nb,实际上上下的a没有关系,F(q)是个定值,答案就是\(C_{n}^{k}\times F(q)\)

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. #define mod 1000000007
  5. #define int ll
  6. typedef long long ll;
  7. il ll gi(){
  8. ll x=0,f=1;
  9. char ch=getchar();
  10. while(!isdigit(ch)){
  11. if(ch=='-')f=-1;
  12. ch=getchar();
  13. }
  14. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  15. return x*f;
  16. }
  17. int p[500010];
  18. il int pow(int x,int y){
  19. int ret=1;
  20. while(y){
  21. if(y&1)ret=1ll*ret*x%mod;
  22. x=1ll*x*x%mod;y>>=1;
  23. }
  24. return ret;
  25. }
  26. signed main(){
  27. ll n=gi(),m=gi(),k=gi(),q=gi()%mod,F=0;
  28. for(int x=1,i=0;i<=m;++i,x=1ll*x*q%mod)F=(F+1ll*x*gi()%mod)%mod;
  29. p[0]=1;for(int i=1;i<=n;++i)p[i]=1ll*p[i-1]*i%mod;
  30. printf("%lld\n",1ll*p[n]*pow(1ll*p[k]*p[n-k]%mod,mod-2)%mod*F%mod);
  31. return 0;
  32. }

H 会议座位

I 生日礼物

选两个数使得lcm=a,单独考虑a的每个质因数\(p^k\),那么这两个数一定有一个会有\(p^k\),另一个可以是\(p^{(0-k)}\),所以\(p^k\)有\(2k+1\)中选法。给a分解质因数,\(ans=\Pi(2k+1)\)

J HKE与他的小朋友

K 宝藏

二维树状数组 区间异或 区间查询异或和

和一维树状数组区间修改区间查询一样,记\(d(x,y)\)为\((x,y,n,n)\)这个子矩形的共同增量,查询\((x_0,y_0)\)只需查询\((1,1,x_0,y_0)\)的异或和。

冷静分析,\(d(x,y)\)在\((1,1,x_0,y_0)\)出现了奇数次才要计算\(d(x,y)\),条件就是\((x_0-x+1)(y_0-y+1)\)为奇数,那么\(x,x_0\)同奇偶,\(y,y_0\)同奇偶,对于每一种\(x,y\)的奇偶情况开一个树状数组即可,一共4个

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0,f=1;
  7. char ch=getchar();
  8. while(!isdigit(ch)){
  9. if(ch=='-')f=-1;
  10. ch=getchar();
  11. }
  12. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  13. return x*f;
  14. }
  15. int n,m,N;
  16. int t[2][2][1271][1271];
  17. il vd update(int x,int y,int d){
  18. int X=x&1,Y=y&1;x=(x+1)>>1,y=(y+1)>>1;
  19. for(int i=x;i<=N;i+=i&-i)
  20. for(int j=y;j<=N;j+=j&-j)
  21. t[X][Y][i][j]^=d;
  22. }
  23. il int query(int x,int y){
  24. int ret=0,X=x&1,Y=y&1;x=(x+1)>>1,y=(y+1)>>1;
  25. for(int i=x;i;i-=i&-i)
  26. for(int j=y;j;j-=j&-j)
  27. ret^=t[X][Y][i][j];
  28. return ret;
  29. }
  30. int main(){
  31. n=gi(),m=gi();N=(n+1)>>1;
  32. int x0,y0,x1,y1;char ch;
  33. for(int i=1;i<=m;++i){
  34. do ch=getchar();while(ch!='P'&&ch!='Q');
  35. x0=gi(),y0=gi(),x1=gi(),y1=gi();
  36. if(ch=='P'){
  37. int t=gi(),S=0,a,b;
  38. while(t--)a=gi(),b=gi(),S^=(b&1)<<(a-1);
  39. update(x0,y0,S);
  40. update(x0,y1+1,S);
  41. update(x1+1,y0,S);
  42. update(x1+1,y1+1,S);
  43. }else{
  44. int ans=query(x1,y1)^query(x1,y0-1)^query(x0-1,y1)^query(x0-1,y0-1);
  45. for(int i=0;i<30;++i)putchar('1'+((ans>>i)&1));
  46. puts("");
  47. }
  48. }
  49. return 0;
  50. }

L 简单的函数

回顾一下题目意思,对每个\(x\)找到最小的\(t\)满足\(t\not\mid x\),\(f(x)=f(t)+1\)

倒过来考虑,对每个\(t\)会转移到多少个\(x\)。(称为\(t\)的答案)\(x\)如果从\(t\)转移过来,那么\(lcm(1,2,...,t-1)\mid x,lcm(1,2,...,t)\not\mid x\)。

先考虑\(lcm(1,2,...,t-1)|x\),也就是说\(x\)是\(lcm(1,2,...,t-1)\)的倍数。满足这个的\(x\)有\(\lfloor\frac{n}{lcm(1,2,...,t-1)}\rfloor\)个。还要减去\(lcm(1,2,...,t)\mid x\)的情况,也就是所有\(t'>t\)的答案。

注意到\(lcm(1,...,42)\)大约是\(2*10^{17}\),那么可行的\(t\)不会超过\(42\),从\(42\)开始算即可。

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. #define mod 1000000007
  5. #define int ll
  6. typedef long long ll;
  7. il int gi(){
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(!isdigit(ch)){
  11. if(ch=='-')f=-1;
  12. ch=getchar();
  13. }
  14. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  15. return x*f;
  16. }
  17. il ll lcm(ll a,ll b){return a/std::__gcd(a,b)*b;}
  18. ll f[]={0,0,1,2,3,2,4,2,3,2,3,2,3,2,3,2,3,2,4,2,3,2,3,2,3,2,3,2,3,2,4,2,3,2,3,2,3,2,3,2,3,2,4,2};
  19. il int pow(int x,int y){
  20. int ret=1;
  21. while(y){
  22. if(y&1)ret=1ll*ret*x%mod;
  23. x=1ll*x*x%mod;y>>=1;
  24. }
  25. return ret;
  26. }
  27. ll L[50],a[50];
  28. signed main(){
  29. int n=gi();
  30. L[1]=1;for(int i=2;i<=42;++i)L[i]=lcm(i,L[i-1]);
  31. ll ans=1,sum=0;
  32. for(int i=42;i;--i){
  33. a[i]=n/L[i]-sum;
  34. if(L[i]<=2)--a[i];
  35. if(i==1)--a[i];
  36. ans=1ll*ans*pow(f[i+1]+1,a[i])%mod;
  37. sum+=a[i];
  38. }
  39. printf("%lld\n",ans);
  40. return 0;
  41. }

M 数列游戏

先dp一遍,\(f[l][r]\)表示\([l,r]\)这个区间里的数能否被消完,那么\(f[i][i+1]=[gcd(A[i],A[i+1])!=1]\)

\(f[l][r]\)有两种转移

  1. \(f[l+1][r-1] (gcd(A[l],A[r])!=1)\),先消完\([l+1,r-1]\),再消掉\(l,r\)
  2. \(f[l][k],f[k+1][r]\),消掉\([l,k]\)到\([k+1],r\)

这一段是\(O(n^3)\)的(我也不知道为啥能过)

然后就知道了哪些区间能用。剩下的看代码吧

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define vd void
  4. typedef long long ll;
  5. il int gi(){
  6. int x=0;
  7. char ch=getchar();
  8. while(!isdigit(ch)){
  9. ch=getchar();
  10. }
  11. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
  12. return x;
  13. }
  14. ll A[1001],B[1001];
  15. bool f[810][810];
  16. ll g[810],sg[810];
  17. il void chkmax(ll &a,ll b){if (a<b)a=b;}
  18. int main(){
  19. register int n=gi(),i,l,r,s;
  20. for(i=1;i<=n;++i)A[i]=gi();
  21. for(i=1;i<=n;++i)B[i]=gi()+B[i-1];
  22. for(i=1;i<n;++i)if(std::__gcd(A[i],A[i+1])!=1)f[i][i+1]=1;
  23. for(s=4;s<=n;s+=2)
  24. for(l=1;l+s-1<=n;++l){
  25. r=l+s-1;
  26. if(std::__gcd(A[l],A[r])!=1&&f[l+1][r-1])f[l][r]=1;
  27. for(i=l+1;i<=r&&!f[l][r];i+=2)
  28. f[l][r]|=f[l][i]&f[i+1][r];
  29. }
  30. for(r=1;r<=n;++r){//依次加入右端点为r的区间
  31. // g[r]表示区间[1,r]的最大收益,sg[r]=max(g[1],...,g[r])
  32. for(l=1;l<=r;++l)if(f[l][r])chkmax(g[r],B[r]-B[l-1]+sg[l-1]);
  33. for(i=1;i<=r;++i)sg[i]=std::max(sg[i-1],g[i]);
  34. }
  35. printf("%lld\n",sg[n]);
  36. return 0;
  37. }

洛谷NOIp热身赛题解的更多相关文章

  1. 洛谷NOIp热身赛 T2123 数列游戏

    题目背景 此题为改编题,特别鸣谢倪星宇同学. 有一次,HKE和LJC在玩一个游戏. 题目描述 游戏的规则是这样的:LJC在纸上写下两个长度均为N的数列A和B,两个数列一一对应.HKE每次可以找两个相邻 ...

  2. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  3. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  4. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

  5. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  6. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  7. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  8. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  9. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

随机推荐

  1. 记录Ubuntu14.04 LTS版本中使用Docker的过程

    sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-p ...

  2. 关于UIScrollView有些你很难知晓的崩溃情形

    关于UIScrollView有些你很难知晓的崩溃情形 为了实现以下的功能(按钮之间的切换效果): 简短的代码如下: // // RootViewController.m // BUG // // Co ...

  3. Mitigate XSS attacks

    JavaScriptEncode //使用“\”对特殊字符进行转义,除数字字母之外,小于127使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式). var JavaScrip ...

  4. 铁乐学Python_day08_文件操作

    一.[基本的文件操作] 参数: 1.文件路径: 2.编码方式: 3.执行动作:(打开方式)只读,只写,追加,读写,写读! #1. 打开文件,得到文件句柄并赋值给一个变量 f = open('E:/Py ...

  5. zabbix的日常监控-磁盘性能监控(十二)

    监控磁盘的性能 参考文章: https://wiki.enchtex.info/howto/zabbix/zabbix_iostat_monitoring https://blog.csdn.net/ ...

  6. 安全预警-防范新型勒索软件“BlackRouter”

    近期,出现一种新型勒索软件“BlackRouter”,开发者将其与正常软件恶意捆绑在一起,借助正常软件的下载和安装实现病毒传播,并以此躲避安全软件的查杀.目前,已知的被利用软件有AnyDesk工具(一 ...

  7. Hadoop学习之路(十四)MapReduce的核心运行机制

    概述 一个完整的 MapReduce 程序在分布式运行时有两类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.Yarnchild:负责 map 阶段的整个数据处理流程 3 ...

  8. Centos7配置samba

    Centos7配置samba 1.安装 yum install samba samba-client samba-common -y 2.配置 备份已有配置mv /etc/samba/smb.conf ...

  9. Fluent Terminal

    特性: PowerShell,CMD,WSL或自定义shell的终端 支持选项卡和多个窗口 主题和外观配置 导入/导出主题 导入iTerm主题 全屏模式 可编辑的键绑定 搜索功能 配置shell配置文 ...

  10. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...