zoj 1610 Count the Colors

点击打开链接zoj 1610

思路:线段树成段更新
分析:
1 题目给定n个区间的更新,然后要我们输出在这写所有的区间内能够见到的颜色的次数,只有连续的才算一次
2 简单的线段树的成段更新,做n的update,最后在查询一下然后输出

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN = 8010;
struct Node{
   int left;
   int right;
   int mark;
};
Node node[4*MAXN];
int ans[MAXN];
int n;

//向下更新
void push_down(int pos){
    if(node[pos].mark != -1){
       node[pos<<1].mark = node[pos].mark;
       node[(pos<<1)+1].mark = node[pos].mark;
       node[pos].mark = -1;
    }
}

//建立线段树
void buildTree(int left , int right , int pos){
    node[pos].left = left;
    node[pos].right = right;
    node[pos].mark = -1;//延时标记初始化为-1
    if(left == right)
       return;
    int mid = (left+right)>>1;
    buildTree(left , mid , pos<<1);
    buildTree(mid+1 , right , (pos<<1)+1);
}

//更新
void update(int left , int right , int value , int pos){
    if(left <= node[pos].left && right >= node[pos].right){
       node[pos].mark = value;
       return;
    }
    push_down(pos);
    int mid = (node[pos].left+node[pos].right)>>1;
    if(right <= mid)
       update(left , right , value , pos<<1);
    else if(left > mid)
       update(left , right , value , (pos<<1)+1);
    else{
       update(left , mid , value , pos<<1);
       update(mid+1 , right , value , (pos<<1)+1);
    }
}

//查询
int query(int index , int pos){
    if(node[pos].left ==  node[pos].right)
      return node[pos].mark;
    push_down(pos);
    int mid = (node[pos].left + node[pos].right)>>1;
    if(index <= mid)
        return query(index , pos<<1);
    else
        return query(index , (pos<<1)+1);
}

int main(){
    int x , y , c;
    int Min_left , Max_right;
    int Min_Color , Max_Color;
    while(scanf("%d" , &n) != EOF){
        memset(ans , 0 , sizeof(ans));
        Min_left = MAXN , Min_Color = MAXN;
        Max_right = 0 , Max_Color = 0;
        buildTree(1 , MAXN , 1);
        for(int i = 0 ; i < n ; i++){
           scanf("%d%d%d" , &x , &y , &c);
           update(x+1 , y , c , 1);//这个地方我是把最左端+1
           Min_left = min(x , Min_left);
           Max_right = max(y , Max_right);
           Min_Color = min(c , Min_Color);
           Max_Color = max(c , Max_Color);
        }
        //查询的技巧
        int pre = query(Min_left+1 , 1);
        ans[pre]++;
        for(int i = Min_left+2 ; i <= Max_right ; i++){
           int tmp = query(i , 1);
           if(tmp != pre){
             ans[tmp]++;
             pre = tmp;
           }
        }
        //输出
        for(int i = Min_Color ; i <= Max_Color ; i++){
           if(ans[i])
             printf("%d %d\n" , i , ans[i]);
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-22 22:56:54

zoj 1610 Count the Colors的相关文章

ZOJ 1610

#include <iostream> #include <cstring> using namespace std; int res[8001]; int main() { int i,j,k,T; int ans[8001]; while(cin>>T) { int Max = -1, Min = 8001; memset(ans,-1,sizeof(ans));//下标为区间,值为颜色 memset(res,0,sizeof(res));//下标为颜色,值为组数

用asp.net画饼图(可用于各种投票程序)

//用asp.net画饼图(可用于各种投票程序)//和asp相比asp.net拥有更强大的功能,使用gdi+可以轻易实现以前很多不能办到的图形功能.//首先在c:\中建库mess.mdb,并建表title.//建二个字段,title(char型),point(int型)//非常满意     281//比较满意     297//还凑合         166//不满意         416//我还写了画折线图和条形图的部分,目前正在把它们全部写进一个类中.需要的可以和我联系:mailto:ou

用asp.net画饼图

asp.net|饼图 //用asp.net画饼图(可用于各种投票程序)//和asp相比asp.net拥有更强大的功能,使用gdi+可以轻易实现以前很多不能办到的图形功能.//首先在c:\中建库mess.mdb,并建表title.//建二个字段,title(char型),point(int型)//非常满意 281//比较满意 297//还凑合 166//不满意 416//我还写了画折线图和条形图的部分,目前正在把它们全部写进一个类中.需要的可以和我联系:mailto:ouyang76@263.ne

再学GDI+[90]: TGPImage(10)

本例效果图: 代码文件:unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) DrawGrid1: TDrawGrid; OpenDialog1: TOpenDialog; Button1: TButton; procedure FormCre

新手求教,求大神注释下面代码,最好每行都标注下,给跪了,在线等

问题描述 ///<summary>///根据货物所占百分比画饼图///</summary>///<paramname="objgraphics">Graphics类对象</param>///<paramname="M_str_sqlstr">SQL语句</param>///<paramname="M_str_table">表名</param>///&l

Skia深入分析3——skia图片绘制的实现(2)

此篇讲图像采样一.采样流程在上一节里的流程图有写到,图像绘制的实际渲染发生在某个blitter的blitRect函数中,我们先看一个具体的blitRect实现. void SkARGB32_Shader_Blitter::blitRect(int x, int y, int width, int height) { SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width() && y

Skia深入分析

原文出处:http://blog.csdn.net/hgl868/article/details/45583667 一.渲染层级从渲染流程上分,Skia可分为如下三个层级:1.指令层:SkPicture.SkDeferredCanvas->SkCanvas这一层决定需要执行哪些绘图操作,绘图操作的预变换矩阵,当前裁剪区域,绘图操作产生在哪些layer上,Layer的生成与合并.2.解析层:SkBitmapDevice->SkDraw->SkScan.SkDraw1Glyph::Proc这

Android特效专辑(二)——ViewPager渲染背景颜色渐变(引导页)

Android特效专辑(二)--ViewPager渲染背景颜色渐变(引导页) 首页:http://blog.csdn.net/qq_26787115/article/details/50439020 首页里面也提到过,自己有意做一款杂七杂八的APP,就是自己喜欢什么就加上面,现在本文说的是引导页,我找了很久才觉得可以的开源项目,自己做了一下修改 开源地址:https://github.com/TaurusXi/GuideBackgroundColorAnimation 先来看看效果图吧! 图片用

线段树-区间延迟修改-zoj-1610

Count the Colors Description Painting some colored segments on a line, some previously painted segments may be covered by  some the subsequent ones.  Your task is counting the segments of different colors you can see at last. Input The first line of