首页 > 其他分享 >蓝桥杯2020决赛:试题 I 奇偶覆盖

蓝桥杯2020决赛:试题 I 奇偶覆盖

时间:2024-03-03 18:11:18浏览次数:23  
标签:奇偶 覆盖 int mid long 蓝桥 2020 len define

原题

如果不考虑奇偶性,其实就是扫描线的板子。
考虑如何处理奇偶:
首先在线段树存两个变量 \(len_1\) 以及 \(len_2\),分别表示奇长度和偶长度。再用 \(sum\) 记录当前两个端点之间被覆盖了多少次。
然而我们无法直接获得每一个子区间的具体覆盖数目。所以从奇偶性的特点方面入手。

假设当前区间被覆盖了奇数次,那么:
\(len_2 = 子区间len_1\)
\(len_1 = 子区间len_2 + 可能未被覆盖到的长度\)

\(len_1\)无法直接求,但是可以用总区间长度减去\(len_2\)得到。

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 100010
#define ll long long
#define y1 abdbsdhuhdwiuoh
#define int long long

template <class T>
inline T read(T& a){
    T x = 0, s = 1;
    char c = getchar(); 
    while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
    while(isdigit(c)){ x = x * 10 + (c ^ '0'); c=  getchar(); }
    a = x * s; 
    return a; 
}

int n; 
struct Line{
    int x, y, h, flag; 
} L[N << 1]; 

int X[N << 1]; // 离散化坐标

struct Segment_tree{
    struct node{
        int sum, len1, len2; 
    }  t[N << 4]; // 多乘一个2

    #define lson (o<<1)
    #define rson (o<<1|1)

    inline void pushup(int o, int l, int r){
        if(t[o].sum){
            if(t[o].sum){
                if(t[o].sum % 2 == 1){
                    if(l == r){
                        t[o].len1 = X[r + 1] - X[l]; 
                        t[o].len2 = 0; 
                    }
                    else{
                        t[o].len2 = t[lson].len1 + t[rson].len1; 
                        t[o].len1 = X[r + 1] - X[l] - t[o].len2; 
                    }
                }
                else{
                    if(l == r){
                        t[o].len2 = X[r + 1] - X[l]; 
                        t[o].len1 = 0; 
                    }
                    else{
                        t[o].len1 = t[lson].len1 + t[rson].len1; 
                        t[o].len2 = X[r + 1] - X[l] - t[o].len1; 
                    }
                }
            }
        }
        else{
            if(l == r) t[o].len1 = t[o].len2 = 0;  // 不特判的话要多加一层
            else {
                t[o].len1 = t[lson].len1 + t[rson].len1; 
                t[o].len2 = t[lson].len2 + t[rson].len2; 
            }
        }
        return ; 
    }

    void build(int o, int l, int r){
        t[o].sum = t[o].len1 = t[o].len2 = 0; 
        if(l == r) return ; 
        int mid = l + r >> 1;
        build(lson, l, mid); 
        build(rson, mid + 1, r); 
        pushup(o, l, r); 
        return ; 
    }

    void update(int o, int l, int r, int L, int R, int k){
        if(X[l] >= R || X[r + 1] <= L) return ; // 端点相等也是不够的。因为表示的是右侧一段区间,端点没有意义。
        if(X[l] >= L && X[r + 1] <= R){
            t[o].sum += k; 
            pushup(o, l, r); 
            return ; 
        }
        int mid = l + r >> 1; 
        update(lson, l, mid, L, R, k); 
        update(rson, mid + 1, r, L, R, k); 
        pushup(o, l, r); 
        return ; 
    }

} tree; 

signed main(){
    read(n); 
    for(int i = 1; i <= n; i++){
        int x1, y1, x2, y2; 
        read(x1), read(y1), read(x2), read(y2); 
        L[i * 2 - 1] = (Line){x1, x2, y1, 1}; 
        L[i * 2] = (Line){x1, x2, y2, -1}; 
        X[i * 2 - 1] = x1; 
        X[i * 2] = x2; 
    }
    n <<= 1ll;
    sort(X + 1, X + n + 1); 
    int tot = unique(X + 1, X + n + 1) - X - 1; 
    sort(L + 1, L + n + 1, [](Line a, Line b){
        return a.h < b.h; 
    }); 

    tree.build(1, 1, tot - 1); 
    int ans1 = 0, ans2 = 0; 
    for(int i = 1; i < n; i++){
        tree.update(1, 1, tot - 1, L[i].x, L[i].y, L[i].flag); 
        ans1 += tree.t[1].len1 * (L[i+1].h - L[i].h); 
        ans2 += tree.t[1].len2 * (L[i + 1].h - L[i].h); 
    }
    cout << ans1 << endl << ans2 << endl; 
    return 0; 
}

标签:奇偶,覆盖,int,mid,long,蓝桥,2020,len,define
From: https://www.cnblogs.com/wondering-world/p/18050385

相关文章

  • 2024AcWing蓝桥杯集训·每日一题-前缀和
    1.[AcWing562.壁画]题目描述Thanh想在一面被均分为\(N\)段的墙上画一幅精美的壁画。每段墙面都有一个美观评分,这表示它的美观程度(如果它的上面有画的话)。不幸的是,由于洪水泛滥,墙体开始崩溃,所以他需要加快他的作画进度!每天Thanh可以绘制一段墙体。在第一天,他可以自由的......
  • 2024AcWing蓝桥杯集训·每日一题-二分
    1.[AcWing503.借教室]题目描述在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来\(n\)天......
  • 第十一届蓝桥杯试题E:排序
    目录题目分析验证代码题目对一个字符串,对它进行冒泡排序使其为升序,例如:对于lan,排序成aln需要交换一次(只能交换相邻的两个字母),对于qiao,排序成aioq就需要交换4次。请找出冒泡排序时恰好需要交换100次的字符串,如果有多个字符串满足条件,则找出最短的那个,如果有多个满足条件而且......
  • MBR20200FCT-ASEMI充电器整流MBR20200FCT
    编辑:llMBR20200FCT-ASEMI充电器整流MBR20200FCT型号:MBR20200FCT品牌:ASEMI封装:ITO-220AB最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):200V最大正向电压(VF):0.9V工作温度:-65°C~175°C反向恢复时间:ns重量:1.5615克芯片个数:2芯片尺寸:102mil引脚数量:3正向浪涌电流(IFMS):20......
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
    暴力秒了#include<bits/stdc++.h>#defineintlonglong//开longlong是个好习惯usingnamespacestd;boolbaozi(intx){while(x){intt=x%10;if(t==2||t==0||t==1||t==9)//数位判断{returntrue;......
  • 蓝桥杯2022年第十三届省赛真题-技能升级(中)
    目录题目题解:暴力题解:优化题目题解:暴力思路:枚举每一个Ai,并一直减去Bi,直到小于零为止,即为该技能所能增加的点数的集合。将每一个选择存进res中,并排序选择前M大的技能点即可。#首先,a-b加入列表,循环a/b次;其次,对列表排序,取前M个数进行求和a,b=map(int,input().split())#读入......
  • 2024 蓝桥杯模拟赛3(div1+div2)
    2024蓝桥杯模拟赛3(div1+div2)P8834[传智杯#3决赛]序列简单的模拟,数据范围很小,暴力即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+5;voidsolve(){ lln,k,a[N],cnt=0; cin>>n>>k; for(inti=1;i<=n;i++)c......
  • P8647 [蓝桥杯 2017 省 AB] 分巧克力
    题目链接:小巧克力的边长一定在\(1\sim10^5\)之间。答案为在\(1\sim10^5\)之间找一个最大的数,使得所有\(h[i]/a*w[i]/a\)的和\(\geqslantk\)即可。#include<cstdio>#include<algorithm>constintN=1e5+10;intn,k,h[N],w[N];boolcheck(inta)......
  • [CS61A-Fall-2020]学习记录四 Lecture4中有意思的点
    首先,本文不是总结归纳,只是记录一些有趣的知识点罢了assert课堂中在讲授函数,如frommathimportpidefarea_circle(r):returnr*r*pi但老师提出,当r为-10时,函数不会报错,于是引入assert来检测参数frommathimportpidefarea_circle(r):#参数应为正数......
  • noip2020
    NOIp2020游记第一次打NOIp,有点小紧张/kel8:30开考,8:15进考场顺便带了一大包巧克力进场,想着考试的时候吃开考打开文件夹一看string就大窘了,字符串算法刚好没学啊/fadT1一看第一反应网络流,大喜,前两天刚复习兴致勃勃准备开始打dinic,然后发现这题和网络流一点关系没有随便打......