国庆假期总结

假期在家的效率不高,只做了几个线段树的题目,

http://acm.split.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11865&pid=1003&ojid=0

题目大意给你一个钩子,钩子可以由不同的材料做成,给你几个区间以及该区间的材料质量,给出最终钩子的质量(钩子初始材料质量为1)

使用线段树区间更新,在更新过程中延迟更新,节省时间。

http://acm.split.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11865&pid=1006&ojid=0

一个高位h宽为w的广告牌,现在广告牌是空的,有一些小的广告要张贴到广告牌上,已知这些小广告的高度都是1,宽为wi,张贴有一定规律,按照顺序来,并且往最高处贴,如果最高处贴不开就往下一行贴,输出每一张广告贴在的行,若果广告牌上贴不开,就输出-1

线段树更新叶子结点,每一次输入一个广告,比较他的宽度如果大于num[1]说明无法放下,直接输出-1,否则查询叶子结点,并及时修改节点的大小(每贴一个广告,空间就会减少一些)。

http://acm.split.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11865&pid=1015&ojid=1

一个板子上,初始颜色为1,有两种操作,C将区间[L,R]涂成V颜色,P查询区间颜色总数。

使用线段树区间更新,延迟更新。

http://acm.split.hdu.edu.cn/webcontest/contest_showproblem.php?cid=11865&pid=1010&ojid=0

给一个数列,找出符合间距大于d,并且上升的最长序列的长度。

LIS变形,主要是限制间距d,其他是LIS模板。

int fun(int t)
{
    int l = 1,r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(t>c[mid])
            l = mid+1;
        else
            r = mid-1;
    }
    return l;
}
int LIS()
{
    ans = 0;
    for(int i = 1; i<=n; i++)
    {
        dp[i] = fun(a[i]);
        if(dp[i]>ans)
            ans = dp[i];
        int j = i-k;//在这里设置间距,保证间距不小于d
        if(j>0 && c[dp[j]]>a[j])
            c[dp[j]] = a[j];
    }
    return ans;
}


你可能感兴趣的:(ACM训练日记)