C. Glass Carving 正着做或者倒着做都可以

http://codeforces.com/problemset/problem/527/C

这题总体思路就是,每画一条线,然后就找到x间距的最max值和y间距的最max值,相乘就是当前的ans

那么我需要维护这样的一个数列,每次往里面添加一个元素,然后查询相邻两个元素的差值的最大值。

倒着做比较简单,首先把所有元素插上去,然后最大值直接暴力算一次。然后后来只有删除操作,这个操作只会让最大值变大。

每次删除后,检查上面和下面的新间距,和最大值比较一下就好。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
set<int> ss[2];
LL ans[200000 + 20];
struct Node {
    char op;
    int val;
}node[200000 + 20];
void fuck(int id) {
    if (node[id].op == ‘H‘) {
        ss[1].erase(node[id].val);
    } else ss[0].erase(node[id].val);
}
void work() {
    int w, h, n;
    cin >> w >> h >> n;
    ss[0].insert(0); ss[0].insert(w);
    ss[1].insert(0); ss[1].insert(h);
    set<int> :: iterator it1, it2;
    for (int i = 1; i <= n; ++i) {
        char str[2];
        int val, flag = false;
        scanf("%s%d", str, &val);
        if (str[0] == ‘H‘) {
            ss[1].insert(val);
        } else ss[0].insert(val);
        node[i].op = str[0];
        node[i].val = val;
    }
    int mx1 = 1;  // v
    it2 = ss[0].begin();
    it2++;
    for (it1 = ss[0].begin(); it2 != ss[0].end(); ++it2, ++it1) {
        mx1 = max(mx1, *it2 - *it1);
    }
    int mx2 = -inf;
    it2 = ss[1].begin();
    it2++;
    for (it1 = ss[1].begin(); it2 != ss[1].end(); ++it2, ++it1) {
        mx2 = max(mx2, *it2 - *it1);
    }
    ans[n] = 1LL * mx1 * mx2;
//    cout << mx1 << " " << mx2 << endl;
    fuck(n);
    mx1 = 1;  // v
    it2 = ss[0].begin();
    it2++;
    for (it1 = ss[0].begin(); it2 != ss[0].end(); ++it2, ++it1) {
        mx1 = max(mx1, *it2 - *it1);
    }
    mx2 = 1;
    it2 = ss[1].begin();
    it2++;
    for (it1 = ss[1].begin(); it2 != ss[1].end(); ++it2, ++it1) {
        mx2 = max(mx2, *it2 - *it1);
    }
    for (int i = n - 1; i >= 1; --i) {
        if (node[i].op == ‘H‘) {
            it1 = ss[1].lower_bound(node[i].val);
            it2 = it1;
            it2++;
            mx2 = max(mx2, *it2 - *it1);
            it2 = it1;
            it1--;
            mx2 = max(mx2, *it2 - *it1);
            it1++;
        } else {
            it1 = ss[0].lower_bound(node[i].val);
            it2 = it1;
            it2++;
            mx1 = max(mx1, *it2 - *it1);
            it2 = it1;
            it1--;
            mx1 = max(mx1, *it2 - *it1);
            it1++;
        }
        it2 = it1;
        it2++;
        it1--;
        fuck(i);
        ans[i] = 1LL * mx1 * mx2;
        if (node[i].op == ‘H‘) {
            mx2 = max(mx2, *it2 - *it1);
        } else mx1 = max(mx1, *it2 - *it1);
    }
    for (int i = 1; i <= n; ++i) {
        cout << ans[i] << endl;
    }
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    work();
    return 0;
}

写的很乱,因为是绝杀的。

正着也可以。

用一个multiset来维护当前拥有的差值,一开始是h

然后每添加一条边,可以找出在原数组中的上界和下界,这个差值是要删除的那个差值,然后添加新差值即可。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
set<int> x, y;
multiset<int> xx, yy;
void work() {
    int w, h, n;
    cin >> w >> h >> n;
    x.insert(0), x.insert(w);
    y.insert(0), y.insert(h);
    xx.insert(w), yy.insert(h);
    for (int i = 1; i <= n; ++i) {
        char str[2];
        int pos;
        cin >> str >> pos;
        if (str[0] == ‘H‘) {
            auto it1 = y.lower_bound(pos);
            int d1 = *it1;
            it1--;
            int d2 = *it1;
            auto del = yy.lower_bound(d1 - d2);
            yy.erase(del);
            yy.insert(d1 - pos);
            yy.insert(pos - d2);
            y.insert(pos);
        } else {
            auto it1 = x.lower_bound(pos);
            int d1 = *it1;
            it1--;
            int d2 = *it1;
            auto del = xx.lower_bound(d1 - d2);
            xx.erase(del);
            xx.insert(d1 - pos);
            xx.insert(pos - d2);
            x.insert(pos);
        }
        auto itx = xx.rbegin(), ity = yy.rbegin();
        cout << 1LL * (*itx) * (*ity) << endl;
    }
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    IOS;
    work();
    return 0;
}

时间: 2024-10-26 21:47:10

C. Glass Carving 正着做或者倒着做都可以的相关文章

Codeforces 527C Glass Carving

vjudge 上题目链接:Glass Carving 题目大意: 一块 w * h 的玻璃,对其进行 n 次切割,每次切割都是垂直或者水平的,输出每次切割后最大单块玻璃的面积: 用两个 set 存储每次切割的位置,就可以比较方便的把每次切割产生和消失的长宽存下来(用个 hash 映射数组记录下对应值的长宽的数量即可,O(1) 时间维护),每次切割后剩下的最大长宽的积就是答案了: 1 #include<cstdio> 2 #include<cstring> 3 #include<

Codeforces 527C Glass Carving(Set)

题意  一块w*h的玻璃  对其进行n次切割  每次切割都是垂直或者水平的  输出每次切割后最大单块玻璃的面积 用两个set存储每次切割的位置   就可以比较方便的把每次切割产生和消失的长宽存下来  每次切割后剩下的最大长宽的积就是答案了 #include <bits/stdc++.h> using namespace std; const int N = 200005; typedef long long LL; set<int>::iterator i, j; set<i

C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用)

C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glass). He already has a re

小米平板体验:做了苹果没做的塑料平板

IT之家(www.ithome.com):小米平板体验:做了苹果没做的塑料平板 15日,雷军在北京国际会议中心的小米新品发布会上,公布了全新的小米平板.在发布会后人群在产品体验区排起了长龙,排了足足25分钟的队后我拿起小米平板进行体验,但由于外面仍有大量的人未进场,整个试用过程仅有可怜的3分钟. 进入微软.亚马逊,谷歌等美国IT企业工作人才项目,起薪40万,百度搜索(MUMCS) 其实在整场发布会上,我仿佛有了种雷军重新发布了一次iPad mini的感觉.不仅是雷军在整场发布会上多次提及苹果,包

代做毕设,代做GIS毕业设计,GIS项目,GIS二次开发

代做毕设,代做GIS毕业设计,GIS项目等: 常年从事桌面GIS,ArcGIS数据处理分析等: ArcMap插件开发(.Net,Python): QQ:624030189 您是不是还在为做GIS毕业设计苦恼? 没有思路,数据不会处理,不会编程? 软件环境不会安装? 您是不是还在为科研项目中用到GIS而头疼? 图像不会处理,不会制图? 不会写脚本(Net,Python),不会用工具箱进行批处理? 这些东西,在我们这儿,不在话下:让您从GIS中解脱出来,是我们的目标! 我们能够为您提供解决方案.技术

尽量别做自己不想做的事

愈来愈不懂得客气是怎么一回事儿. 为了礼貌,有时向人说:"有空去饮茶." 这一说不得了了,天天闲着,却又没时间,有空时想想:"值不值得去?" 最后,还是勉强去应酬,深觉没意思. 所以,"有空去饮茶"这句话,少说了.如果没有心的话,说来干什么?自己找辛苦. 吃完饭大家抢着付账,要付就让人家去付好了,已经学会接受这种方式. 最糟糕的是,想请客,先把信用卡交上柜台,但对方坚持要付,把你的卡退回给你.应付这种情形,唯有让他们去结账,再买一份重礼他日送上.

用SPSS做二元logistics回归做预测

在做logistics回归之前,我们要先对你要做预测的变量做个相关分析,找出和你因变量相关的自变量.我这里就不做了,直接用我处理之后的数据. 打开我们要分析的数据,单击“分析”,选择“回归”,然后选择“二元Logistics回归”,弹出下面的界面,如图: 把是否购买移到因变量框里面去,把消费金额和消费数量移动到协变量框里面去,然后单击“保存”按钮,弹出“Logistics回归:保存”界面,选择“预测值”下面的“概率”,之后咋爱单击浏览按钮,把模型保存到你想保存的位子,完成之后单击“继续”,回到刚

HTML5 canvas 做画板画图 可以做电子白板

HTML5 canvas 做画板画图 可以做电子白板 <html> <head> <meta charset="utf-8"> <title>HTML5 canvas 做画板画图 可以做电子白板</title> <style type="text/css"> <!-- #container { position: relative;} #imageView { border: 1px so

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议 (图)

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布(Android和IOS版本)前听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布前听听大家的建议!