zoukankan      html  css  js  c++  java
  • 【CF527C】 Glass Carving [线段树]

    CF527C Glass Carving

    一块w*h的玻璃,每次横着切一刀(H)或者竖着切一刀(V),没有两次相同的切割,求最大的矩形碎片面积。 样例中第一行是w,h(玻璃大小)和n(切割次数),字母后的数字表示距下边缘(H)/左边缘(V)的距离

    用01序列表示每个点是否被切割
    最长的长就是长的最长连续0的数量+1 最长的宽就是宽的最长连续0的数量+1
    用线段树维护最长连续零

    最长连续0不满足区间加法 于是维护左端开始最长连续0 右端开始最长连续0 (很像维护最大字段和那个

    ==其实我的代码里sum是多余的

    还有set可以做这题

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define Max(x,y) ((x)>(y)?(x):(y))
    #define Min(x,y) ((x)<(y)?(x):(y))
    #define Abs(x) ((x)<0?-(x):(x))
    #define ls (o<<1)
    #define rs (o<<1|1)
    const int N=2e5+5,M=100+5,inf=0x3f3f3f3f;
    int w,h,n;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    struct SegmentTree{int lmx,rmx,mx,sum;bool pu;}t[N<<2][2];
    void pup(int o,int id){
    	t[o][id].pu=t[ls][id].pu&t[rs][id].pu;
    	t[o][id].sum=t[ls][id].sum+t[rs][id].sum;
    	t[o][id].mx=Max(t[ls][id].rmx+t[rs][id].lmx,Max(t[ls][id].mx,t[rs][id].mx));
    	t[o][id].lmx=t[ls][id].pu?t[ls][id].sum+t[rs][id].lmx:t[ls][id].lmx;
    	t[o][id].rmx=t[rs][id].pu?t[rs][id].sum+t[ls][id].rmx:t[rs][id].rmx;
    }/*
    void pup(int o,int id){
    	t[o][id].pu=t[ls][id].pu&t[rs][id].pu;
    	t[o][id].mx=Max(t[ls][id].rmx+t[rs][id].lmx,Max(t[ls][id].mx,t[rs][id].mx));
    	t[o][id].lmx=t[ls][id].pu?t[ls][id].lmx+t[rs][id].lmx:t[ls][id].lmx;
    	t[o][id].rmx=t[rs][id].pu?t[rs][id].rmx+t[ls][id].rmx:t[rs][id].rmx;
    }*/
    void mdf(int o,int l,int r,int x,int id){
    	if(l==r){t[o][id]=(SegmentTree){0,0,0,t[o][id].sum,0};return;}
    	int mid=l+r>>1;
    	if(x<=mid) mdf(ls,l,mid,x,id);
    	else mdf(rs,mid+1,r,x,id);
    	pup(o,id);
    }
    void build(int o,int l,int r,int id){
    	if(l==r){t[o][id]=(SegmentTree){1,1,1,1,1};return;}
    	int mid=l+r>>1;
    	build(ls,l,mid,id),build(rs,mid+1,r,id);
    	pup(o,id);
    }
    
    int main(){
    	freopen("in.txt","r",stdin);
    	rd(w),rd(h),rd(n);
    	build(1,1,w-1,1),build(1,1,h-1,0);
    	for(int i=1;i<=n;++i){
    		char opt;int x;
    		scanf(" %c%d",&opt,&x);
    		if(opt=='H') mdf(1,1,h-1,x,0);
    		else mdf(1,1,w-1,x,1);
    		printf("%lld
    ",(ll)(t[1][1].mx+1)*(t[1][0].mx+1));
    	}
    	return 0;
    }
    
  • 相关阅读:
    poj 2676 Suduku (dfs)
    poj 1562 Oil Deposits (dfs)
    poj 2907 Collecting Beepers (dfs)
    poj 1655 Balancing Act (树形dfs)
    poj 3411 Paid Roads (dfs)
    hdu 2896 病毒侵袭 (AC)
    hdu 3065 病毒侵袭持续中 (AC)
    poj 2251 Dungeon Master (bfs)
    java中debug使用
    Swing入门级小项目总结
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11457821.html
Copyright © 2011-2022 走看看