题目描写叙述:
长度为L个单位的画板,有T种不同的颜料。现要求按序做O个操作,操作分两种:
1.“C A B C”,即将A到B之间的区域涂上颜色C
2.“P A B”。查询[A,B]区域内出现的颜色种类

出现操作2时。请输出答案

PS:初始状态下画板颜色为1

一開始没有想那么好,用int整型位移来取代颜色。还是使用了最传统的bool color[来记录。但是不知道错在了哪里。

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype>#define ll long long#define LL __int64#define eps 1e-8#define inf 0xfffffff//const LL INF = 1LL<<61;using namespace std;//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;const int N = 100000 + 5;typedef struct Node {int color;int l,r;
};Node tree[N * 4];
bool vis[50];void init() {memset(vis,false,sizeof(vis));
}void build(int l,int r,int id) {tree[id].color = 1;tree[id].l = l;tree[id].r = r;if(tree[id].l == tree[id].r)return;int mid = (l + r)/2;build(l,mid,id<<1);build(mid + 1,r,id<<1|1);
}void update(int l,int r,int id,int color) {if(tree[id].l >= l && tree[id].r <= r) {tree[id].color = color;return;}int mid = (tree[id].l + tree[id].r)/2;tree[id].color = -1;if(r <= mid) update(l,r,id<<1,color);else  {if(l > mid)update(l,r,id<<1|1,color);else {update(l,mid,id<<1,color);update(mid+1,r,id<<1|1,color);}}
}void update2(int l,int r,int id) {if(tree[id].color > 0) {vis[tree[id].color] = true;return;}if(tree[id].l == tree[id].r)return;int mid = (tree[id].l + tree[id].r)/2;if(r <= mid) update2(l,r,id<<1);else {if(l > mid)update2(l,r,id<<1|1);else {update2(l,mid,id<<1);update2(mid+1,r,id<<1|1);}}
}int find(int x) {int ans = 0;for(int i=1;i<=x;i++)if(vis[i])ans++;return ans;
}int main() {int n,m,q;while(scanf("%d %d %d",&n,&m,&q) == 3 ){memset(tree,0,sizeof(tree));init();build(1,n,1);while(q--) {char s[2];scanf("%s",s);if(s[0] == 'C') {int x,y,c;scanf("%d %d %d",&x,&y,&c);if(x > y)swap(x,y);update(x,y,1,c);}else {int x,y;scanf("%d %d",&x,&y);init();if(x > y)swap(x,y);update2(x,y,1);printf("%d\n",find(m));}}}return 0;
}

后来看了别人的一下,看到方法不一样,跑了案例也没发现自己的错误,继续检查还是不行。难道真的是方法不行?换了个方法过了。可是上面的代码错误原因还是没有查出来,WA哭

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype>#define ll long long#define LL __int64#define eps 1e-8#define inf 0xfffffff//const LL INF = 1LL<<61;using namespace std;//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;const int N = 100000 + 5;typedef struct Node {int l,r;int color;int flag;
};Node tree[N * 4];void init() {memset(tree,0,sizeof(tree));
}void cal(int id) {tree[id].color = tree[id<<1].color | tree[id<<1|1].color;
}void build(int l,int r,int id) {tree[id].l = l;tree[id].r = r;tree[id].color = 1;tree[id].flag = 1;if(tree[id].l == tree[id].r) return;int mid = (l + r)/2;build(l,mid,id<<1);build(mid+1,r,id<<1|1);
}void cover(int id) {tree[id<<1].color = tree[id].color;tree[id<<1].flag = 1;tree[id<<1|1].color = tree[id].color;tree[id<<1|1].flag = 1;tree[id].flag = 0;
}void updata(int l,int r,int id,int col) {if(l <= tree[id].l && r >= tree[id].r) {tree[id].color = col;tree[id].flag = 1;return;}if(tree[id].color == col)return;if(tree[id].flag)cover(id);int mid = (tree[id].l + tree[id].r)/2;if(r <= mid) updata(l,r,id<<1,col);else if(l > mid)updata(l,r,id<<1|1,col);else {updata(l,mid,id<<1,col);updata(mid+1,r,id<<1|1,col);}cal(id);
}int ans;void query(int l,int r,int id) {if(l <= tree[id].l && r >= tree[id].r) {ans |= tree[id].color;return;}if(tree[id].flag) {ans |= tree[id].color;return;}int mid = (tree[id].l + tree[id].r)/2;if(r <= mid) query(l,r,id<<1);else if(l > mid) query(l,r,id<<1|1);else {query(l,mid,id<<1);query(mid+1,r,id<<1|1);}
}int main() {int n,m,q;while(scanf("%d %d %d",&n,&m,&q) == 3) {init();build(1,n,1);char s[2];while(q--) {scanf("%s",s);if(s[0] == 'C') {int x,y,c;scanf("%d %d %d",&x,&y,&c);if(x > y)swap(x,y);updata(x,y,1,1<<(c-1));//把颜色改成用正向委员算表示}else {int x,y;scanf("%d %d",&x,&y);if(x > y)swap(x,y);ans = 0;query(x,y,1);int cnt = 0;while(ans) {if(ans%2)cnt++;ans /= 2;}printf("%d\n",cnt);}}}return 0;
}

POJ2777 Count Color 线段树区间更新相关推荐

  1. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  2. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  3. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  4. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  5. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  6. Just a Hook(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 In the game of DotA, Pudge's meat hook is actual ...

  7. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,"模拟都市"是他们非常喜欢的一个游戏 ...

  8. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

  9. CDOJ-1057 秋实大哥与花(线段树区间更新)

    秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

最新文章

  1. 沉痛哀悼!现代无线网络之父 Norman Abramson 辞世,享年 88 岁
  2. 给web请求加遮罩动画
  3. equals 与==的不同
  4. 【Auto.js】[系统Intent]_系统设置页面的相关intent跳转
  5. 如何使用Notepad++格式化XML文件
  6. MySQL学习之路 一 : MySQL 5.7.19 源码安装
  7. 启动hadoop遇到的datanode启动不了
  8. win10背景色改成豆沙绿,解决锁屏后失效方法
  9. MyBatis【钢镚核恒】
  10. airtest基本介绍
  11. SQL数据库置疑数据怎么恢复
  12. 发起http请求raw格式
  13. 广东取消英语和计算机考试,广东停考全国英语等级考试、全国计算机等级考试...
  14. JAVA用Math 给pi赋值_导入Math.PI作为参考或值
  15. 《痞子衡嵌入式半月刊》 第 19 期
  16. RN8209C单相电量计量芯片调试记录
  17. c++ 编译添加dll_(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一)...
  18. 富士康代工变弱?苹果倒戈和硕
  19. Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)
  20. 简单快速建立pytorch环境YOLOv5目标检测 模型跑起来(超简单)

热门文章

  1. php yield 个人小解_php 技术 yield 问题
  2. 中国CMOS图像传感器行业运行状况与应用前景调研报告2022版
  3. redmine上传大文件报错Request Entity Too Large
  4. UpdateLayeredWindow 绘制异型窗口
  5. 花生增产对话万书波-农业大健康·万祥军:获山东科技最高奖
  6. 错误: 找不到或无法加载主类com.**.**
  7. C#构造函数、私有构造函数、静态构造函数与构造函数执行顺序
  8. django 的 一对多的关系
  9. Python 增删改查
  10. c#之Redis实践list,hashtable