精华内容
下载资源
问答
  • 先完成上期的作业:见图1、2:图1图2 作业时间:请用多条件求和SUMIFS出5.15日到5.31期间,张三的销售额大于等于50万【小于50万不计算入内】的合计销售额。 可以看出对于多条件函数求和模型都是一样的,对于区间...

    各位好:以后每周都会按学习顺序给大家教EXCEL知识,欢迎关注和学习!

    先完成上期的作业:见图1、2:

    fc1a6adbbadf645a9c223d5d9304ea9b.png

    图1

    0f1971ed9252ca0567e910362a7c4d6a.png

    图2

    作业时间:请用多条件求和SUMIFS算出5.15日到5.31期间,张三的销售额大于等于50万【小于50万不计算入内】的合计销售额。

    可以看出对于多条件函数求和模型都是一样的,对于区间日期、数字都用英文、=实现大小和前后区别去建立条件求和。注意引用日期和数字区间双信号在最外围【见图1】。图2结果和图1是一样的,区别在于引用日期的时候日期为单元格值,这样我们改变单元格日期就可以实现不同区间日期求和,这种要比手动改公式方便的多,可以成日期单元格为参数。【“大于小于符号”&日期单元格】请务必记住日期的引用格式,这与传统的模式不太一样,相信不少人以为这样写:>=&F8,这种是错误的写法。

    字符串函数LEN、LEFT、RIGHT、MID函数。

    很明显从英文上理解就是长度、左、右、中间函数。先说LEN函数。见图3:

    c80d885c5d0b869c300c01468eddf9e6.png

    图3

    =LEN(A1),很简单的函数,意思就是A1单元字符长度多少,很明显六个汉字。再说LEFT函数,见图4:

    4be2745f75e1c2b885287b48c1d47dd6.png

    图4

    =LEFT(A1,2)两个参数,第一参数求哪个单元格,第二参数,从左边起显示几个字符。连起来就是:我要找出A1单元格【一二三四五六】从左边起连续2个数量字符并显示出来。很明显大家都能数出来就是:一二。那么对应的右函数呢?一样的逻辑,无非从右边开始计算。十分简单,除非你分不清楚左右,不然我不信你们学不会。至于用途是在太多了,比如图6:对于有规律的字符串批量提取左右有规律的字段,相信现实应该不要太多,这个函数务必学会,后期这个可是相当于加减乘除符号,这个学不会就别学以后的一元二元方程了。

    97b8c602d3533fc108919c102ddb8b1d.png

    图6

    MID函数,顾名思义从中间取数。聪明的你肯定想起来这个函数绝对绝对不只两个参数,因为我从中间取数,那必须定位到从中间哪里定位【其实左右函数就是默认从0位开始取数的,所以实际是三位参数】。先看图5:

    c2818d15d392756fd561a6a42788203b.png

    图5

    =MID(A1,3,2)逻辑:从A1单元格,从第三个字段开始【中间对应MID意思】,连续取2个字符。一二三四五六从第三个开始【是三,包括本身为第一位哦】,连续取2个,三为第一个字符,连续两个就是三四。缩短话就是:从某个单元格第几位开始连续取几位字符。记住这句话整个函数就理解。MID实际应用不是特别大,但是肯定有用处。对于复杂字段处理肯定能用到,专业上数据处理就是正则的意思。有意思可以了解下,这里不说。

    好了说完这个四个函数我们来说说另一组函数:LENB、LEFTB、RIGHTB、MIDB函数。啥意思?没意思就是多个B。见下图体会下:

    8bf25f20310c5c2f7d99650e0cd3de06.png

    图7

    我们观察发下,把同样的公式分别换成LENB、LEFTB、RIGHTB、MIDB后字符长度翻倍了,对应原来左边取4位现在只能取2个字符了。什么意思呢?先给大家解剖下原理:原来计算机语言英文【数字、英文标点符号】一个字节等于1,而汉字【汉字标点符号】呢,一个字节等于2.说白了,就是A长度等于1,啊长度等于2。用LNE【无B】的时候不管你英文中文一个字符就是1,LENB函数对应英文【数字、英文标点符号】字符为1,汉字【汉字标点符号】字符却是2。在琢磨这几句话后请大家好好如图所示多试试几个字段【中英文、标点符号】,一对比就能马上理解并且想忘忘不掉!:按图8这样一个个试试啊。

    a170e2fd5ed90a628f0c7f16a692da95.png

    图8

    作业:见图9:提示:就今天学的函数就行了,要学会用数学逻辑哦,这个你能独立做出来那么你便开始初步有了如何自发式组件函数解决实际问题的思维。

    9b3b1461235415d0461b1a879812d12c.png

    图9

    2730013d624666fb0353dbb1497733b1.png

    封面

    展开全文
  • 这种表达式啥的都给了的就只需要考虑怎么算的快一点就好了.不用怎么转弯. 写完后看了下网上的题解,感觉和我的思路不太一样,这里提供一下我的思路. 最暴力的版本,两个for循环.就不提了. 但模拟一下暴力版本还是需要的...

    题目链接
    简单说一下题意,就是说给了一个数组,每个区间长度都有一个权值.定义了一个f函数即 i->j区间的区间和×该区间长度的权值 然后给了两个求和符号.不好描述.具体看题目吧.
    这种表达式啥的都给了的就只需要考虑怎么算的快一点就好了.不用怎么转弯.
    写完后看了下网上的题解,感觉和我的思路不太一样,这里提供一下我的思路.
    最暴力的版本,两个for循环.就不提了.
    但模拟一下暴力版本还是需要的.怎么算呢?
    假设n = 5.计算过程(暴力版本是从左往右算):
    1-1 2-2 3-3 4-4 5-5
    1-2 2-3 3-4 4-5
    1-3 2-4 3-5
    1-4 2-5
    1-5
    从上往下观察这个式子可以发现一个问题,如果我们按照区间长度来算的话.可能会是一个更好的选择,不过这么算有一个问题.区间有些重复了.比如说看第二行.
    1 2 2 3 3 4 4 5 这行里面除了1-5大区间之外,又算了一遍2-4这个区间
    第三行 1 2 3 2 3 4 3 4 5 这行除了1-5算了一遍 2-4算了两遍 3-3算了三遍
    第四行分析后也 2-4这个区间算了两遍
    有没有发现什么规律?我们假设一开始设置两个指针p1和p2,让p1指向开头,p2指向结尾 这是第一次计算时的有效区间,我们算完之后让p1++,p2–.然后用一个变量tmp存下这个值.然后发现越过中点之后.虽然还是加法但其实是把那段区间给减掉了.我表达的可能不是很好,可以自己画一画,想一想.就会发现这道题其实很简单.不过有一个坑点就是取模运算要注意一下了(因为这个WA了5发差点怀疑人生).减法取模的话要记得+mod值再取模.
    附上代码

    #define LL long long
    #include <iostream>
    using namespace std;
    const int N = 3e5+10;
    const LL mod = 1e9+7;
    LL a[N],w[N];
    int main(){
        LL n;
        cin >> n;
        for(int i=1;i<=n;++i){
            cin >> a[i];
            a[i] = (a[i]+a[i-1])%mod;
        }
        for(int i=1;i<=n;++i)
            cin >> w[i];
        LL ans = 0,tmp = 0;
       	LL p1=1,p2=n;
    	for(int i=1;i<=n;i++){
    		tmp = ((tmp % mod) + (a[p2]-a[p1-1] + mod) % mod)%mod; 
            ans = ( ans + ( ( (tmp%mod) * (w[i]%mod) ) %mod ))%mod;
            p2--,p1++;
        }
        cout << ans << endl;
        
        return 0;
    }
    
    展开全文
  • ... 题意:给定长度为n的序列a和...分析:枚举a[i],以a[i]为起点,然后二分找终点(大区间满足条件的话小区间肯定也满足),依据起点和终点的位置能够出以a[i]为起点可满足条件的区间的个数。怎么推断区间是否满足条...

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5289

    题意:给定长度为n的序列a和一个整数K,找出最大值和最小值的差值小于K的区间。输出满足条件的区间的个数。

    分析:枚举a[i],以a[i]为起点,然后二分找终点(大区间满足条件的话小区间肯定也满足),依据起点和终点的位置能够算出以a[i]为起点可满足条件的区间的个数。怎么推断区间是否满足条件?能够用st算法用O(N*logN)方法进行预处理,然后O(1)查询区间最大值可最小值。先前用线段树查询超时了。。

    后来还看到别人用树状数组+二分也过了。

    还有的用队列写,或者直接线段树不二分。。。。

    代码:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    const int maxn = 2e5;
    int _max,_min,n,K;
    
    int MAX[100006][20],MIN[100006][20],a[100006];
    void Init()
    {
    	int i,j;
    	for(i=0;i<n;i++)
    		MAX[i][0]=MIN[i][0]=a[i];
    	for(j=1;(1<<j)<=n;j++)
    	{
    		for(i=0;i+(1<<j)-1<n;i++)
    		{
    			MAX[i][j]=MAX[i][j-1]>MAX[i+(1<<(j-1))][j-1]?MAX[i][j-1]:MAX[i+(1<<(j-1))][j-1];
    			MIN[i][j]=MIN[i][j-1]<MIN[i+(1<<(j-1))][j-1]?

    MIN[i][j-1]:MIN[i+(1<<(j-1))][j-1]; } } } bool ok(int L,int R) { int k=0; while((1<<(k+1))<=(R-L+1)) k++; _min=MIN[L][k]<MIN[R-(1<<k)+1][k]?MIN[L][k]:MIN[R-(1<<k)+1][k]; _max=MAX[L][k]>MAX[R-(1<<k)+1][k]?MAX[L][k]:MAX[R-(1<<k)+1][k]; return _max-_min<K; } int Find(int s) { int down=s+1,up=n-1,mid,ret=s; while(down<=up) { mid=(down+up)>>1; if(!ok(s,mid)) up=mid-1; else { down=mid+1; if(ret<mid) ret=mid; } } return ret; } int main() { int ncase,i,j; long long ans; scanf("%d",&ncase); while(ncase--) { scanf("%d%d",&n,&K); for(i=0;i<n;i++) scanf("%d",&a[i]); Init(); ans=n; for(i=0;i<n;i++) ans+=Find(i)-i; printf("%I64d\n",ans); } return 0; }



    展开全文
  • =区间长度。且区间内无重复元素。 首先可以对MAX的点pos,左右分治递归。 枚举离pos近的一段,利用题目关系出另一端的取值范围,进而加到ans上。就是启发式分治的套路了。 这一题也是一样,关键就是怎么快速...

    1011:

    启发式分治:

    又看到区间最大值,询问满足题意子区间个数,我们自然而然想到启发式分治。

    满足MAX-K<=区间长度。且区间内无重复元素。

    首先可以对MAX的点pos,左右分治递归。

    枚举离pos近的一段,利用题目关系算出另一端的取值范围,进而加到ans上。就是启发式分治的套路了。

    这一题也是一样,关键就是怎么快速算出另一端的取值范围。

    对于区间[L,R]

    假如从左边遍历:左端点L-pos。

    右端点取值范围至少是[pos,R],

    为了满足区间无重复元素,我们预处理,pre,nxt数组,表示当前结点向左,向右扩展的最大位置。

    所以右端点的位置最远更新为:min(nxt[i],R),必须在区间内,且无重复元素的最大扩展位置。

    为了满足区间长度>=a[pos]-K

    右端点位置最近更新为:max(i+a[pos]-K+1,pos),必须经过pos,且满足题意的最小扩展位置。

    如果最小和最大扩展位置符合逻辑,则更新ans,并且分治区间。

     

    假如从右边枚举,同上。

    枚举的一定是短的一边,所以复杂度是nlogn

    # //KX
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef double db;
    const int M= 3e5+7;
    int a[M],K;
    int mp[M];
    int pre[M],nxt[M];
    int lg[M],dp[M][30];
    ll ans=0;
    void RMQ(int n)
    {
    	for(int i=1;i<=n;i++)dp[i][0]=i;
    	for(int j=1;(1<<j)<=n;j++)//区间长度
    		for(int i=1;i+(1<<j)-1<=n;i++)//区间左端点 
    		{
    			dp[i][j]=a[dp[i][j-1]]>=a[dp[i+(1<<j-1)][j-1]]?dp[i][j-1]:dp[i+(1<<j-1)][j-1];
    		}
    }
    int qu(int L,int R)
    {
    	int k=lg[R-L+1];//快速找到长度对应的最大2次幂
    	return  a[dp[L][k]]>=a[dp[R-(1<<k)+1][k]]?dp[L][k]:dp[R-(1<<k)+1][k];
    }
    void cal(int L,int R)
    {
    	if(L>R)return;
    	int pos=qu(L,R);
    //	printf("--%d   %d   %d\n",L,R,pos);
    	if(pos-L<R-pos)
    	{
    		for(int i=L;i<=pos;i++)
    		{
    			int now=a[pos]-K;//区间长度必须大于NOW
    			int pr=min(R,nxt[i]);//满足区间无重复元素且在L-R内的最大取值
    			int ty=max(pos,i+now-1);//满足题意且经过pos的最小取值
    		//	printf("----------         i:%d   pr:%d   ty:%d\n",i,pr,ty);
    			if(pr<ty)continue;
    			ans+=pr-ty+1;
    		//	printf("--    %d\n",ans);
    		}
    	}
    	else
    	{
    		for(int i=R;i>=pos;i--)
    		{
    			int now=a[pos]-K;//区间长度必须大于NOW
    			int pr=max(pre[i],L);
    			int ty=min(pos,i-now+1);
    		//	printf("+++++++++      i:%d   pr:%d   ty:%d\n",i,pr,ty);
    			if(pr>ty)continue;
    			ans+=ty-pr+1;
    		//	printf("++    %d\n",ans);
    		}
    	}
    	cal(L,pos-1);
    	cal(pos+1,R);
    }
    int main()
    {
    	int n,t;
    	lg[0]=-1; 
    	for(int i=1;i<M;i++)lg[i]=lg[i>>1]+1;
    		cin>>t;
    	while(t--)
    	{
    		scanf("%d%d",&n,&K);
    		for(int i=1;i<=n;i++)
    			scanf("%d",&a[i]);
    		RMQ(n);
    		for(int i=1;i<=n;i++)mp[i]=0;mp[a[1]]=1;
    		pre[1]=1;
    		for(int i=2;i<=n;i++)
    		{
    			if(mp[a[i]]==0)
    				pre[i]=pre[i-1];
    			else
    				pre[i]=max(pre[i-1],mp[a[i]]+1);
    			mp[a[i]]=i;
    		}
    		for(int i=1;i<=n;i++)mp[i]=n+1;mp[a[n]]=n;
    		nxt[n]=n;
    		for(int i=n-1;i>=1;i--)
    		{
    			if(mp[a[i]]==0)
    				nxt[i]=nxt[i+1];
    			else
    				nxt[i]=min(nxt[i+1],mp[a[i]]-1);
    			mp[a[i]]=i;
    		}
    	/*	for(int i=1;i<=n;i++)
    			printf("%d %d\n",pre[i],nxt[i]);*/
    		ans=0;
    		cal(1,n);
    		printf("%lld\n",ans);
    	}
       	return 0;
    }
    
    
    
    

     

    展开全文
  • NOIp 膜你赛 第二场

    2020-12-03 07:41:19
    如果求每个数包含在多少个区间内,这个好就是左边的长度和右边的长度乘起来,不过现在要求的还有区间长度,找一下规律(用纸画) 假设 n=7n = 7n=7 显然它左右是对称的,贡献是一样的,那么我们看看前半部分 n=1{1...
  • 第十二周 5.16 --- 5.22

    2016-05-17 23:10:00
    只想到如果一个区间长度为 x 的话,需要 x-1次操作 然后一直想环形转成线形要怎么做... 看题解. 可以考虑成 k 个区间 每个区间的和都为 0 那么 需要 n-k次 只要 k 最大 暴力前缀和,如果碰到一次前缀和相等的...
  • Wannafly挑战赛4

    2019-10-07 12:26:46
    给一个数列,这个数列中所有区间长度在[L,R]之间并且为偶数的异或和之和 分析 卡我两天啊,一直都不知道怎么算,看了代码模拟出这种方法才想明白 切入点:按位(二进制位)考虑贡献,枚举每个区间的右端点,我们...
  • CSPS模拟 44

    2019-10-04 20:49:55
    状态不是很好吧  这套和前边是一套的, ... T1 区间$gcd$乘区间长度的最大值  暴力是$n^3logn$的,考虑怎么替代$n^2$的无用计算量  考虑了很久数据结构最后爆闭了  最后祭出yzh讲的,无脑分治...
  • 题目 传送门:QWQ ...首先我们要把原图的逆序对q出来。...设$ t=r-l+1 $即为区间长度 那么区间数对数量(看好是所有数对,不是逆序对)的数量就是$ k =\frac{n\times(n-1)}{2} $ 方法是我...
  • 题意 一个长度为mmm的序列 有nnn种数字,告诉你第iii种数字出现的区间为[l,r][l,r][l,r] 然后问你有多少个区间,满足这...但是这里有一个问题,就是出现过的数字的异或和怎么算 通过乱搞,我们发现 这个区间里...
  • 题目在这 考虑暴力做法:从小到大枚举亲密度,出各个亲密度下有多少对数,然后相加直到为k。时间复杂度为O(n ^ 2) ...=mid的对数,因此,可以枚举长度为mid 的区间。使用双指针算法,左指针为l,右指针为r,每次右指
  • CS Binary Differences

    2018-03-01 16:36:42
    序列长度1e5,这道题说实话想了很长时间,不知道怎么降复杂度,后来看题解才明白,最重要的是只有01两种数,所以我们计算前缀和,出的肯定是连续的区间,比如说{1,1,1,1,0,0,1}出的前缀和是{-1,-2,-3,-...
  • CF547E 二分+sa+主席树

    2020-06-05 09:14:26
    那么我们知道这个区间后,怎么知道询问要求的区间有多少个是落在能够使用的区间呢? 这就是可以利用主席树。我们让rk为权值去建立主席树,然后按字符串长度的顺序去插入,然后询问的时候我们就可以直接询问主席树上...
  • 大概就是你可以对一个长度为2k的区间(k一定要是2的幂,题目给了一个k的上界),挑中间一段长为k的或者两端各一段长度和为k,让他们区间-1,然后以2k为循环节对这个序列操作,这一次操作,问将整个序列变成相同的...
  • 观察到ccc不是很大,我们可以出相邻两个串满足第一个串比第二个串字典序小的可行区间,最后取这些区间的并集就可以答案。 可行区间怎么求呢?我们找到第一个不一样的位置(如果没有就比较长度),这样只用考虑两...
  • 单点查询区间修改 分块一种数据结构? 不知道 但是数据结构能做的题基本都能做 就是效率的问题 根号和log怎么比 第一道分块 分块的思想就是对整个序列分成若干块 每次操作只修改每整个块 对于两端块外的元素暴力...
  • HDU 6194 后缀数组

    2017-09-14 20:00:00
    连续 k 次,说明这 k 个后缀排序后在一起,每次枚举 长度的为 k 的区间,用RMQ出最长公共前缀长度,这里就有 len 个子串是 符合满足 k 次的,但是又有可能过短而不止出现了 k次,那么有多少呢? 那么就是 a 不...
  • 思路:还是扫描线,不过线段树中多存了一个变量,ss表示的是覆盖过至少两次的面积,他是怎么算出来的呢?首先我们的线段树里有一个cnt变量如果他不等于0就表示他的区间被完全覆盖,那么当他的cnt&gt;1就表示他被...
  • 给出一个长度为nn的数列an{a_n},一个区间[l,r][l,r]的和定义为其中的数字之和,相同的数字不重复 求第k大的和 题解 首先怎么求一个区间的和.对于aia_i维护它之前最近的与它相同的数的位置pre[ai]pre[a_i] ...
  • 这个东西和最长上升子序列很像 考虑如果已经知道每个位置为开头的LIS长度和个数 f[i],我可以扫一遍 判断这个个数和K的大小,找到第...那这玩意怎么求呢,离散化一下 出每个数能跳到的下一个数的大小的区间 倒着...
  • 1004: 题意:给定你一个为1到n的排列,对于这个序列的每一个不为空的子序列,都会存在一个最大值和最小值,然后...贡献怎么算呢,每一个位置i的数aia_iai​单调栈维护这个数作为最小值和最大值的左右区间端点。最大和
  • 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质因数,由于不同的质因数只一次,所以...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

区间长度怎么算