HDU 4419 Colourful Rectangle 线段树求矩阵的并升级版again

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题意:有R G B三种颜色的矩形并在一起,两两颜色和三种颜色一起可以搞出另外4中颜色,问最终所有7种面积和为多少。

题解:y轴离散化,x轴扫描,线段树区间维护7种颜色的有效长度。具体来说:首先不考虑区间的lazy,求出区间7种颜色有效长度,然后考虑lazy,

         拿区间 R lazy举例,R 可以把无色染成R ,G染成RG,B染成RB,GB染成RGB,B G lazy做做相同转化即可。


Sure原创,转载请注明出处。

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn = 10002;
struct line
{
    int x,down,up;
    int left;
    bool operator < (const line &other) const
    {
        if(x == other.x) return left > other.left;
        return x < other.x;
    }
}vertical_line[maxn << 1];
struct node
{
    int l,r;
    __int64 len[8];
    int lazy[4];
}seg[maxn << 3];
int yy[maxn << 1];
__int64 area[8];
int n,top,tot;

inline int ABS(int x)
{
    return x >= 0 ? (x) : (-x);
}

void addmatrix(char c,int x1,int y1,int x2,int y2)
{
    int t;
    if(c == 'R') t = 1;
    else if(c == 'G') t = 2;
    else t = 3;
    vertical_line[tot].x = x1;
    vertical_line[tot].down = y1;
    vertical_line[tot].up = y2;
    vertical_line[tot].left = t;
    tot++;

    vertical_line[tot].x = x2;
    vertical_line[tot].down = y1;
    vertical_line[tot].up = y2;
    vertical_line[tot].left = -t;
    tot++;
    return;
}

void read()
{
    top = tot = 0;
    char str[3];
    int x1,x2,y1,y2;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s %d %d %d %d ",str,&x1,&y1,&x2,&y2);
        yy[top++] = y1;
        yy[top++] = y2;
        addmatrix(str[0],x1,y1,x2,y2);
    }
    sort(vertical_line , vertical_line + tot);
    sort(yy , yy + top);
    top = unique(yy , yy + top) - yy;
    return;
}

void biuld(int l,int r,int num)
{
    seg[num].l = l;
    seg[num].r = r;
    seg[num].len[0] = 1LL * (yy[r] - yy[l]);
    for(int i=1;i<=7;i++)
    {
        if(i <= 3) seg[num].lazy[i] = 0;
        seg[num].len[i] = 0LL;
    }
    if(l + 1 == r) return;
    int mid = (l + r) >> 1;
    biuld(l , mid , num << 1);
    biuld(mid , r , num << 1 | 1);
    return;
}

void UP(int num)
{
    __int64 sum = 0;
    for(int i=0;i<=7;i++)
    {
        if(seg[num].l + 1 == seg[num].r)
        {
            seg[num].len[i] = 0LL;
        }
        else
        {
            seg[num].len[i] = seg[num << 1].len[i] + seg[num << 1 | 1].len[i];
        }
        if(i) sum += seg[num].len[i];
    }
    seg[num].len[0] = 1LL * (yy[seg[num].r] - yy[seg[num].l]) - sum;
    int tmp;
    if(seg[num].lazy[1] > 0)
    {
        tmp = seg[num].len[0];
        seg[num].len[0] = 0;
        seg[num].len[1] += tmp;

        tmp = seg[num].len[2];
        seg[num].len[2] = 0;
        seg[num].len[4] += tmp;

        tmp = seg[num].len[3];
        seg[num].len[3] = 0;
        seg[num].len[5] += tmp;

        tmp = seg[num].len[6];
        seg[num].len[6] = 0;
        seg[num].len[7] += tmp;
    }
    if(seg[num].lazy[2] > 0)
    {
        tmp = seg[num].len[0];
        seg[num].len[0] = 0;
        seg[num].len[2] += tmp;

        tmp = seg[num].len[1];
        seg[num].len[1] = 0;
        seg[num].len[4] += tmp;

        tmp = seg[num].len[3];
        seg[num].len[3] = 0;
        seg[num].len[6] += tmp;

        tmp = seg[num].len[5];
        seg[num].len[5] = 0;
        seg[num].len[7] += tmp;
    }
    if(seg[num].lazy[3] > 0)
    {
        tmp = seg[num].len[0];
        seg[num].len[0] = 0;
        seg[num].len[3] += tmp;

        tmp = seg[num].len[1];
        seg[num].len[1] = 0;
        seg[num].len[5] += tmp;

        tmp = seg[num].len[2];
        seg[num].len[2] = 0;
        seg[num].len[6] += tmp;

        tmp = seg[num].len[4];
        seg[num].len[4] = 0;
        seg[num].len[7] += tmp;
    }
    return;
}

void update(int l,int r,int num,int val)
{
    if(l == seg[num].l && r == seg[num].r)
    {
        seg[num].lazy[ABS(val)] += val;
        UP(num);
        return;
    }
    int mid = (seg[num].l + seg[num].r) >> 1;
    if(mid >= r) update(l , r , num << 1 , val);
    else if(l >= mid) update(l , r , num << 1 | 1 , val);
    else
    {
        update(l , mid , num << 1 , val);
        update(mid , r , num << 1 | 1 , val);
    }
    UP(num);
    return;
}

void addline(int i)
{
    int bjd = lower_bound(yy , yy + top , vertical_line[i].down) - yy;
    int bju = lower_bound(yy , yy + top , vertical_line[i].up) - yy;
    if(bjd != bju) update(bjd , bju , 1 , vertical_line[i].left);
    return;
}

void solve()
{
    memset(area,0,sizeof(area));
    addline(0);
    for(int i=1;i<tot;i++)
    {
        for(int j=1;j<=7;j++)
        {
            area[j] += seg[1].len[j] * (vertical_line[i].x - vertical_line[i-1].x);
        }
        addline(i);
    }
    for(int i=1;i<=7;i++)
    {
        printf("%I64d\n",area[i]);
    }
    return;
}

int main()
{
    int cas;
    scanf("%d",&cas);
    for(int i=1;i<=cas;i++)
    {
        printf("Case %d:\n",i);
        read();
        biuld(0,top-1,1);
        solve();
    }
    return 0;
}


MATLAB实现的两级OPF与电动车充电调度,用于配电网络.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

Python 寄存器位域解析与 JSON 配置工具(芯片开发+寄存器/位域+解析源码+寄存器转储分析)

根据 JSON 指定位宽和字段起止位,解析寄存器数值显示枚举含义。包含重叠字段、重复名称、位范围和输入数值检查。 适用于嵌入式软件开发人员、驱动开发入门者及相关技术学习者。资源包含源码或模板、使用说明及验证范围说明。Python 3.10+,仅使用标准库;寄存器宽度 1 至 64 位。 功能边界见 README.md,实际验证情况见 TESTING.md。

HDU - 4419 Colourful Rectangle (扫描线)

题目链接 We use Red, Green and Blue to make new colours. See the picture below: Now give you n rectangles, the colour of them is red or green or blue. You have calculate the area of 7 different colo...

不二君 324

UAC白名单设置-软件使用

代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,添加一个Application Fix(在下方空白处点击右键,选择...

HDU 4296 Buildings 公式证明贪心的正确性

题意:有n(1          现在想安排一种摆放方案使得max(PDVi)最小。 题解:现在考虑相邻的两块i j,设上方sigama(wi)  = sum,i 在 j上方时分别得到PDVi = sum - si,PDVj = sum + wi - sj,同理得到j在i上方时          PDVjj = sum - sj,PDVii = sum + wj - si,若i在j上方始终优

Uhh, call me zacky NOW!!! 1万+

HDU 4275 Color the Tree 树的不重复染色 树的中心+hash

题意:给定n(n 题解:这题完全是看人家的代码看懂的唉…          首先找到树的中心(不是重心),中心的定义是树的直径的中点,如果直径上节点个数是偶数,那么在中间建立一个新的节点。          然后从中心dfs,对于每一棵子树得到相应的hash值(hash方法:hash[i]= A * (hash[j1]*B)^hash[j2]*B.....^hash[jn]*C%D;(顺序执

Uhh, call me zacky NOW!!! 2477

HDU 4271 Find Black Hand 字串编辑距离dp

题意:给定串长          母串中的substring,最小的编辑距离,和对应字典序最小的字串。 题解:比赛的时候看了一眼,substring看着有点晃,就搞别的了,还是自己太弱最后没有时间仔细想想这个题目。          对于两个串的编辑距离可以用O(n*m)的复杂度来搞,对于字串只需要做一点修改即可,具体见代码注释。          对于长度为len的串,要想成为母串的s

Uhh, call me zacky NOW!!! 2183

HDU 4411 Arrest 最小费用流

题意:有n(0           i - 1 点,到达一个点的时候可以选择不占领,问最后 题解:floyd之后建图,因为要保证所有的点依次占领,所以每个点拆点流量为1费用为-inf(保证所有点都被占领),然后从j(j 费用为map[ j ][ i ]         (因为点的访问是要按照顺序的),然后从原点ss到i建容量为inf费用为map[0][i]的边,同理从i+n(i 拆的出边点)

Uhh, call me zacky NOW!!! 2047

HDU 4415 Assassin’s Creed 苦逼的贪心

题意:一个人有把耐久度为m(1          的刀,敌人死后留下的刀可以杀死bi个敌人而不费耐久度,问能最多杀多少人,且杀最多人的时候耐久度消耗最小的值。 题解:将敌人分成两类,一类是bi为0,一类不为0,只要能杀死一个bi不为0敌人就能得到所有的bi。          分两种情况:1 只杀bi=0的敌人,这种情况排序从ai小的开始杀即可;

Uhh, call me zacky NOW!!! 1290

HDU 4297 One and One Story 树lca转rmq 查集维护根节点环

题意:给定一个有向图,每个节点只有一条出边,现在两个人在两个节点沿着有向边走,按照题意输出相遇时两个人走的路径。 题解:这个有向图很特别,由于每个节点只有一条出边,所以如果形成一个环的话就只能有指向这个环的边,同时一个子图内最多存在一个环,tarjan搞掉环,          建反图虚拟根节点转换成一棵树,根节点如果是环的环用带关系的查集维护,然后lca->rmq,在线得到答案。

Uhh, call me zacky NOW!!! 1257

HDU 4281 Judges' response dp+tsp极致

题意:给定n(n          任意两点间的距离是ceil(sqrt((xi - xj) ^ 2 + (yi - yj) ^ 2))。          问题1:最少需要多少个裁判能完成所有选手的检查任务;          问题2(和问题1没有关系,只是在问题1有解的情况下):安排裁判数量任意多,完成任务的裁判走的最短时间和。 题解:对于问题1:考虑dp[i]表示i状态下完成任务的

Uhh, call me zacky NOW!!! 1205

HDU 4414 Finding crosses 暴力枚举

题意:在#o组成的n*n(3 题解:枚举每一个#假设其为一个合法十字架的中心位置即可。 Sure原创,转载请注明出处。 #include #include using namespace std; const int maxn = 52; const int move[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; char map[maxn][ma

Uhh, call me zacky NOW!!! 1171

HDU 4274 Spy's Work 树形dfs

题意:给定一棵节点为n(n           即u)w代表以u节点为根节点的员工权值和)w,问给定的m(m 题解:维护每棵子树的最大最小可能值(或者确定值,如果是 "=" 的话)。 Sure原创,转载请注明出处。 #include #include #include #define MIN(a , b) ((a) < (b) ? (a) : (b)) #define MAX

Uhh, call me zacky NOW!!! 1119

HDU 4272 LianLianKan 记忆化搜索

题意:长度为n(n 题解:dp[i][j]表示当前栈顶10个元素的状态为 i 栈顶深度为 j 时是否可行(1代表当前元素未选,0代表已选),转移很直观但dp方程不好写,记忆化dfs实现。          为什么是10个呢,可以想下,从开始的状态最坏的情况是每次栈顶的元素都取最远的,进行5次之后得到的状态是1010101010,未选择的元素恰好为5          总个数为10,所以需要记

Uhh, call me zacky NOW!!! 1104

HDU 4293 Groups 拓扑排序

题意:有n(n 题解:看这个题想应该是dp,若菜比赛的时候没想出来dp怎么搞,无奈只好yy了一个拓扑排序,开始因为没有处理好说相同话的情况wa了一次。          具体建图方法:所有合法的话,按照x升序y降序排列,枚举i j如果两个人说的话不矛盾建边,这里需要注意的是相同的话最多出现n - x - y次,          多余的直接删除,因为多余的一定是假话。然后拓扑排序找最长路。

Uhh, call me zacky NOW!!! 958

HDU 4409 Family Name List 简单树操作

题意:按照题目描述给一棵树(家族谱,节点n           c name name输出两个人的lca是多少(lca不能是name本身)。 题解:vector存储节点数这样很容易排序,然后保存下L的序列,sum[ i ]表示当前 i 节点的直接儿子节点的个数,rmq处理出lca。 Sure原创,转载请注明出处。 #pragma comment (linker , "/ST

Uhh, call me zacky NOW!!! 907

HDU 4269 Defend Jian Ge 模拟

题意:模拟RPG,表示没玩过魔兽的很伤~~ 题解:需要注意的是,格子只有6个,如果格子满了能得到东西,即使有足够的钱,即使格子里有consume物品也不能买相同的consume物品,但是可以合成需要物品总数          不为0的物品。开始想把所有合成的物品的价格处理出来,但是由于给定的顺序不定,合成物品的物品还可能是合成的,这样需要给物品标定等级,dfs太麻烦,想想

Uhh, call me zacky NOW!!! 904

HDU 4267 A Simple Problem with Integers 数列离散化 + 树状数组

题意:对一个长度为n(n          1:给定a,b,k,c四个整数,在[a , b] 区间满足a          2:给定整数a,当前A[a]; 题解:想办法把间隔的数字搞到一起,因为1           1,2,3,4,5…(k=1)           1,3,5,7,9…(k=2)           2,4,6,8,10…(k=2)           1,4

Uhh, call me zacky NOW!!! 771
上一篇: POJ 3989 A hard Aoshu Problem 简单模拟
下一篇: HDU 4411 Arrest 最小费用流
zacky_su
博客等级 码龄14年 12粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值