这道题是看了别人的思路才做出来的。

刚看完这道题没什么思路,线段的长度是10^5,操作指令数是10^5,还要记录不同颜色种类数,觉着怎么写肯定都是要超时。我当时在节点里增加了一个数组记录已经出现的颜色数,硬着头皮写了一个代码,提交后无悬念TLE。后来又想着单纯的做一个延迟标记,让更新的节点效率达到最高,访问的话直接在一次访问中访问所有的叶节点,这样的话相当于增加了查询的消耗,降低了更新的消耗。想了想,觉得这样虽然能提高不少效率,但是离能过还有段儿距离。

我去看了一下别人的代码,看到这个思路,这个思路跟我第二次的想法有点儿类似,不过做了一个很强大的优化,如果节点中的num是-1的话,表示在这个节点下面有多种颜色,需要往下查询,如果num不为-1,则这个节点下面只有一种颜色,颜色的值即num的值。

非常精彩的优化。

#include<stdio.h>
#include<string.h>
#define N 100005
struct node
{
int x,y;
int num;
}a[N*3];
int mark[35];
void CreatTree(int t,int x,int y)
{
a[t].x=x;
a[t].y=y;
a[t].num=1;
if(x==y)
return ;
int temp=t*2;
int mid=(x+y)/2;
CreatTree(temp,x,mid);
CreatTree(temp+1,mid+1,y);
return ;
}
void InsertTree(int t,int x,int y,int k)
{
if(a[t].x==x&&a[t].y==y)
{
a[t].num=k;
return ;
}
int temp=t*2;
int mid=(a[t].x+a[t].y)/2;
if(a[t].num==k)
return ;
if(a[t].num!=-1)
{
a[temp].num=a[t].num;
a[temp+1].num=a[t].num;
a[t].num=-1;
}
if(y<=mid)
InsertTree(temp,x,y,k);
else if(x>mid)
InsertTree(temp+1,x,y,k);
else
{
InsertTree(temp,x,mid,k);
InsertTree(temp+1,mid+1,y,k);
}
return ;
}
void FindTree(int t,int x,int y)
{
if(a[t].num!=-1)
{
mark[a[t].num]=1;
return ;
}
int temp=t*2;
int mid=(a[t].x+a[t].y)/2;
if(y<=mid)
FindTree(temp,x,y);
else if(x>mid)
FindTree(temp+1,x,y);
else
{
FindTree(temp,x,mid);
FindTree(temp+1,mid+1,y);
}
return ;
}
int main()
{
int n,m,t;
while(scanf("%d%d%d",&n,&t,&m)!=EOF)
{
CreatTree(1,1,n);
char s[5];
int x,y,z;
while(m--)
{
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d",&x,&y,&z);
int temp;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
InsertTree(1,x,y,z);
}
else
{
scanf("%d%d",&x,&y);
int temp;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
int i,sum;
sum=0;
memset(mark,0,sizeof(mark));
FindTree(1,x,y);
for(i=1;i<=t;i++)
if(mark[i])
sum++;
printf("%d\n",sum);
}
}
}
return 0;
}

hdu 2777(线段树)的更多相关文章

  1. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  10. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. Selenium自动化测试(java语言)

    Selenium介绍 Selenium 1.0 包含 core. IDE. RC. grid 四部分,  selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化( OOPP) 和便于 ...

  2. linux shell 札记

    shell 数组 数组索引: 单个元素索引: ${array[n]} 全部元素:   ${array[*]}  或者  ${array[@]} 部分索引: ${array[2:]} 数组所有元素统一加 ...

  3. python显示当前时间

    import time time.strftime("%Y%m%d %X", time.localtime()) #当前时区 time.strftime("%Y%m%d ...

  4. 【Chromium中文文档】进程模型

    进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Process_ ...

  5. linux win7双系统

    真恨我自己啊,刚在linux下写了这个博客,因为没有分类,添加了个linux分类.按了F5刷没了.靠,哪里有心情复述啊 一直想装直接装linux系统,现在实现他,以后也要跟上linux的笔记,不然都对 ...

  6. jQuery 之 $.get、$.post、$.getJSON、$.ajax

    对 JSTL标签 加以巩固,同时在自己的博客中与之分享: http://app.yinxiang.com/shard/s20/sh/76feadb0-957a-40bc-895d-4d28025ce2 ...

  7. DRAM与NAND Flash产业六大趋势预测分析

    集邦科技(TrendForce)旗下的分析部门DRAMeXchange的研究,针对对DRAM与NANDFlash产业的长久观察下,提出了对2012-2015年间产业发展的六大趋势预测:     趋势一 ...

  8. Android 获取屏幕分辨率

    原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下:        // 通过WindowManager获取        DisplayMetrics dm = new Displ ...

  9. C语言入门(2)——安装VS2013开发环境并编写第一个C语言程序

    在C语言入门系列中,我们使用Visual studio 2013 Professional作为开发工具.本篇详细介绍如何安装Visualstudio 2013 Professional并写出我们第一个 ...

  10. 2016 Multi-University Training Contest 3 总结

    又是多校总结时间. 这两天重感冒,精神不佳,总结一拖再拖,结果到了多校第四场结束后回来总结第三场.不过因为还在补第三场的题,所以还是记得挺清楚的 欣君说决定自己AFK试试,于是全程读题算公式. 欣君翻 ...