精华内容
下载资源
问答
  • 什么是分数组?

    2020-06-15 14:11:14
    对于已知有n个元素的数列d,建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]。 性质 计算数列各项的值。 例如,d[2] = f[1] + f[2] = d[1] + d[2] - d[1...

    定义

    对于已知有n个元素的数列d,建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]

    性质

    计算数列各项的值。

    例如,d[2] = f[1] + f[2] = d[1] + d[2] - d[1] = d[2],即数列第i项的值可以由差分数组的前i项的和计算。

    计算前缀和。

    i项的值可以由差分数组的前i项计算。那么数列的前缀和即可以表示为:
    在这里插入图片描述

    用途

    处理区间内的加减操作

    对于数列中区间[l,r]内的数字加上x,那么对于差分数组而言,f[l] += xf[r+1] -= x,其余均不变。
    例如,数列为2, 1, 1, 1, 8,则其对应的差分数组为2, -1, 0, 0, 7,当区间[2, 4]内的元素增加x时,数列变为2, 1+x, 1 + x, 1 + x, 8,而差分数组变为2, x - 1, 0, 0, 7 - x

    区间和

    由前缀和的性质可以得到前缀和数组sum,那么区间[l, r]内的元素和即为sun[r] - sum[l - 1]

    参考博客

    https://www.cnblogs.com/COLIN-LIGHTNING/p/8436624.html

    展开全文
  • 2009-04-03C语言输入3个字符串,用指针从小到大输出下面代码,请LZ参考:main(){char *a=" ";char *b=" ";char *c=" ";char *d=" ";clrscr();gets(a);gets(b);gets(c);if (strcmp(a,b) > 0){d=a;a=b...

    f82ad4c60bce80b27096addb8e145b85.png

    2009-04-03

    C语言输入3个字符串,用指针从小到大输出

    下面代码,请LZ参考:

    main()

    {

    char *a=" ";

    char *b=" ";

    char *c=" ";

    char *d=" ";

    clrscr();

    gets(a);

    gets(b);

    gets(c);

    if (strcmp(a,b) > 0)

    {

    d=a;a=b;b=d;

    }

    if (strcmp(a,c) > 0)

    {

    d=a;a=c;c=d;

    }

    if (strcmp(b,c) > 0)

    {

    d=b;b=c;c=d;

    }

    puts(a);

    puts(b);

    puts(c);

    getch()...全部

    下面代码,请LZ参考:

    main()

    {

    char *a=" ";

    char *b=" ";

    char *c=" ";

    char *d=" ";

    clrscr();

    gets(a);

    gets(b);

    gets(c);

    if (strcmp(a,b) > 0)

    {

    d=a;a=b;b=d;

    }

    if (strcmp(a,c) > 0)

    {

    d=a;a=c;c=d;

    }

    if (strcmp(b,c) > 0)

    {

    d=b;b=c;c=d;

    }

    puts(a);

    puts(b);

    puts(c);

    getch();

    }

    下面的代码是使用内存分配函数与释放函数,当然声明三个数组也可以,将指针指向数组即可。

    #include

    main()

    {

    char *a=(char *)malloc(100);

    char *b=(char *)malloc(100);

    char *c=(char *)malloc(100);

    char *d;

    clrscr();

    gets(a);

    gets(b);

    gets(c);

    if (strcmp(a,b) > 0)

    {

    d=a;a=b;b=d;

    }

    if (strcmp(a,c) > 0)

    {

    d=a;a=c;c=d;

    }

    if (strcmp(b,c) > 0)

    {

    d=b;b=c;c=d;

    }

    puts(a);

    puts(b);

    puts(c);

    free(a);

    free(b);

    free(c);

    getch();

    } 。

    收起

    展开全文
  • 分数(continued fraction)特殊繁分数。 有其神奇的魅力。看了你就会明白许多古典问题,古代数学家如何求解的。这些问题包括:圆周率的近似值、百鸡问题、历法周期等。它会告诉你为什么农历19年7闰。 用它...
  • 就是上面所给的原始数组的相邻元素之间的差值,我们令 d[i]=a[i+1]-a[i],一遍for循环即可将差分数组求出来。 下面给你一个栗子,给出一个差分数组先 差分数组怎么求 其实差分数一个辅助数组,从侧面...

    差分数组是个啥

    差分数组很明显就是个数组呗,,,

    本菜鸡学的比较浅,先说一下我自己认识的差分数组吧!

    先解释一下什么是 差分:

    差分其实就是数据之间的差,什么数据的差呢?就是上面所给的原始数组的相邻元素之间的差值,我们令 d[i]=a[i+1]-a[i],一遍for循环即可将差分数组求出来。

    下面给你一个栗子,给出一个差分数组先

    差分数组怎么求

    其实差分数组是一个辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作

    还是上面那个表里的栗子,我们需要进行以下操作:

    1、将区间【1,4】的数值全部加上3

    2、将区间【3,5】的数值全部减去5

    很简单对吧,你可以进行枚举。但是如果给你的数据量是1e5,操作量1e5,限时1000ms你暴力枚举能莽的过去吗?T到你怀疑人生直接。这时我们就需要使用到差分数组了。

    其实当你将原始数组中元素同时加上或者减掉某个数,那么他们的差分数组其实是不会变化的。

    利用这个思想,咱们将区间缩小,缩小的例子中的区间 【1,4】吧这是你会发现只有 d[1]和d[5]发生了变化,而d[2],d[3],d[4]却保持着原样,

    在进行下一个操作,

    这时我们就会发现这样一个规律,当对一个区间进行增减某个值的时候,他的差分数组对应的区间左端点的值会同步变化,而他的右端点的后一个值则会相反地变化,其实这个很好理解

    其实也就这么一点代码就ok了

    while(m--){//操作次数
    	cin>>left>>right>>change;//左右端点及其变化的值
    	d[left]+=change;
    	d[right+1]-=change;
    }

    差分数组能干啥

    既然我们要对区间进行修改,那么差分数组的作用一定就是求多次进行区间修改后的数组喽

    注意 只能是区间元素同时增加或减少相同的数的情况才能用

    因为我们的差分数组是由原始数组的相邻两项作差求出来的,即 d[i]=a[i]-a[i-1];那么我们能不能反过来,求得一下修改过后的a[i]呢?

    直接反过来即得  a[i]=a[i-1]+d[i] 

    事实证明这是正确的,具体证法就不再推广,有空再补上吧;

    更新数组a的方式则是下面的那一点点代码,这样我们就求出来了更新后的数组 a,是不是比线段树快多了呢?

    for(int i=1;i<=n;i++)
        a[i]=a[i-1]+b[i];

    差分数组怎么用

    翻来覆去还是那句,区间修改,当然了,有时候要结合树状数组来使用。直接看题目吧

    HDU-1556 Color the Ball  http://acm.hdu.edu.cn/showproblem.php?pid=1556

    这个题果的不能再果了吧,看懂上面的,闭着眼也能敲出来

    直接附上代码吧

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int mm=1e5+10;
    
    int a[mm],b[mm];
    int x,y;
    int main()
    {
        int n;
        while(scanf("%d",&n)&&n){
            mem(a,0);
            mem(b,0);
            for(int i=1;i<=n;i++){
                scanf("%d%d",&x,&y);
                b[x]++;
                b[y+1]--;
            }
            for(int i=1;i<=n;i++)
                a[i]=a[i-1]+b[i];
           
            for(int i=1;i<n;i++)
                printf("%d ",a[i]);
            printf("%d\n",a[n]);
        }
        return 0;
    }

    再看下一个稍微进阶一点的题目

    POJ -3263 Tallest Cow  http://poj.org/problem?id=3263

    这道题他要你求出每头牛的最大可能的高度,我们的思路就是先让所有的牛都和最高的一样高,关于他给到的牛能看到的区间进行修改,让中间的数至少减一,注意这里修改的一定是开区间,区间端点不能修改。再一个就是关于去重问题。。。谁会想到他还有这么一个坑呢????

    只要看透了是个差分也很简单,代码附上

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int mm=1e4+10;
    
    int a[mm],b[mm];
    int vis[mm][mm];
    int main()
    {
    	int n,pos,h,r;
    	scanf("%d%d%d%d",&n,&pos,&h,&r);
    	for(int i=0;i<=h+1;i++)
    		a[i]=h; 
    	int x,y; 
    	for(int i=1;i<=r;i++){
    		scanf("%d%d",&x,&y);
    		if(x>y) swap(x,y);// 
    		if(vis[x][y])//判重 
    			continue;
    		vis[x][y]=1;
    		b[x+1]--;//后面的减少 
    		b[y]++;//前面的增加 
    	}
    	for(int i=1;i<=n;i++){
    		a[i]=a[i-1]+b[i];
    		printf("%d\n",a[i]);
    	} 
    	return 0;
    }

    今天测试碰到了一个二阶的差分题,我居然不会,用一阶差分直接被T了就很难受,听了旁边的大佬才知道,可以用两个差分来做,膜拜一下Orz

    CodeForces - 296C  Greg and Array? 

    https://cn.vjudge.net/problem/CodeForces-296C

    首先说一下,这道题的题意吧,反正我一开始模拟了半年也没看懂,太难受了。

    这道题意的坑在于那k个询问:

    其实他给的k个询问并不是直接让你修改的区间,而是一个问题编号的区间,他给的[L,R]是告诉你要执行编号为 L~R 的操作

    这就告诉我们要把问题存起来先,也算是一个离线操作吧。

    这道题显然可以使用线段树,但是我觉得要打好多行代码,就选择了刚学的差分,我是用一阶差分做的,直接两层大循环,然后T死,这里有个代码,来纪念一下我自己被T惨的下场,不具备参考价值 嘻嘻嘻。https://paste.ubuntu.com/p/zzSr63cM5J/

    这时我们就需要 用两个差分,第一个差分来维护要进行的操作的区间端点,就是那K个询问,这是有点难受的,反正我一上来没有想到,是旁边的大佬偷偷告诉我的,第二个差分就是来维护我们的原始数组,进行修改,修改的方法可以往上看↑↑↑↑↑↑

    下面是可以参考的代码了:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int inf=0x3f3f3f3f;
    const ll mm=1e5+10;
    
    ll a[mm],d[mm];
    ll op[mm][5];
    ll n,m,k;
    ll cnt[mm];
    ll num[mm];
    int main()
    {
    	cin>>n>>m>>k;
    	for(ll i=1;i<=n;i++)
    		cin>>a[i];
    	for(ll i=1;i<=n+1;i++)
    		d[i]=a[i]-a[i-1];	
    
    	for(ll i=1;i<=m;i++)
    		cin>>op[i][1]>>op[i][2]>>op[i][3];
    		
    	ll x,y;
    	while(k--){//lixian
    		cin>>x>>y;
    		cnt[x]++;
    		cnt[y+1]--;
    	}
    	
    	for(int i=1;i<=m;i++)
    		num[i]=num[i-1]+cnt[i];
    	for(ll i=1;i<=m;i++){
    		d[op[i][1]]+=op[i][3]*num[i];
    		d[op[i][2]+1]-=op[i][3]*num[i];
    	}
    	
    	for(ll i=1;i<=n;i++)
    		a[i]=a[i-1]+d[i];
    	for(ll i=1;i<=n;i++)
    		cout<<a[i]<<' ';
    //	cout<<a[n]<<endl;
    
    	return 0;
    }

    还有一道高阶题目:

    POJ 3468-A Simple Problem with Integers   http://poj.org/problem?id=3468

    这个题也果的一批,让你进行区间修改与区间求和查询,刚学线段树的时候用线段树写的,那是一个受罪啊,也就写了两千多个字符吧,是真的累。。。下面是一片关于这道题线段树解法的blog

    https://blog.csdn.net/qq_44786250/article/details/98474701

    这里我们讲一个高深一点的做法,那就是差分。但是有一点,差分对区间修改好用,但是区间求和还是需要暴力啊,依旧让你TTT这就是这道题的高深之处了,那就是结合树状数组,差分负责区间修改,树状数组进行区间求和,下面的代码也就888个字符,不过有点费脑,或许用的多了就好了吧!

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    const int inf=0x3f3f3f3f;
    const ll mm=1e5+10;
    
    ll n,m;
    ll a[mm],b[mm],c[mm];
    ll sum[mm];
    
    ll lbt(int x){
    	return x&-x;
    }
    
    void update(int pos,int k){
    	for(int i=pos;i<=n;i+=lbt(i)){
    		b[i]+=k;
    		c[i]+=k*(pos-1);
    	}
    }
    
    ll getsum(int pos){
    	ll res=0;
    	for(int i=pos;i>0;i-=lbt(i)){
    		res+=pos*b[i]-c[i];
    	}
    	return res;
    }
    
    int main()
    {
    	scanf("%lld%lld",&n,&m);	
    	for(ll i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		sum[i]=sum[i-1]+a[i];
    	}			
    	char op[2];
    	ll x,y,z;
    	while(m--){
    		scanf("%s",op);
    		if(op[0]=='Q'){
    			scanf("%lld%lld",&x,&y);
    			printf("%lld\n",sum[y]-sum[x-1]+getsum(y)-getsum(x-1));
    		}
    		else {
    			scanf("%lld%lld%lld",&x,&y,&z);
    			update(x,z);
    			update(y+1,-z);	
    		}	
    	}
    	return 0;
    }

     

    展开全文
  • 01分数规划

    2021-03-23 19:51:00
    什么是01分数规划: 给定n个a[i]和b[i],a[i]和b[i]绑定在一起要选同时选,求sum(a[i]) 除以 sum(b[i]) 的最大值,sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n],x为bool型只取0或者1,表示不选或者选,...

    参考文章

    01分数规划

    什么是01分数规划:
    给定n个a[i]和b[i],a[i]和b[i]绑定在一起要选同时选,求sum(a[i]) 除以 sum(b[i]) 的最大值,sum为求和函数
    对于这种问题我们可以多定义一个数组x[1…n],x为bool型只取0或者1,表示不选或者选,则对于每个x[1…n]的答案为:
    在这里插入图片描述
    那么这类问题称之为01分数规划问题

    解决方法:

    在这里插入图片描述

    题目要求选几个,只需要根据d[i]的大小来选就可以了
    ans则可以通过二分x来求,判断条件
    f(x) = 在这里插入图片描述

    如果max(f(x))>0,则x < ans
    如果max(f(x))<0,则x > ans

    二分一个x时,每个d[i]都可以求出,现在的目标就是找到一组{xi}使得d[i] * xi最大(即求max{f( r )})。
    如何找到这一组{xi},可以直接求得max{f( r )},也可以借助最短路算法判断是否存在负环

    问题模型2 最优比率生成树

    一个带权无向图G,n个节点,对于图中每条边ei,都有valuei和costi,现在求一颗生成树T,最大(小)化 ∑value[i]/ ∑ cost[i],ei ∈ T

    解决方法:

    01分数规划模型,如果ei∈T则xi = 1 否则 xi =0
    二分答案r
    如何验证答案r?
    边赋权ans[i] = value[i] - r * cost[i]
    因为是生成树,边的数量确定,那么max{f( r )}需要取前n-1大的ans[i],也就是求最大生成树,按最大生成树权值的正负性来二分,最小化就是求最小生成树

    最优比率环

    给定有点权和边权的图,求一个环,使得环的点权和与边权和的比值最大

    解决方法:

    还是套用01分数规划模型,点权为value[i],边权为cost[u],一个环为C,问题要求最大化 在这里插入图片描述
    在这里插入图片描述
    最小化就是符号倒过来
    和之前一样处理,设当前答案为r,设边权为dis[i] = r * ∑cost[i] - ∑value[i]
    如果r < r *,则说明至少存在一个环,d[i] < 0,也就是存在负权回环,边权值并不是提前算好,而是在更新路径的时候从哪个点访问到这个边的就将这条边设为相应点权与边权的对应值
    如果r > r * ,则不存在负环
    判负环一半用spfa,方法:一个点不能入队n次,否则有负环;一条最短路径长度不能到n,否则有负环。貌似后者更快

    例题:

    [POJ2976]Dropping tests
    [POJ2728]Desert King
    [POJ3621]Sightseeing Cows

    展开全文
  • 分数组浅谈

    2018-11-08 17:13:00
    什么是分数组? 定义 对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1] 简单性质 原数组的第i项为差分数组的前i...
  • bzoj 3450 期望分数

    2015-06-15 21:33:00
    自己只能想到O(n^2)的: dp[i][j] 表示 以i结尾,长度为j的o串的...推的时候它用d[i]*d[i]-d[i-1]*d[i-1]来算新增的贡献,有点不明白为什么可以这样(平方的期望应该不等于期望的平方才对吧). 哪天问问jason_yu. 这...
  • 其实差分数一个辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改的操作。 二、相关例题 此类题目比较简单,只需要注意边界的位置即可。 1. leetcode 1094 【解题思路】 遍历trips数组构造...
  • 看字你就应该知道,差分数组存的是什么了,即存的是每一项与前一项的差值。 例如这里有 A[] 数组: A[] = 0 1 3 8 4 5 7 ( 下标从 0 开始,A[0] 为 0 ) 根据 D[i] = A[i] - A[i-1],我们可以得到 D[] 数组: D...
  • 先说说什么是分数组,我在网上没找到有关差分数组的详细介绍,我就说说我对差分数组的理解  对于一个数组a[N],其差分数d[i]=a[i]-a[i-1] (i&gt;0)且d[0]=a[0](这本人对差分数组的理解,如有错误欢迎...
  • 小多米第一次报名参加社区活动,第二天一大早,她就去接受记录分数的培训了。 下午,小多米回到家,没有了出门时的兴高采烈,脸上多了些愁容。问了才知道,原来记分规则她听明白了,但是总分怎么算还不知道。 ...
  • 什么是迭代加深搜索:  对于深度d比较大的情况,深度优先搜索需要很长的运行时间,而且还可能得不到解答。一种比较好的问题求解方法对搜索树的深度进行控制,即有界深度优先搜索方法。有界深度优先搜索过程总体...
  • 什么是GPA,应如何计算? 返回申请文书 GPA英语全称grade point average,意思就是平均分,美国的GPA满分4分,即A=4,B=3,C=2, D=1.GPA的精确度往往达到小数点后1到2位,如:3.0,3.45。GPA的计算一般将每...
  • 讨论群里有人提起追赶法,于是就搜到了这个题,最后还是没弄明白什么是追赶法…… Zoj上这题的测试数据更强些。 题意:给出一个数字x和一个范围,在这个范围内找两个数字,使它们的商最接近x。 思路一:直接枚举...
  • 本题一道分数规划题目。 建立新图,对于u,v,a,b,c,du,v,a,b,c,du,v,a,b,c,d,考虑从uuu到vvv连一条权值为b+db+db+d的边,代表扩大流量的额外花费,从vvv到uuu连一条权值为a−da-da−d的边,代表缩小流量的额外花费...
  • 实验4-1-6 求分数序列前N项和 本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子前一项分子与分母的和,分母前一项的分子....
  • %d):\n", COURSE_NUM);  scanf("%d", &m);  ReadScore(num, name, score, n, m);  break;  case 2:  AverSumofEveryCourse(score, n, m);  break; ...
  • }//统计各个分数段的学生数量 printf("比率分别为%f %f %f %f",(float)a[0]/n,(float)a[1]/n,(float)a[2]/n,(float)a[3]/n); return 0; } ``` ```![图片说明]...
  • 最后比较两个小孩的分数(假设两个人都发挥最佳),如果分数相等输出“tie”,否则输出赢得人的名字。 思路 (这道题我第一次完整的用优先队列做的ac题,超开心~~) 首先为什么会想到用优先队列 。 这里补充下优先...
  • string dbPath = @"D:\历年高考分数.db"; string sq = @"Data Source=" + dbPath; m = new SQLiteConnection(sq); m.Open(); SQLiteDataAdapter mAdapter = new SQLiteDataAdapter("select para1,para2,...
  • printf("分数: %lf \n",p->point); } } void showMenu() { int num; while(num!=3) { printf("1. 管理员登录\n"); printf("2. 用户入口\n"); printf("3. 退出系统\n"); printf("请...
  • 很多人还不清楚FCRP-D认证是什么。FCRP-D认证是FineReport项目交付能力认证证书,针对的是需要做项目的人员。以下是一位0基础,从0开始学习FineReport,到考取FCRP-D认证的用户分享,涵盖了很多学习方法、学习经验,...
  • 这个真是xjb贪心,完全不知道为什么回 过。我这么搞得: 最好的名次第一毋庸置疑。 然后,两组分数进行排序,一个升序,一个降序。之后进行匹配,尽量 将第一组最小的和第二组最大的结合来算第一次最坏名次,这...
  • 即在正整数集合中 第K小的且未出现的数字是什么 思路 先分析 数据范围 很大 需要O(n) 或者 nlogn 的级别 差分求出 每个区间的有多少数 然后?求前缀和 ? 然后还得标记回去 ? 不会Emmmm , 卡死了 正解 我们可以...
  • Codeforces 1163D DP + KMP

    2019-05-11 21:33:00
    题意:给你一个字符串s,...设dp[i][j][k]为到s串的i位置,s1的匹配长度i,s2的匹配长度j的情况下可以获得的最多分数。那么我们需要枚举这一位填什么字符,然后转移到下一个状态,所有以我们需要对s1和s2预处理一...
  • string dbPath = @"D:\历年高考分数.db"; string sq = @"Data Source=" + dbPath; m = new SQLiteConnection(sq); m.Open(); SQLiteDataAdapter mAdapter = new SQLiteDataAdapter("select ('select yxlc,...
  • HAPPY_国庆大礼包-D

    2019-10-12 16:04:31
    不知道差分是什么的看这里 #include<cstdio> #include<cstring> #include<algorithm> #define maxn 200000 using namespace std; typedef long long ll; ll num[maxn]...
  • d-virusss.github.io-源码

    2021-05-03 01:26:36
    现代化:使用最新的最佳做法和技术,在Google Chrome浏览器的审核中获得近乎完美的分数。 移动优先:旨在在大屏幕和小屏幕(移动)设备上看起来都很棒。 高度可定制的:许多个性化设置,例如更改背景颜色/图像,...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 163
精华内容 65
关键字:

d是什么分数