• 1019.Line Painting(线段树 离散化)


    1019

    离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1  黑为2  白为1  因为N不大 最后直接循环标记这一段的颜色查找

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 using namespace std;
      7 #define N 100010
      8 #define LL long long
      9 struct node
     10 {
     11     int d,id;
     12     char c;
     13 }li[N<<1];
     14 int q[N][3],pp[N];
     15 int s[N<<2],cnt[N],cc[N];
     16 void build(int l,int r,int w)
     17 {
     18     s[w] = 1;
     19     if(l==r-1)
     20     {
     21         return ;
     22     }
     23     int m = (l+r)>>1;
     24     build(l,m,w<<1);
     25     build(m,r,w<<1|1);
     26 }
     27 void update(int a,int b,int d,int l,int r,int w)
     28 {
     29     if(a<=l&&b>=r)
     30     {
     31         s[w] = d;
     32         return ;
     33     }
     34     if(l==r-1)
     35     return ;
     36     if(s[w]>0&&s[w]!=d)
     37     {
     38         s[w<<1] = s[w<<1|1] = s[w];
     39         s[w] = -1;
     40     }
     41     int m = (l+r)>>1;
     42     if(a<=m)
     43     update(a,b,d,l,m,w<<1);
     44     if(b>m)
     45     update(a,b,d,m,r,w<<1|1);
     46 }
     47 void query(int l,int r,int w)
     48 {
     49     int i;
     50     if(s[w]>0)
     51     {
     52         for(i = l ; i < r; i++)
     53         cnt[i] = s[w];
     54         return ;
     55     }
     56     if(l==r-1)
     57     return ;
     58     int m = (l+r)>>1;
     59     query(l,m,w<<1);
     60     query(m,r,w<<1|1);
     61 }
     62 bool cmp(node a,node b)
     63 {
     64     return a.d<b.d;
     65 }
     66 int main()
     67 {
     68     int i,n;
     69     char c[10];
     70     scanf("%d",&n);
     71     for(i = 0 ; i < n ; i++)
     72     {
     73         scanf("%d%d%s",&q[i][0],&q[i][1],c);
     74         if(c[0]=='b')
     75         cc[i+1] = 2;
     76         else
     77         cc[i+1] = 1;
     78         li[2*i].d = q[i][0];
     79         li[2*i].id = -(i+1);
     80         li[2*i+1].d = q[i][1];
     81         li[2*i+1].id = i+1;
     82     }
     83     sort(li,li+2*n,cmp);
     84     int tt = li[0].d,g=1;
     85     for(i = 0 ; i < 2*n ; i++)
     86     {
     87         if(li[i].d!=tt)
     88         {
     89             g++;
     90             tt = li[i].d;
     91         }
     92         if(li[i].id<0)
     93         {
     94             q[-li[i].id][0] = g;
     95             pp[g] = li[i].d;
     96         }
     97         else
     98         {
     99             q[li[i].id][1] = g;
    100             pp[g] = li[i].d;
    101         }
    102     }
    103     build(0,g,1);
    104     for(i = 0; i <= g ; i++)
    105     cnt[i] = 1;
    106     for(i = 1 ; i <= n ; i++)
    107     {
    108         update(q[i][0],q[i][1],cc[i],0,g,1);
    109     }
    110     query(0,g,1);
    111     int maxz=0,ss,ee,ts,te;
    112     cnt[0] = 1;
    113     cnt[g+1] = 1;
    114     pp[g+1] = 1000000000;
    115     for(i = 0 ; i <= g ; i++)
    116     {
    117         if(cnt[i]!=1)
    118         continue;
    119         ss = pp[i];
    120         while(cnt[i]==1&&i<=g)
    121         i++;
    122         ee = pp[i];
    123         if(ee-ss+1>maxz)
    124         {
    125             ts = ss;
    126             te = ee;
    127             maxz = ee-ss+1;
    128         }
    129     }
    130     printf("%d %d
    ",ts,te);
    131     return 0;
    132 }
    View Code
  • 相关阅读:
    unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
    Go的学习笔记之Channel发送和接收
    聊聊 PC 端自动化最佳方案
    一文彻底搞懂快速幂(原理实现、矩阵快速幂)
    一次core.<number> 文件占满磁盘空间的处理过程
    博文目录
    备忘录:C#获取微信小程序的云数据库中数据
    T-SQL——关于跨库连接查询
    .NET异步程序设计——给线程传递数据
    自研 Pulsar Starter:winfun-pulsar-spring-boot-starter
  • 原文地址:https://www.cnblogs.com/shangyu/p/3334678.html
Copyright © 2020-2023  润新知