【北航oj】(线段树取模运算)

题干:

https://buaacoding.cn/contest-ng/index.html#/334/problems

K wjj 的自动售货机

时间限制:1000ms   内存限制:131072kb

通过率:14/26 (53.85%)    正确率:14/119 (11.76%)

wjj 最近很看好线下实体销售的行业, 他觉得可以先投资自动售货机来试试水。

于是他在北航的新主楼中安装了一台可以售卖 nn 种物品的售货机, 第 ii 种物品共有 aiai 个。

为了方便用户,用户每次购买时, 可以选定某个区间 [l,r][l,r] 内的种类, 然后自动售货机根据选定的区间进行出货。

记 al,al+1,⋯,ar−1,aral,al+1,⋯,ar−1,ar 非零值中的最小值为 xx, 每种物品会以 xx 个为一组、尽可能多地出货; 即出货后,物品数量 ai←(aimodx),∀i∈[l,r]ai←(aimodx),∀i∈[l,r]。

wjj 最终按顺序记录了 qq 个这样的区间信息。 他希望你能帮他计算,每次出货前和出货后,选定区间内的剩余物品数量的总和; 即分别以每次出货前和出货后的 aiai,计算 ∑ri=lai∑i=lrai。

输入

第一行包含一个正整数 TT(1≤T≤101≤T≤10),表示有 TT 组测试数据。

接下来依次给出每组测试数据。对于每组测试数据:

第一行,包含两个整数 nn 和 qq,含义见题目描述。

第二行,nn 个空格分隔的整数,依次表示序列的每一项。0≤ai≤10130≤ai≤1013(1≤i≤n1≤i≤n)。

接下来 qq 行,每行表示一组询问,格式如下:

  • L R

1≤L≤R≤n1≤L≤R≤n。

对于所有的测试数据,满足 ∑n,∑q≤2×105∑n,∑q≤2×105。

输出

对于每组数据,对于每个询问,输出空格分隔的两个整数表示答案。

输入样例

1
5 2
5 4 2 2 10
1 5
1 5

输出样例

23 1
1 0

题目大意:

   n个数,q次询问,每次询问给出一段区间,找到区间内非零的最小的数x,对该区间的每个数都更新为a[i]取模x,对于每次操作,输出更新前和更新后的区间和。

解题报告:

   由于取模运算可以使得改数字最少减小一半(证明很简单),所以对于每个数字最多logn次就降为0,所以对于更新操作可以直接暴力。对于查询最小值,注意一下排除为0的情况就可以了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const ll INF = 9223372036854775807;
int n,q;
ll a[MAX];
struct TREE {int l,r;ll val;//区间和 ll minn;
} tree[MAX<<2];
void pushup(int cur) {ll t1=tree[cur*2].minn;ll t2=tree[cur*2+1].minn;if(t1 == 0) tree[cur].minn = t2;else if(t2 == 0) tree[cur].minn = t1;else tree[cur].minn = min(t1,t2);tree[cur].val = tree[cur*2].val + tree[cur*2+1].val;
}
void build(int l,int r,int cur) {tree[cur].l = l,tree[cur].r = r;if(l == r) {tree[cur].minn = tree[cur].val = a[r];return;}int m = (l+r)>>1;build(l,m,cur*2);build(m+1,r,cur*2+1);pushup(cur);
}
ll qMin(int pl,int pr,int cur) {//查询区间最小值 if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].minn;}ll tmp1 = INF,tmp2 = INF;if(pl <= tree[cur*2].r) tmp1 = qMin(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qMin(pl,pr,cur*2+1);if(tmp1 == 0) {if(tmp2 == INF) tmp2=0;return tmp2;}if(tmp2 == 0) {if(tmp1 == INF) tmp1=0;return tmp1;}return min(tmp1,tmp2);
}ll qSum(int pl,int pr,int cur) {//查询区间和if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].val;}ll tmp1 = 0,tmp2 = 0;if(pl <= tree[cur*2].r) tmp1 = qSum(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qSum(pl,pr,cur*2+1);return tmp1+tmp2;
}
void update(int pl,int pr,ll val,int cur) {if(tree[cur].minn == 0) return ;if(tree[cur].l == tree[cur].r) {tree[cur].val%=val;tree[cur].minn%=val;return;}if(pl <= tree[cur*2].r) update(pl,pr,val,cur*2);if(pr >= tree[cur*2+1].l) update(pl,pr,val,cur*2+1);pushup(cur);
}
int main()
{int t;cin>>t;while(t--) {scanf("%d%d",&n,&q);for(int i = 1; i<=n; i++) {scanf("%lld",a+i);}build(1,n,1);while(q--) {int l,r;scanf("%d%d",&l,&r);ll tmp = qMin(l,r,1);ll ans1 = qSum(l,r,1);ll ans2;if(tmp == 0) ans2 = ans1;else {update(l,r,tmp,1);ans2 = qSum(l,r,1);}printf("%lld %lld\n",ans1,ans2);}}return 0 ;
}

WA代码1:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const ll INF = 9223372036854775807;
int n,q;
ll a[MAX];
struct TREE {int l,r;ll val;//区间和 ll minn;
} tree[MAX<<2];
void pushup(int cur) {ll t1=tree[cur*2].minn;ll t2=tree[cur*2+1].minn;if(t1 == 0) tree[cur].minn = t2;else if(t2 == 0) tree[cur].minn = t1;else tree[cur].minn = min(t1,t2);tree[cur].val = tree[cur*2].val + tree[cur*2+1].val;
}
void build(int l,int r,int cur) {tree[cur].l = l,tree[cur].r = r;if(l == r) {tree[cur].minn = tree[cur].val = a[r];return;}int m = (l+r)>>1;build(l,m,cur*2);build(m+1,r,cur*2+1);pushup(cur);
}
ll qMin(int pl,int pr,int cur) {//查询区间最小值 if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].minn;}ll tmp1 = INF,tmp2 = INF;if(pl <= tree[cur*2].r) tmp1 = qMin(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qMin(pl,pr,cur*2+1);return min(tmp1,tmp2);
}ll qSum(int pl,int pr,int cur) {//查询区间和if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].val;}ll tmp1 = 0,tmp2 = 0;if(pl <= tree[cur*2].r) tmp1 = qMin(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qMin(pl,pr,cur*2+1);return tmp1+tmp2;
}
void update(int pl,int pr,ll val,int cur) {if(tree[cur].minn == 0) return ;if(tree[cur].l == tree[cur].r) {tree[cur].val%=val;tree[cur].minn%=val;return;}if(pl <= tree[cur*2].r) update(pl,pr,val,cur*2);if(pr >= tree[cur*2+1].l) update(pl,pr,val,cur*2+1);pushup(cur);
}
int main()
{int t;cin>>t;while(t--) {scanf("%d%d",&n,&q);for(int i = 1; i<=n; i++) {scanf("%lld",a+i);}build(1,n,1);while(q--) {int l,r;scanf("%d%d",&l,&r);ll tmp = qMin(l,r,1);ll ans1 = qSum(l,r,1);ll ans2;if(tmp == 0) ans2 = ans1;else {update(l,r,tmp,1);ans2 = qSum(l,r,1);} printf("%lld %lld\n",ans1,ans2);}}return 0 ;
}

WA代码2::

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
const ll INF = 9223372036854775807;
int n,q;
ll a[MAX];
struct TREE {int l,r;ll val;//区间和 ll minn;
} tree[MAX<<2];
void pushup(int cur) {ll t1=tree[cur*2].minn;ll t2=tree[cur*2+1].minn;if(t1 == 0) tree[cur].minn = t2;else if(t2 == 0) tree[cur].minn = t1;else tree[cur].minn = min(t1,t2);tree[cur].val = tree[cur*2].val + tree[cur*2+1].val;
}
void build(int l,int r,int cur) {tree[cur].l = l,tree[cur].r = r;if(l == r) {tree[cur].minn = tree[cur].val = a[r];return;}int m = (l+r)>>1;build(l,m,cur*2);build(m+1,r,cur*2+1);pushup(cur);
}
ll qMin(int pl,int pr,int cur) {//查询区间最小值 if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].minn;}ll tmp1 = INF,tmp2 = INF;if(pl <= tree[cur*2].r) tmp1 = qMin(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qMin(pl,pr,cur*2+1);if(tmp1 == 0) return tmp2;if(tmp2 == 0) return tmp1;return min(tmp1,tmp2);
}ll qSum(int pl,int pr,int cur) {//查询区间和if(pl <= tree[cur].l && pr >= tree[cur].r) {return tree[cur].val;}ll tmp1 = 0,tmp2 = 0;if(pl <= tree[cur*2].r) tmp1 = qMin(pl,pr,cur*2);if(pr >= tree[cur*2+1].l) tmp2 = qMin(pl,pr,cur*2+1);return tmp1+tmp2;
}
void update(int pl,int pr,ll val,int cur) {if(tree[cur].minn == 0) return ;if(tree[cur].l == tree[cur].r) {tree[cur].val%=val;tree[cur].minn%=val;return;}if(pl <= tree[cur*2].r) update(pl,pr,val,cur*2);if(pr >= tree[cur*2+1].l) update(pl,pr,val,cur*2+1);pushup(cur);
}
int main()
{int t;cin>>t;while(t--) {scanf("%d%d",&n,&q);for(int i = 1; i<=n; i++) {scanf("%lld",a+i);}build(1,n,1);while(q--) {int l,r;scanf("%d%d",&l,&r);ll tmp = qMin(l,r,1);ll ans1 = qSum(l,r,1);ll ans2;if(tmp == 0) ans2 = ans1;else {update(l,r,tmp,1);ans2 = qSum(l,r,1);} printf("%lld %lld\n",ans1,ans2);}}return 0 ;
}

总结:

WA了好几发,,

首先RE因为没有开四倍。

1WA首先是没有所有的变量都开longlong,后来一个一个变量检查的。

2WA是INF设置的不够大,因为单个数据是1e13,而总共2e5个数,所以最大可能值是2e18,所以保险起见就设置INF为9e18好了。

3WA在求最小值的时候不太对,(也就是WA代码1那样写的)这样会导致只要有一个儿子节点的minn是0,就直接返回0了。

4WA在求最小值的时候不太对,因为这样有可能返回INF,比如左子树的minn是0,右子树的minn是2,那么应该返回 2,但是这样的话就返回INF了。。。

5WA在qSum的时候,,,里面递归竟然写成了qMin。。。我再也不复制粘贴了55555.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 音频编辑器,在Matlab中使用App Designer可以进行实时音频处理吗?

我想用Matlab中的应用程序设计器编写一个简单的音频过滤应用程序。一个人应该能够加载音频文件,按播放和改变参数,如输入增益,截止频率等,而文件正在播放。我只是不知道如何能够实时更改参数并更新相应的变量,以便人们能够听到过滤器是如何更改的。这是我现在写的代码:classdef…

【牛客 - 157E】青蛙(floyd最短路,建图)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/157/E 来源&#xff1a;牛客网 题目描述 有一只可爱的老青蛙&#xff0c;在路的另一端发现了一个黑的东西&#xff0c;想过去一探究竟。于是便开始踏上了旅途 一直这个小路上有很多的隧道&#xff0…

php移动端url,什么是PC和移动端URL路径规范化

什么叫PC和手机端URL途径规范性在网址百度搜索引擎提升的全过程中&#xff0c;会牵涉到途径方位的难题。网址中的同一个网页页面只相匹配一个网站地址。一个规范化和简易的网站地址有利于检索和捕捉客户的记忆力&#xff0c;回绝好几条途径&#xff0c;偏向同一个网页页面&…

【牛客 - 157D】插排树(dfs,树形dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/157/D 来源&#xff1a;牛客网 一年一度的山东省oi夏令营又开始了&#xff0c;每到这个季节&#xff0c;山东的oier们都会欢聚这里&#xff0c;一起学&#xff08;tu&#xff09;习&#xff08;fe&…

【北航】Bella 姐姐发辣条(贪心)

题干&#xff1a; 题目描述 Bella 姐姐又来回国发辣条啦。 所有集训队的小朋友按照训练成绩站成一排&#xff0c;从左到右为成绩从低到高排列。每个人都对和蔼的 Bella 姐姐有两个要求&#xff1a; 我至少需要 AiAi 根辣条。 我要比我左边的小朋友恰好多 BiBi 根辣条&#…

【蓝桥杯官网试题 - 历届试题】小朋友排队(逆序数,树状数组)

题干&#xff1a; 问题描述 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。   每个小朋友都有一个不高兴的程度。开始的时候&#xff0c;所有小朋友的不高兴程度都是0。   如果某个小朋友第一次被要求交换…

matlab的diray在哪,matlab笔记

matlab笔记 目录 P5第一章——matlab 概述与格式 P10eps 浮点相对精度inf 无穷大i 或 j 虚数单位pi 圆周率nan 非数nargin 函数输入变量数目nargout 函数输出变量数目realmax 最大正实数realmin 最小正实数real( ) 实部imag( ) 虚部abs( ) 绝对值angle( ) 复数的相位角**matlab…

【CodeForces - 190E】Counter Attack (补图bfs,卡常,dsu)

题干&#xff1a; 无向图中给定n个顶点&#xff0c;m条不存在的边(除了这m条边&#xff0c;其余都存在)&#xff0c;求图的连通分量&#xff0c;及每个连通分量的大小。 解题报告&#xff1a; https://codeforces.com/blog/entry/4556 AC代码&#xff1a; #include<cstd…

denison php,Parker / Denison丹尼逊柱塞泵首相系列相关说明

派克Dension首相系列柱塞泵经过专门设计&#xff0c;可在要求流量可变&#xff0c;高压和高速的行业中使用。凭借无与伦比的连续psi额定压力和灵活的设计&#xff0c;它们确保了可靠性。首相系列具有卓越的设计和简化的维护&#xff0c;可提供可提高性能的高压可变活塞泵。低进…

【HDU - 6119】小小粉丝度度熊 (区间合并,尺取,思维)

题干&#xff1a; 度度熊喜欢着喵哈哈村的大明星——星星小姐。 为什么度度熊会喜欢星星小姐呢&#xff1f; 首先星星小姐笑起来非常动人&#xff0c;其次星星小姐唱歌也非常好听。 但这都不是最重要的&#xff0c;最重要的是&#xff0c;星星小姐拍的一手好代码&#x…

matlab 多径 时变 信道 冲击响应,无线信道—时变冲激响应

图1无线信道的作用可以分成大尺度效应和小尺度效应。大尺度的效应就是改变了信号的平均功率&#xff0c;即B点的功率是A点的1/L。因此可以将图1等效成图2图2其中C点的平均功率等于B点的平均功率。L的数值可根据传播模型确定。影响接收机性能的只是信噪比&#xff0c;因此&#…

matlab中均线交易策略,【每日一策】Matlab量化交易策略之 均线选股策略

策略名称&#xff1a;均线选股策略策略说明&#xff1a;对沪深300全市场扫描买入条件&#xff1a;1 短均线大于长均线2 最近N个交易日短均线大于长均线的次数满足某个阈值3 当前交易日的长均线值处于某个高位出场条件&#xff1a;止损&#xff1a;价格跌破入场价的一定百分比止…

【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)

题干&#xff1a; After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such as cleaning out the computer lab for training as extension of his contribution to the team. When Christmas came, flymouse played Father Ch…

docker php 乱码,如何解决docker安装zabbix5.0界面乱码

如何解决docker安装zabbix5.0界面乱码&#xff1f;zabbix图形界面乱码如下&#xff1a;解决&#xff1a;docker部署zabbix-web和源码安装zabbix-web一样&#xff0c;字体都是存储在/usr/share/zabbix/assets/fonts/1、从windown拷贝simkai.ttf(楷体)文件到docker的zabbix-web里…

【POJ - 1330】Nearest Common Ancestors(lca,模板题)

题干&#xff1a; A rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor o…

java redis 流水线,Redis系列(1) —— 流水线

写在前面去年下半年&#xff0c;出于学习Redis的目的&#xff0c;在看完《Redis in Action》一书后&#xff0c;开始尝试翻译Redis官方文档。尽管Redis中文官方网站有了译本&#xff0c;但是看别人翻译好的和自己翻译英文原文毕竟还是有很大的不同。这一系列文章之前发布在GitB…

【HDU - 6187】Destroy Walls(思维,最大生成树)

题干&#xff1a; Long times ago, there are beautiful historic walls in the city. These walls divide the city into many parts of area. Since it was not convenient, the new king wants to destroy some of these walls, so he can arrive anywhere from his castl…

mseq matlab,Matlab生成M序列

版权声明&#xff1a;本文为CSDN博主「laomai」的原创文章原文链接&#xff1a;https://blog.csdn.net/laomai/article/details/24342493找了好多代码&#xff0c;这个步骤详细可以傻瓜操作&#xff0c;存着备用~实验环境为matlab2013b1、首先编写一个mseq.m文件,内容为:functi…

【HDU - 6185】Covering(矩阵快速幂优化二维dp,高斯消元,轮廓线dp打表)

题干&#xff1a; Bobs school has a big playground, boys and girls always play games here after school. To protect boys and girls from getting hurt when playing happily on the playground, rich boy Bob decided to cover the playground using his carpets. Me…

Java工厂构造函数参数,javascript 面向对象之构造函数、工厂方式、字面量

什么是面向对象编程面向对象的英文全称:Object Oriented Programming , 简称OOP首先我们要先了解面向过程的编程思想, 就是代码从上到下都没有封装的意思&#xff0c;某写代码裸露在外、没有模块化、代码杂乱无章的写法. 并且还不好维护&#xff0c;也不便于后期二次修改面向对…