P1558 色板游戏 线段树(区间修改,区间查询)

题意:

给n,m,k,n长度,k个操作,m种颜色

操作C:输入A,B,C,区间【A,B】变成C颜色,可能A>B,所以要确保A<B

操作P:输入A,B,区间【A,B】的颜色种类

思路:

因为颜色只有30种,可以用位运算,然后进行lazy标记

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 998244353
10 const int maxn=1e6+10;
11 int n,m,k;
12 int tree[maxn],lazy[maxn];
13 il void pushdown(int x){
14     if(lazy[x]){
15         tree[x<<1]=lazy[x];tree[x<<1|1]=lazy[x];
16         lazy[x<<1]=lazy[x];lazy[x<<1|1]=lazy[x];
17         lazy[x]=0;
18     }
19 }
20 il void pushup(int x){
21     tree[x]=tree[x<<1]|tree[x<<1|1];
22 }
23 void build(int x,int l,int r){
24     if(l==r){
25         tree[x]=1;return;
26     }
27     int mid=(l+r)>>1;
28     build(x<<1,l,mid);
29     build(x<<1|1,mid+1,r);
30     pushup(x);
31 }
32 void update(int x,int l,int r,int l1,int r1,int zhi){
33     if(l1<=l && r<=r1){
34         pushdown(x);
35         int w=(ll)1<<(zhi-1);
36         lazy[x]=w;tree[x]=w;
37         return;
38     }
39     pushdown(x);
40     int mid=(l+r)>>1;
41     if(l1<=mid){
42         update(x<<1,l,mid,l1,r1,zhi);
43     }
44     if(r1>mid){
45         update(x<<1|1,mid+1,r,l1,r1,zhi);
46     }
47     pushup(x);
48 }
49 int query(int x,int l,int r,int l1,int r1){
50     if(l1<=l && r<=r1){
51        return tree[x];
52     }
53     pushdown(x);
54     int temp=0;
55     int mid=(l+r)>>1;
56     if(l1<=mid){
57         temp|=query(x<<1,l,mid,l1,r1);
58     }
59     if(r1>mid){
60         temp|=query(x<<1|1,mid+1,r,l1,r1);
61     }
62     return temp;
63 }
64 int main(){
65     char c;
66     scanf("%d%d%d",&n,&m,&k);
67     build(1,1,n);
68     for(it i=0;i<k;i++){
69         //getchar();
70         scanf("%s",&c);
71         if(c==‘C‘){
72             int A,B,C;
73             scanf("%d%d%d",&A,&B,&C);
74             if(A>B){swap(A,B);}
75             update(1,1,n,A,B,C);
76         }
77         else{
78              int A,B;
79             scanf("%d%d",&A,&B);
80             if(A>B){swap(A,B);}
81             int sum=query(1,1,n,A,B),ans=0;
82             for(it j=0;j<m;j++){
83                 if(sum&(1<<j)){ans++;}
84             }
85             printf("%d\n",ans);
86         }
87     }
88     return 0;
89 }

这道题我wa了一个晚上,调了一个晚上,自闭了一个晚上

第二天早上,重写还是wa,实在是搞不定了,去看了题解。感觉没差,然后把题解交上ac????

然后照着题解写了一边又wa,???最后在讨论区瞧见了一个解释……

我举报这题坑爹。不过让我涨了%c %s getchar()的认知

这题用getchar();scanf("%c",&c);就是wa到死

换成scanf(" %c",&c);或者scanf("%s",&c);就AC

从未考虑这一块的我理所当然的用了getchar();还拼命找错,记住了

原文地址:https://www.cnblogs.com/luoyugongxi/p/12331151.html

时间: 2024-10-25 03:02:04

P1558 色板游戏 线段树(区间修改,区间查询)的相关文章

hdu1698 Just a Hook(线段树+区间修改+区间查询+模板)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 54923    Accepted Submission(s): 25566 Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of

SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot solve but get Wrong Answer from most of the OI problems. And he refuse to write two program of same kind at all. So he always failes in contests. When

【模板】线段树 区间修改+区间查询

题目大意:维护一个长度为 N 的序列,支持区间修改.区间查询两种操作. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; inline int read(){ int x=0,f=1;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch)); do{x=x*10+ch-'0';ch=getchar();}while(isdigit(

hihocoder1080线段树+区间修改+区间查询+多个懒标记

题目链接:http://hihocoder.com/problemset/problem/1080 对于这种不止一个懒标记的线段树,只要弄清楚各种操作和各种懒标记间的关系就OK了. 我的代码: 1 #include <cstdio> 2 3 using namespace std; 4 5 #define MAXN 100005 6 7 int p[MAXN]; 8 9 struct segNode 10 { 11 int left, right, sum, dd, vv; 12 bool l

A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询

//add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点) // #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int N = 100010; int n, m; int w[N]; struct Node { int l, r;

poj 2777 Count Color(线段树区间修改)

题目链接:http://poj.org/problem?id=2777 题目意思:就是问你在询问的区间里有几种不同的颜色 思路:这题和一般的区间修改差不多,但是唯一不同的就是我们要怎么计算有种颜色,所以这时候我们就需要把延时标记赋予不同的意义,当某段区间有多种颜色时就赋值为-1,当为一种颜色时就把它赋值为这个颜色的号数.这儿我们要怎么统计询问区间不同的颜色数叻,为了不重复计算同一种颜色,那么我们就需要用一个数组来标记计算过的颜色,当我们下次遇到时就不需要再次计算了.... 代码核心处就在计数那儿

hdu-5023 A Corrupt Mayor&#39;s Performance Art (线段树区间修改)

今天集训队打比赛的一道题,很明显是个线段树,我们队照着lrj蓝书敲了一通,机智的将修改值和加和改成了位运算:|= 但是好像哪里出了点小问题,就是不对,赛后又水了一遍,竟然过了...发现还是lrj的书好啊,市面上的模板一点也不好用,连区间修改都没有 . 等集训完了要静心好好系统的学习一下线段树 . 多看多刷lrj的书 . 细节参见代码: #include<bits/stdc++.h> using namespace std; const int maxn = 1000000 + 5; int n

【线段树区间修改】fzu2105Digits Count

/* 题意: 给出数组A,有以下几个操作: 1: AND(opn, L, R):把区间[L, R]中的元素A[i]改为A[i] & opn;;;;;; 2: OR(opn, L, R) :把区间[L, R]中的元素A[i]改为A[i] | opn;;;;;;; 3: XOR(opn, L, R):把区间[L, R]中的元素A[i]改为A[i] ^ opn;;;;;;; 4: SUM(L, R) :对区间[L, R]中的元素求和:::: ------------------------------

Wikilo 1191线段树区间修改单点查询

这题也算比较容易的了. 如果哪个区间已经没有黑色的话,就不用update了,就是因为这个原因WA了2发,唉-- #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #incl