【Hdu 1828 Picture 线段树扫描线】

博客提到HDU1828题目是线段树扫描线类型,还指出POJ 1177题数据太弱,作者重新写了HDU的题解,并且觉得自己写的线段树代码不够美观。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdu1828
题意 就是线段树扫描线 但是 poj 1177 那个题的数据也太弱了吧 所以重新写了一发hdoj的
感觉自己的线段树好丑

/*
    if you can't see the repay
    Why not just work step by step
    rubbish is relaxed
    to ljq
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;

#define dbg(x) cout<<#x<<" = "<< (x)<< endl
#define dbg2(x1,x2) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<endl
#define dbg3(x1,x2,x3) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<" "<<#x3<<" = "<<x3<<endl
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))

typedef pair<int,int> pll;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll _INF = 0xc0c0c0c0c0c0c0c0;
const ll mod =  (int)1e9+7;
const int N = 20025;

ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll ksm(ll a,ll b,ll mod){int ans=1;while(b){if(b&1) ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;}
ll inv2(ll a,ll mod){return ksm(a,mod-2,mod);}
void exgcd(ll a,ll b,ll &x,ll &y,ll &d){if(!b) {d = a;x = 1;y=0;}else{exgcd(b,a%b,y,x,d);y-=x*(a/b);}}//printf("%lld*a + %lld*b = %lld\n", x, y, d);

namespace sgt
{
    #define mid ((l+r)>>1)
    int cnt[N<<2],s[N<<2];
    void up(int rt,int l,int r)
    {
        if(cnt[rt]) s[rt] = r - l + 1;
        else s[rt] = s[rt<<1] + s[rt<<1|1];
    }
    void build(int rt,int l,int r)
    {
        s[rt] = cnt[rt] = 0;
        if(l==r)
        {
            return ;
        }
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
    }
    void update(int rt,int l,int r,int x,int y,int v)
    {
        if(x<=l&&r<=y)
        {
            cnt[rt]+=v;
            up(rt,l,r);
            return;
        }
        if(x>mid) update(rt<<1|1,mid+1,r,x,y,v);
        else if(y<=mid) update(rt<<1,l,mid,x,y,v);
        else update(rt<<1,l,mid,x,y,v),update(rt<<1|1,mid+1,r,x,y,v);
        up(rt,l,r);
    }
    #undef mid
}
const int MAX_N = 5025;
struct Node
{
    int l,r,z,id;
    bool operator < (const Node other) const
    {
        if(z==other.z) return id <other.id;
        return z < other.z;
    }
    Node(){}
    Node(int _l,int _r,int _z,int _id):
        l(_l),r(_r),z(_z),id(_id){}
}arr[MAX_N*2],brr[MAX_N*2];

int main()
{
    //ios::sync_with_stdio(false);
    //freopen("a.txt","r",stdin);
    //freopen("b.txt","w",stdout);
    int n,a,b,c,d,cnt = 0;
    while(scanf("%d",&n)==1)
    {
    ll ans = 0;
    cnt = 0;
    for(int i = 1;i<=n;++i)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        a+=10001,b+=10001,c+=10001,d+=10001;
        if(a>c) swap(a,c);
        if(b>d) swap(b,d);
        arr[++cnt] = Node(a,c,d,1);
        brr[cnt] = Node(b,d,a,0);
        arr[++cnt] = Node(a,c,b,0);
        brr[cnt] = Node(b,d,c,1);
    }
    int last = 0;
    sort(arr+1,arr+1+cnt);
    sort(brr+1,brr+1+cnt);
    brr[cnt+1] = arr[cnt+1] = Node(1,1,100000,1);
    sgt::build(1,1,20025);
    for(int i = 1;i<=cnt;++i)
    {
        if(arr[i].id==0)
        {
            sgt::update(1,1,N,arr[i].l,arr[i].r-1,1);
            ans += abs(sgt::s[1]-last);
            last = sgt::s[1];      }
        }
        else
        {
            sgt::update(1,1,N,arr[i].l,arr[i].r-1,-1);
            ans += abs(last - sgt::s[1]);
            last = sgt::s[1];
        }
    }
    last = 0;
    sgt::build(1,1,20025);
    for(int i = 1;i<=cnt;++i)
    {
        if(brr[i].id==0)
        {
            sgt::update(1,1,N,brr[i].l,brr[i].r-1,1);
            ans += abs(sgt::s[1]-last);
            last = sgt::s[1];
        }
        else
        {
            sgt::update(1,1,N,brr[i].l,brr[i].r-1,-1);
            ans += abs(last - sgt::s[1]);
            last = sgt::s[1];
        }
    }
    printf("%lld\n",ans);
    }
    //fclose(stdin);
    //fclose(stdout);
    //cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    return 0;
}

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值