T1 (help)

题意简述

给定一个长度为\(n\)的序列。然后给出多组询问.

询问\([l,r]\)区间内不等于该段区间\(gcd\)的数的个数。

分析

  看到区间问题,优先考虑线段树 or 树状数组

貌似可以树状数组做.但维护起来会比较麻烦.

下面讲解线段树做法

线段树做法.

首先,线段树要维护区间\(gcd\)

这里使用\(tr[o]\)代表当前区间的区间\(gcd\).

如何记录答案?

 很显然,我们直接记录\([l,r]\)区间内不等于该段区间\(gcd\)的数的个数会比较麻烦.

因此,考虑记录等于该段区间\(gcd\)的数的个数.(在线段树上维护.

我们使用数组\(sum[o]\)代表当前区间中等于区间\(gcd\)的数的个数.

而每次询问的区间长度又已知,所以我们每一次询问的结果就是
\[ ans=r-l+1-query(1,1,n,l,r,gd(1,1,n,l,r)); \]
PS:\(gd\)函数是用来求解区间\(gcd\)的

如何更新/传递\(sum\)数组呢?

 首先,我们会把叶子节点的\(sum\)标记为\(1\)(只会有一个数啊 qwq.

然后当向上传递的时候,我们的区间\(gcd\)会变化.

这里写一下区间\(gcd\)的上传操作
\[ tr[o]=gcd(tr[ls],tr[rs]); \]
发现区间\(gcd\)是会变化的,因此我们的\(sum\)数组也要随之变化.

我们需要判断的是\(tr[o]\)的值是\(tr[ls]\)还是\(tr[rs]\)。

一.\(tr[o]\)来自\(tr[ls]\)

此时我们的\(sum[o]\)可以接受\(sum[ls]\)的贡献,

二.\(tr[o]\)来自\(tr[rs]\)

此时我们的\(sum[o]\)可以接受\(sum[rs]\)的贡献.

三. \(tr[o]\)同时来自\(tr[ls]\)和\(tr[rs]\)

此时便可以同时获得贡献.

因此,\(sum\)数组的转移就可以写成这样.
\[ sum[o]=(tr[o]==tr[ls]\ ?\ sum[ls]:0)+(tr[o]==tr[rs]\ ?\ sum[rs]:0); \]
此时,知道了\(sum\)数组,我们的问题就得以解决.

代码

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#define N 5000008
#define ls o<<1
#define rs o<<1|1
#define R register
using namespace std;
inline void in(int &x)
{int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f;
}
int tr[N],sum[N],n,m;
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
inline void up(int o)
{tr[o]=gcd(tr[ls],tr[rs]);sum[o]=(tr[o]==tr[ls] ? sum[ls]:0)+(tr[o]==tr[rs] ? sum[rs]:0);
}
void build(int o,int l,int r)
{if(l==r){in(tr[o]);sum[o]=1;return;}int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);up(o);return;
}
int gd(int o,int l,int r,int x,int y)
{if(x<=l and y>=r)return tr[o];int mid=(l+r)>>1;if(y<=mid) return gd(ls,l,mid,x,y);if(x>mid)   return gd(rs,mid+1,r,x,y);return gcd(gd(ls,l,mid,x,y),gd(rs,mid+1,r,x,y));
}
int query(int o,int l,int r,int x,int y,int k)
{if(x<=l and y>=r) return tr[o]== k ?sum[o]:0;int mid=(l+r)>>1,res=0;if(y<=mid) return query(ls,l,mid,x,y,k);if(x>mid) return query(rs,mid+1,r,x,y,k);return query(ls,l,mid,x,y,k)+query(rs,mid+1,r,x,y,k);
}
int main()
{//freopen("help.in","r",stdin);//freopen("help.out","w",stdout);in(n);build(1,1,n);in(m);for(R int l,r;m;m--){in(l),in(r);printf("%d\n",r-l+1-query(1,1,n,l,r,gd(1,1,n,l,r)));}fclose(stdin);fclose(stdout);return 0;
}

T2(escape)

题意简述

给定\(n\)个数,这\(n\)个数均在\(1-n\)的范围内,其中有一个数出现了两次,其余数均出现了一次.让你求出这个出现两次的数.

数据范围

\(2\leq n \leq10^7\)

时空限制

\(2000ms/16MB\)

吐槽

如果数组给的足够大,相信大家都能切掉这种傻逼题.

但是如果不能开数组呢?

其实空间想给1MB来着,结果标程跑不动 QAQ

这时候就需要用到我们的\(Math\)方法

分析

 首先,从题目中大家应该都能得到一个信息.

这\(n\)个\(1-n\)的数中,如果一个数出现了两次,且其他数都只出现了一次,那么必定有一个数没出现过.

接下来进入数学推导时间.~w~

数学推导

我们设这个出现两次的数为\(x\),没有出现的数为\(y\),

首先很明显的一个关系:
\[ \sum_{i=1}^{n}a_i -\sum_{i=1}^{n}i=x-y. \]
此方程左侧部分可求,如何求解右侧部分?

明显,一个方程解两个未知数不显示.

我们需要再找另一个关系.

考虑到\(\sum\),我们为何不考虑\(\prod\)呢?

手推一下可以发现一个新的关系(其实应该用不到手推) qwq
\[ \frac{\prod_{i=1}^{n}a_i}{\prod_{i=1}^{n}i}=\frac{x}{y} \]
然后解方程.
\[ \begin{cases}\sum_{i=1}^{n}a_i -\sum_{i=1}^{n}i=x-y\\\\\frac{\prod_{i=1}^{n}a_i}{\prod_{i=1}^{n}i}=\frac{x}{y}\\\end{cases} \]
再把式子小小的变形一下.

令\(\sum_{i=1}^{n}a_i-\sum_{i=1}^{n}i=d\)

令\(\frac{\prod_{i=1}^{n}a_i}{\prod_{i-1}^{n}i}=p\)
\[ x-y=d\\x=y+d \]
推知
\[ \frac{y+d}{y}=p \\ 1+\frac{d}{y}=p \]
建议手推,中间过程不继续放出.

最终推知
\[ y=\frac{d}{p-1} \]
因此
\[ x= \frac{d}{p-1}+d \]
题目得解.

由于\(\prod\)操作会超级大.

因此,此题为模意义下的解方程.

代码

PS:代码中的变量与推导部分的变量不符

#include<cstdio>
#include<cctype>
#define mod 19260817
#define R register
using namespace std;
inline long long ksm(long long x,long long y)
{long long res=1;for(;y;y>>=1,x=x*x%mod)if(y&1)res=res*x%mod;return res;
}
long long n,k,suma,sum,paia=1,pai=1;
long long c,d;
int main()
{//freopen("escape.in","r",stdin);//freopen("escape.out","w",stdout);scanf("%lld",&n);for(R int i=1;i<=n;i++){R long long x;scanf("%lld",&x);(suma+=x)%=mod;(sum+=i)%=mod;(pai*=i)%=mod;(paia*=x)%=mod;}c=suma-sum;d=paia*ksm(pai,mod-2)%mod;long long x=(c*ksm(d-1,mod-2)+c);printf("%lld",(x%mod+mod)%mod);fclose(stdin);fclose(stdout);return 0;
}

T3(cure)

原题为\(「JOI 2017 Final」\)焚风现象

题解你们如果看得懂日文就去看看 -->https://www.ioi-jp.org/joi/2016/2017-ho/2017-ho-t1-review.pdf

分析

首先,这是一个差分模板题,不过应该不是很容易看出来.

涉及到了区间修改与单点查询.(我相信有人会写数据结构的.

但是这里的单点查询就是一个固定的点\(n\)。

首先考虑为什么可以差分去做?

 题目中的描述就暗示着我们进行差分啊.

首先我们发现了题目中的这一句话

风的温度随海拔升降而变化。

而,每个地点的海拔已知,所以我们可以在输入的时候求出每个位置的海拔差.

做法

根据海拔差,我们又可以求出每个位置的温度.由于\(n\)位置不会变,且一直为最后一个位置.

所以我们可以累加\(ans\).(因为最后一个位置\(n\)永远不会变。

而且考虑到某一段区间的海拔变化,相对位置不会变,我们只需要考虑从起始位置\(l\)的温度变化,后面到达\(r\)的温度就随之变化.

这里需要注意的位置就是当\(r==n\)的时候,是不需要变化\(r+1\)位置的海拔与温度的.

即我们的\(ans\)是不需要改变的.而改变的话,需要考虑相对高度的变化.我相信大家能懂的 qwq.

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#define N 200005
#define R register
using namespace std;
long long n,q,s,t;
long long A[N],last,ans;
inline void in(long long &x)
{int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f;
}
inline long long get(long long x)
{return  x > 0 ? -(x*s) : -(x*t) ;
}
int main()
{//freopen("cure.in","r",stdin);//freopen("cure.out","w",stdout);in(n),in(q),in(s),in(t);in(last);for(R int i=1;i<=n;i++){R long long x;in(x);A[i]=x-last;last=x;ans+=get(A[i]);}for(R long long x,y,z;q;q--){in(x),in(y),in(z);ans-=get(A[x]);A[x]+=z;ans+=get(A[x]);if(y!=n) ans-=get(A[y+1]),A[y+1]-=z,ans+=get(A[y+1]);printf("%lld\n",ans);}fclose(stdin);fclose(stdout);return 0;
}

还有标程很神奇

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s1,s2;
ll dif[300001];
ll get(ll t)
{if(t>0)return -s1*t;else return -s2*t;
}
int main()
{int num,query;scanf("%d%d%lld%lld",&num,&query,&s1,&s2);vector<int>v;for(int i=0;i<=num;i++){int z;scanf("%d",&z);v.push_back(z);}ll ans=0;for(int i=0;i<num;i++){dif[i]=v[i+1]-v[i];ans+=get(dif[i]);}for(int i=0;i<query;i++){int za,zb,zc;scanf("%d%d%d",&za,&zb,&zc);ans-=get(dif[za-1]);dif[za-1]+=zc;ans+=get(dif[za-1]);if(zb!=num){ans-=get(dif[zb]);dif[zb]-=zc;ans+=get(dif[zb]);}printf("%lld\n",ans);}
}

转载于:https://www.cnblogs.com/-guz/p/9759062.html

10.9 顾z校内互坑题相关推荐

  1. 校内互测题 by LMY (FSN)

    这道题的题目描述得好像很烦,大概是要让物理攻击先攻击,然后去攻击魔法攻击,问如何物理攻击可以花最少的魔法攻击花费,当然我们不用输出如何物理攻击,只需要输出最少的魔法攻击花费就可以了,于是我们先预处理d ...

  2. 2019年吉林大学数学建模校内选拔赛B题的一种思路

    前几天举办的数学建模校内选拔赛B题是这样的: B题 中国像素地图城市间最短路优化问题 下图是在http://pixelmap.amcharts.com/ 上生成的中国像素地图. 每个小正方形边长为6p ...

  3. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 73  Solved: 23 [Submit][Status ...

  4. 下列程序的运行结果是 #include <stdio.h> void main() { int x = 10, y = 20, z = 30;

    1.直接运行程序得出结果 #include <stdio.h>void main() {int x = 10, y = 20, z = 30;printf("%d %d %d % ...

  5. 2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑

    20200725005909 2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑 如果一直 TLE,就看第三章. 一.题意 物品可能的种类有 kkk 种,编号 ...

  6. 10道python面试题,每题10分,你能的多少分!(内附python教程)

    image.png 1.一行代码实现1–100之和 10道python面试题,每题10分,你能的多少分! 2.简述面向对象中new和init区别 init是初始化方法,创建对象后,就立刻被默认调用了, ...

  7. 成考期末计算机组成原理,2020年10月自考02318计算机组成原理真题及答案

    以下是湖南自考生网为考生们整理的"2020年10月自考02318计算机组成原理真题及答案",考生可通过自考试卷练习更有把握的面对考试,对题型更加熟悉,从而取得更佳的成绩.供考生参考 ...

  8. 首师大附中互测题:LJX的校园:入学典礼【C003】

    [C003]LJX的校园:入学典礼[难度C]------------------------------------------------------------------------------ ...

  9. 02325计算机系统结构201810,2018年10月自考02325计算机系统结构真题及答案

    以下是湖南自考生网为考生们整理的"2018年10月自考02325计算机系统结构真题及答案",考生可通过自考历年真题练习更有把握的面对考试,对题型更加熟悉,从而取得更佳的成绩.供考生 ...

最新文章

  1. 如何将github上源代码导入eclipse中
  2. css( div和span)——读书笔记
  3. 八数码问题II-双向bfs和map标记
  4. C/C++中无条件花括号的妙用
  5. 使用Python进行汽车黑客攻击:泄露GPS和OBDIICAN总线数据
  6. McAfee杀毒软件中的提权漏洞
  7. cool edit pro 2.1中文版未定义外部错误怎么解决
  8. clustalw序列比对_Clustal的使用总结(Clustalx+Clustalw)
  9. 盘点一道使用Python编程来实现高斯计算的基础算术题目
  10. 有哪些支持 HomeKit 的智能家居生态值得推荐?
  11. 关于交换机包转发率1.488Mpps是如何计算出来的?
  12. JAVA入门:猜大小程序
  13. 手把手教你用熵值法计算权重
  14. 【论文阅读】DeepPap: Deep Convolutional Networks for Cervical Cell Classification
  15. json格式数据的传值与取值
  16. 短距离激光测距仪方案模块
  17. 网站推广秘诀二十法(经试验有效,最后有绝招)
  18. sketch web组件_在Sketch中设计受VSCO启发的Web Journal
  19. Flutter中 解决自定义阿里妈妈图标一直显示不出来的问题
  20. android 意图过滤,Android 意图(Intent)及过滤器(Filter).pdf

热门文章

  1. 区块链游戏中的网络效应:内容仍为王
  2. python生成条形码(不限制长度)
  3. Isight与MATLAB联合仿真时出现:无法定位或初始化类(unsupported major minor version 52.0)
  4. rocketMq监控平台界面
  5. arm_neon.h引用
  6. 德尔福ESR雷达测试
  7. Matlab abs防抱死系统,防抱死制动系统建模
  8. [博学谷学习记录]超强总结,用心分享|人工智能机械学习基础知识KMeans总结分享
  9. c# 自定义多个SplitContainer 支持点击放大缩小
  10. 网易免费企业邮箱配置客户端