精华内容
下载资源
问答
  • 怎么把所有儿子的李超树的信息合并起来呢?也非常熟悉,用线段树合并即可。 (为了写这篇题解,我还专门水写了两者的博客????) 由于每个儿子的直线数加起来不超过n,线段树合并总复杂度不超过,由于李超树插入的...

    题面

    题解

    dp_i表示从i开始旅行的最大有趣度,从上面的简化题意中可知,该值只与相邻两处景点有关,于是有:

    d_i为从1到i的路径长度,把dis(u,v)化成d_v-d_u,可以得出

    观察一下发现,每个点v可以看作一条直线y=b_vx+dp_v-b_vd_v,然后查询所有直线在x=a_u+d_uy的最大值。

    这个问题非常熟悉,可以用李超树解决。怎么把所有儿子的李超树的信息合并起来呢?也非常熟悉,用线段树合并即可。

    (为了写这篇题解,我还专门写了两者的博客😥)

    由于每个儿子的直线数加起来不超过n,线段树合并总复杂度不超过O(nlogn),由于李超树插入的是直线,每次复杂度O(logn)

    总复杂度O(nlogn)

    代码

    这绝对是这题最短的代码之一(80行)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<ctime>
    #include<vector>
    #define ll long long
    #define MAXN 1000005
    #define INF 0x7f7f7f7f
    #define R 2000000000ll
    using namespace std;
    inline ll read(){
    	ll x=0;bool f=1;char s=getchar();
    	while((s<'0'||s>'9')&&s>0){if(s=='-')f^=1;s=getchar();}
    	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+s-'0',s=getchar();
    	return f?x:-x;
    }
    int n,IN,root[MAXN];
    ll a[MAXN],b[MAXN],d[MAXN],ans[MAXN];
    struct itn{
    	int v;ll w;
    	itn(){}
    	itn(int V,ll W){v=V,w=W;}
    };
    vector<itn>G[MAXN];
    struct lcs{  //动态开点李超树
    	int ls,rs;ll k,b;lcs(){}
    	lcs(ll K,ll B){ls=rs=0,k=K,b=B;}
    }t[MAXN<<4];
    inline void add(int x,ll l,ll r,ll k,ll b){
    	if(x==0)return;
    	ll tk=t[x].k,tb=t[x].b,mid=(l+r)>>1;
    	if(l*k+b>=l*tk+tb&&r*k+b>=r*tk+tb){t[x].k=k,t[x].b=b;return;}
    	else if(l*k+b<l*tk+tb&&r*k+b<r*tk+tb)return;
    	else{
    		if(!t[x].ls)t[x].ls=++IN,t[IN]=lcs(tk,tb);
    		else add(t[x].ls,l,mid,tk,tb);
    		if(!t[x].rs)t[x].rs=++IN,t[IN]=lcs(tk,tb);
    		else add(t[x].rs,mid+1,r,tk,tb);
    		t[x].k=k,t[x].b=b;
    	}
    }
    inline int mergg(int x,int y,ll l,ll r){
    	if(!x||!y)return x|y;
    	ll mid=(l+r)>>1;
    	t[x].ls=mergg(t[x].ls,t[y].ls,l,mid),t[y].ls=0;
    	t[x].rs=mergg(t[x].rs,t[y].rs,mid+1,r),t[y].rs=0;
    	add(x,l,r,t[y].k,t[y].b);
    	return x;
    }
    inline ll sch(int x,ll l,ll r,ll g){
    	if(x==0)return -INF;
    	ll mid=(l+r)>>1,res=g*t[x].k+t[x].b;
    	if(g<=mid)res=max(res,sch(t[x].ls,l,mid,g));
    	else res=max(res,sch(t[x].rs,mid+1,r,g));
    	return res;
    }
    inline void dfs(int x,int fa,ll dx){
    	d[x]=dx,root[x]=++IN,t[IN]=lcs(0,-INF);
    	for(int i=0;i<G[x].size();i++)
    		if(G[x][i].v!=fa){
    			int v=G[x][i].v;ll w=G[x][i].w;
    			dfs(v,x,dx+w),root[x]=mergg(root[x],root[v],0,R);
    		}
    	ans[x]=max(0ll,sch(root[x],0,R,a[x]+d[x]));
    	add(root[x],0,R,b[x],ans[x]-b[x]*d[x]);
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)a[i]=read(),b[i]=read();
    	for(int i=1;i<n;i++){
    		int u=read(),v=read();ll w=read();
    		G[u].push_back(itn(v,w)),G[v].push_back(itn(u,w));
    	}
    	dfs(1,0,0);
    	for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
    	return 0;
    }

     

    展开全文
  •   关于一对多数据展示,有的解决方式时通过定义个表格的形式来呈现他们的关系,一个表格显示主表数据,另一个表格显示主表中某数据关联的明细表数据,这样虽然也可以实现一对多数据的展示,但我觉得这样并不是...

      前言:
      关于一对多数据展示,有的解决方式时通过定义两个表格的形式来呈现他们的关系,一个表格显示主表数据,另一个表格显示主表中某条数据关联的明细表数据,这样虽然也可以实现一对多数据的展示,但我觉得这样并不是最好的。就我所知道的缺点有一下三个:

    1. 两个表格数据,需要请求两次服务器获取数据信息
    2. 两个表格需要占用的UI面积过多
    3. 如果两个表格都涉及到较多操作,操作起来略显麻烦

      通过上面所说的我们了解到,应该尽量使用一个表格来实现这种包含一对多数据的数据展示。那么接下来看看我是怎么实现这种数据展示的。使用的前端框架为Lauyui,我尽量说的详细点,基础OK的朋友可以跳过。

      合并前的思路: 单元格合并需要在有数据的情况下发生,所以需要在表格定义中的数据渲染完的回调方法(done)配置项中执行合并单元格操作。首先需要定义两个数组(需要合并的列对应的字段名称组成的数组,每个字段在表头中的索引位置组成的数组),然后把表格对象以及表格数据跟两个数组一起传入到合并单元格方法中执行合并。
      合并的思路: 定义两个标准,一个代表参考对象的标准索引,另一个代表需要合并的标准行数。
    刚进入合并方法时所以标准为0,行数标准为1。然后进行循环,在循环中获取到当前循环的那一行数据和标准索引对应的那一行数据, 判断他们在索引数组中某一索引对应的列的数据是否相同。相同则标准行数+1同时在标准索引对应的那一行添加rowspan属性设置合并,并且隐藏当前循环的那一行,如此往复,如果与标准索引对应的那一行中的某列数据不相同则不添加rowspan,同时把标准索引改为当前循环的那一行的索引还有标准行数改为1。
      点击选中 / 取消选中的思路: 上面在合并单元格时在我给他们每行都添加了一个类(ok什么的),这个类将充当判断哪些需要设置/取消选中样式的依据。在复选框点击监听中调用设置点击效果的方法,传入这个表格所有行对象以及一个标志(ok+点击的这一行的数据唯一标识ID)和选中状态。。然后在设置选中效果方法中循环判断每一行,类中有该标志的根据选中状态来添加或移除选中效果。

      下面是所有代码,引入了哪些插件就不用说了吧,jq是必不可少的,Layui 模板引入嫌麻烦的可以直接引入包含全部模板的那个插件。首先加载Layui的table模板,并进行表格初始化,我这里需要进行条件查询所以我写了个表格重载的方法方便查询时调用。

    //初始化layui模板
    layui.use(['layer'], function () {
    	//初始化表格模板
    	var table = layui.table; 
        //初始化订单信息表格
        table.render({
            id: "order",
            elem: "#order",
            method: 'post',
            data: [],
            page: true,
            cols: [[
    		   {type: 'numbers'},//序号列
    		   {title: '订单ID', type: 'checkbox', field: 'sellOrderId', hide: true, unresize: true},
    		   {title: '订单单号', field: 'sellNumber', align: 'center', width: '12%', unresize: true},
    		   {title: '订单时间', field: 'sellTime', align: 'center', width: '10%', unresize: true},
    		   {title: '订单金额', field: 'paymentMoney', align: 'center', unresize: true},
    		   {title: '收货地址', field: 'shippingAddress', align: 'center', unresize: true},
    		   {title: '商品名称', field: 'commodityName', align: 'center', width: '27%', unresize: true},
    		   {title: '颜色', field: 'colorName', align: 'center', unresize: true},
    		   {title: '尺码', field: 'sizeName', align: 'center', unresize: true},
    		   {title: '数量', field: 'detailNum', align: 'center', unresize: true},
    		   {title: '商品金额', field: 'sellMoney', align: 'center', unresize: true}
    		]],
            height: 'full-335'
        });
        //监听表格行单击事件
        table.on('row(order)', function (obj) {
            obj.tr.find('div.layui-unselect.layui-form-checkbox')[0].click();//点击选中单选框
        });
        table.on('checkbox(order)', function (obj) {
            if (obj.checked) {
              obj.tr.addClass('layui-bg-blue'); //添加选中样式
            } else {
                obj.tr.removeClass('layui-bg-blue'); //移除选中样式
            }
            //设置点击效果
            trLinkageClick($(obj.tr.parent()[0]).children(), "ok" + obj.data.sellOrderId, obj.checked);
        });
        //查询表格数据的方法
        tbOrderSearch();
    });
    //查询表格数据的方法
    function tbOrderSearch() {
        var startDate = $("#orderCondition [name='startDate']").val().trim();
        var endDate = $("#orderCondition [name='endDate']").val().trim();
        var state = $("#orderCondition [name='state']:checked").val().trim();
        var paymentType = $("#orderCondition [name='paymentType']").val().trim();
        var address = $("#orderCondition [name='address']").val().trim();
        table.reload("order", {
            loading: true,
            url: '......',
            where: {
                startDate: startDate,
                endDate: endDate,
                state: state,
                paymentType: paymentType,
                address: address
            },
            done: function (res, curr, count) {
            	//定义需要合并的列的对应的字段名称数组
                var columnsName = ['sellOrderId', 'sellNumber', 'sellTime', 'paymentMoney', 'shippingAddress'];
                //定义每个字段在表头中的索引位置的数组,索引从0开始
                var columnIndex = [1, 2, 3, 4, 5];
                //合并单元格方法
                mergeCells(this, res.data, columnsName, columnIndex);
            }
        });
    }
    
    /**
     * 合并单元格方法
     * @param table layui表格对象
     * @param data 表格数据
     * @param columnsName 需要合并的列名称数组
     * @param columnIndex 需要合并的列索引值数组
     */
    function mergeCells(table, data, columnsName, columnIndex) {
        //定位需要添加合并属性的行数
        var rowIndex = 0;
        //这里涉及到简单的运算,mark是计算每次需要合并的格子数
        var mark = 1;
        //循环所有要合并的列
        for (var k = 0; k < columnsName.length; k++) {
            //table所有行
            //var trArr = $(".layui-table-body>.layui-table").find("tr");
            var trArr = $(table.elem).next().find(".layui-table-body>.layui-table").find('tr');
            //循环表格当前的数据
            for (var i = 1; i < data.length; i++) {
                //获取当前行的当前列
                var tdCurArr = trArr.eq(i).find("td").eq(columnIndex[k]);
                //获取相同列的第一列
                var tdPreArr = trArr.eq(rowIndex).find("td").eq(columnIndex[k]);
                //后一行的值与前一行的值做比较,相同就需要合并
                if (data[i][columnsName[k]] === data[i - 1][columnsName[k]]
                    && data[i][columnsName[0]] === data[i - 1][columnsName[0]]) {
                    mark += 1;
                    //相同列的第一列增加rowspan属性
                    tdPreArr.each(function () {
                        $(this).parent().addClass("ok" + data[i][columnsName[0]]);
                        $(this).attr("rowspan", mark);
                    });
                    //当前行隐藏
                    tdCurArr.each(function () {
                        $(this).parent().addClass("ok" + data[i][columnsName[0]]);
                        $(this).attr("class", "layui-hide");
                    });
                } else {
                    rowIndex = i;
                    //一旦前后两行的值不一样了,那么需要合并的格子数mark就需要重新计算
                    mark = 1;
                }
            }
            rowIndex = 0;
            mark = 1;
        }
    }
    
    /**
     * 设置多行数据联动选中样式
     * @param tbody 表格中所有行
     * @param flag 标志
     */
    function trLinkageClick(tbody, flag, state) {
        $.each(tbody, function (i, v) {
            var className= $(v).attr("class");
            if (className!= "" && className!= null && className!= undefined) {
                if (className.indexOf(flag) > -1) {
                    if (state) {
                        $(v).addClass('layui-bg-blue');
                    } else {
                        $(v).removeClass('layui-bg-blue');
                    }
                }
           
        });
    }
    

      效果图:
    在这里插入图片描述

    展开全文
  • 在设计报表之前,先简单介绍几个名词,我们从数据仓库概念了解到维度与度量这个概念,事实上一SQL语句查询的结果就是一张二维表格,即由行与列组成的表格,在统计分析时,我们把有些列称为维度列,有些列称为...
  • C#中mysql语句实现问题

    2017-05-10 03:47:15
    想把下面两条语句合成一条,实现的是查询接单人(未接单时为空)电话和订单信息的功能,第一条是有接单人,第二条没有,该怎么合并呢?谢谢大家! 1.mycmd.CommandText = @"select recordID,state,deadLine,revent,...
  • 现在想要从数据库中取出信息后,生成excel表, 每一页A4纸上最多显示种产品信息, 如果合同中的产品种类多余2个, 就需要在下面另外打印一份合同 请大神帮忙给一下思路, 想来好久都不知道该怎么处理这种业务
  • Kruskal算法的实现

    2020-01-30 22:41:28
    在排好序的边的集合里,首先挑选出权值最小的边,检查这个边连接的点的根节点是否相同,如果不相同,则将这边挑出,放入最小生成树的边的集合之中,并且将个节点对应的棵树合并为一颗树(路径压缩)。...

    是怎么实现的?

    Kruskal算法使用了贪心的思想来进行最小生成树的创建
    首先将所有的边按照其权值大小由小到大排序,同时创建一个并查集,记录每个点的根节点信息,每个节点的初始根节点都是它自己
    在排好序的边的集合里,首先挑选出权值最小的边,检查这个边连接的点的根节点是否相同,如果不相同,则将这条边挑出,放入最小生成树的边的集合之中,并且将两个节点对应的两棵树合并为一颗树(路径压缩)。重复上述步骤,直到最小生成树中存在N-1(N为节点个数)条边

    实现的代码

    
    /*初步的实现,后续再根据题目要求进行优化*/
    
    #include <iostream>
    #include <algorithm>
    #include <utility>
    #include <deque>
    #include <queue>
    
    using namespace std;
    
    bool cmp(pair<pair<int,int>,int >a,pair<pair<int,int>,int >b){
        return a.second<b.second; //按照权值由小到大排序
    }
    
    int main() {
        ios::sync_with_stdio(false);
        int n,t,boo = 0;
        cin>>n>>t;
        deque<pair<pair<int,int>,int> >list;	//初始化容器
        queue<pair<pair<int,int>,int> >ans;
        int listToFind[n+1];
        for (int j = 1; j <= n; ++j) {
            listToFind[j]=j;
        }
        for (int i = 0; i < t; ++i) {
            int a,c,d;
            cin>>a>>c>>d;
            list.push_back(make_pair(make_pair(a,c),d));
            list.push_back(make_pair(make_pair(c,a),d));
        }
        sort(list.begin(),list.end(),cmp);	//排序
        while(boo!=n-1){	//生成最小生成树
            for(deque<pair<pair<int,int>,int> >::iterator it = list.begin();it!=list.end();it++){	//遍历容器
                if(listToFind[it->first.first]!=listToFind[it->first.second]){	//检查根节点是否相同
                    int temp = listToFind[it->first.second];	//做路径压缩
                    for(int x = 1;x<=n;x++){
                        if(listToFind[x]==temp)listToFind[x]=listToFind[it->first.first];
                    }
                    ans.push(*it);
                    list.pop_front();
                    boo++;
                    break;
                }else list.pop_front();
            }
        }
        while(!ans.empty()){	//输出最小生成树
            cout<<ans.front().first.first<<"->"<<ans.front().first.second<<' '<<ans.front().second<<endl;
            ans.pop();
        }
        return 0;
    }
    
    展开全文
  • 6、将文件保存为以某一单元格中的值为文件名的宏怎么写 26 7、IE中实现链接EXCEL表 26 8、EXCEL中求陈列的对应元素乘积之和 27 9、求助日期转换星期的问题 27 10、研究彩票,从统计入手 27 11、如何自动设置页尾...
  • excel常用函数公式及技巧搜集 从身份证号码中提取出生年月日 从身份证号码中提取出性别 从身份证号码中进行年龄判断 按身份证号号码计算至今天年龄 以2006年10月31日为基准日,按...在信息输入前就给予提示 数据有效性
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    excel常用函数公式及技巧搜集 从身份证号码中提取出生年月日 从身份证号码中提取出性别 从身份证号码中进行年龄判断 按身份证号号码计算至今天年龄 以2006年10月31日为基准日,按...在信息输入前就给予提示 数据有效性
  • 3.2.4 两条相交的单向链表,如何求他们的第一个公共节点? 3.2.5 求单向局部循环链表的环入口? 3.2.6 IP地址如何在数据库中存储? 3.2.7 new/delete和malloc/free的底层实现? 3.2.8 overload、override、overwrite...
  • 其实处的设定是一致的,区别只在于一个是按容量设置,而另一个是按总容量的百分比大小来设置罢了。若想手动调节其百分比的大小,可以拉动[6]处的滑动。它是以32M为单位递进的,同理这个软件的所有滑动都以32M...
  • MAPGIS地质制图工具

    2013-05-06 16:15:30
    算法1:适应两条线结点比较平均的线,算法2:适应拐角较少的两条线,算法3:适应拐角较大的两条线。 2、先按V键,接着拉框选择两条等高线,然后执行菜单 “1辅助工具\四点插入等高线”,依次在两条等高线上点击,当...
  • 6、合并查询结果 7、为表和字段取别名 8、使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, ...
  • excel的使用

    2012-11-25 17:06:01
    4、自定义格式Excel中预设了很多有用的数据格式,基本能够满足使用的要求,但对一些特殊的要求,如强调显示某些重要数据或信息、设置显示条件等,就要使用自定义格式功能来完成。 Excel的自定义格式使用下面的通用...
  • 用户只需指出“做什么”,而不需指出“怎么做”,对数 据存取路径的选择以及 语句功能的实现均由系统自动完成,与用户编制的应用程序与 具体的机器及关系 的实现细节无关,从而方便了用户,提高了应用程序的开发效率,...
  • 注:第一条信息是最新的,最后 一条信息是最旧的,太老的帖子(灌水类)建议就不要转了,可以减少数据库容量提高转换速度(废话啦!) 如果某个主题或回复的作者已被删除,那么它的发表ID将被置为999999,...
  • (2)给其服务用户(数据链路层)在一物理的传输媒体上传送和接收比特流(一般为串行按顺序传输的比特流)的能力,为此,物理层应该解决物理连接的建立、维持和释放问题。 (3)在个相邻系统之间唯一地标识数据...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • arcgis工具

    2012-10-22 22:37:31
    个图斑都选中然后 Eidtor 工具intersect,此方法原图斑不会被接切。 25.属性表中选择集与非选择集的切换 Options/switch selection 26.快速把选择的要素另存为一个图层并加载进来。 先选责需要另存图层的...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、...文件与文件夹系统操作、系统控制操作、程序版权信息、系统软件信息、...
  • 数据库课程设计(基于B/S)

    热门讨论 2008-12-28 15:28:06
    ②原则2 (确定联系):个或多个实体间的关联与结合,如主管,从属,组成,占有,作用,配合,协同等等,当需要予以关注时,应作为联系。实体间的联系可分为一对一、一对多、多对多等三类,在确定联系时还要确定其...
  • 飞秋2013专业版

    2014-06-24 10:54:48
    在主界面中,点击右键,选择新建组可以增加组,选择管理组可以对组名称、组排序显示、合并组、删除组、组权限进行管理。 十六、如何设置成隐身或离线状态? 右键点击任务栏中的飞秋(FeiQ)图标。要隐身的话,在弹...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

两条信息怎么合并