LightOJ 1135 - Count the Multiples of 3 线段树
http://www.lightoj.com/volume_showproblem.php?problem=1135
题意:给定两个操作,一个对区间所有元素加1,一个询问区间能被3整除的数有多少个。
思路:要求被3整除,我们可以记录3个状态,当前区间模3余1的 余2的 余0的,那么对一个数增加的时候,直接交换不同余数下的个数就可以了。
/** @Date : 2016-12-06-20.00
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version :
*/ #include<bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; struct yuu
{
int l, r;
int add;
int m0, m1, m2;
}tt[N << 2]; void pushup(int p)
{
tt[p].m0 = tt[p << 1].m0 + tt[p << 1 | 1].m0;
tt[p].m1 = tt[p << 1].m1 + tt[p << 1 | 1].m1;
tt[p].m2 = tt[p << 1].m2 + tt[p << 1 | 1].m2;
} void pushdown(int p)
{
if(tt[p].add != 0)
{
tt[p].add %= 3;
///
tt[p << 1].add += tt[p].add;
if(tt[p].add == 2)
{
swap(tt[p << 1].m0 , tt[p << 1].m1);
swap(tt[p << 1].m0 , tt[p << 1].m2);
}
else if(tt[p].add == 1)
{
swap(tt[p << 1].m0 , tt[p << 1].m2);
swap(tt[p << 1].m1 , tt[p << 1].m0);
}
///
tt[p << 1 | 1].add += tt[p].add;
if(tt[p].add == 2)
{
swap(tt[p << 1 | 1].m0 , tt[p << 1 | 1].m1);
swap(tt[p << 1 | 1].m0 , tt[p << 1 | 1].m2);
}
else if(tt[p].add == 1)
{
swap(tt[p << 1 | 1].m0 , tt[p << 1 | 1].m2);
swap(tt[p << 1 | 1].m1 , tt[p << 1 | 1].m0);
}
tt[p].add = 0;
}
} void build(int l, int r, int p)
{
tt[p].l = l;
tt[p].r = r;
tt[p].add = tt[p].m0 = tt[p].m2 = tt[p].m1 = 0;
if(l == r)
{
tt[p].m0 = 1;
return ;
}
int mid = (l + r) >> 1;
build(l , mid, p << 1);
build(mid + 1, r, p << 1 | 1);
pushup(p);
} void updata(int l, int r, int v, int p)
{
if(l <= tt[p].l && r >= tt[p].r)
{
tt[p].add += v;
swap(tt[p].m0 , tt[p].m2);
swap(tt[p].m1 , tt[p].m0);
return ;
}
pushdown(p);
int mid = (tt[p].l + tt[p].r) >> 1;
if(l <= mid)
updata(l, r, v, p << 1);
if(r > mid)
updata(l, r, v, p << 1 | 1);
pushup(p);
} int query(int l, int r, int p)
{
if(l <= tt[p].l && r >= tt[p].r)
{
return tt[p].m0;
}
pushdown(p);
int mid = (tt[p].l + tt[p].r) >> 1;
int ans = 0;
if(l <= mid)
ans += query(l, r, p << 1);
if(r > mid)
ans += query(l, r, p << 1 | 1);
return ans;
}
int main()
{
int T;
int cnt = 0;
cin >> T;
while(T--)
{
int n, q;
scanf("%d%d", &n, &q);
build(1, n, 1);
printf("Case %d:\n", ++cnt);
while(q--)
{
int t, x, y;
scanf("%d%d%d", &t ,&x ,&y);
if(t)
printf("%d\n", query(x+1, y+1, 1));
else
updata(x+1, y+1, 1, 1);
}
}
return 0;
}
LightOJ 1135 - Count the Multiples of 3 线段树的更多相关文章
- 1135 - Count the Multiples of 3
1135 - Count the Multiples of 3 PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limi ...
- POJ - 2777——Count Color(懒标记线段树二进制)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53639 Accepted: 16153 Des ...
- BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 9280 Solved: 2421 ...
- ZOJ 1610 Count the Colors【题意+线段树区间更新&&单点查询】
任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 ...
- kuangbin专题七 ZOJ1610 Count the Colors (灵活线段树)
Painting some colored segments on a line, some previously painted segments may be covered by some th ...
- F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)
题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树 但是没有push_up 最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段 思路是 ...
- FZU 2105 Digits Count(按位维护线段树)
[题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...
- 【bzoj3956】Count 单调栈+可持久化线段树
题目描述 输入 输出 样例输入 3 2 0 2 1 2 1 1 1 3 样例输出 0 3 题解 单调栈+可持久化线段树 本题是 bzoj4826 的弱化版(我为什么做题总喜欢先挑难的做QAQ) $k$ ...
- HDU 6155 Subsequence Count (DP、线性代数、线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6155 题解 DP+线代好题.(考场上过多时间刚前两题,没怎么想这题--) 首先列出一个DP式: 设\( ...
随机推荐
- 【转】Linux内核结构详解
Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信. 1.进程调度 (SCHED):控制进程对CPU的访问.当需要选择下一个进程运行时,由调度程序选择最值得运行 ...
- 阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...
- python中装饰器的原理以及实现,
python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...
- 关于命令行参数argv(《学习OpenCV》)
在<学习OpenCV>这本书中,很多示例代码都用到了命令行参数.作为新手,之前总是很困扰,不知道怎么用.偶然的机会终于略知一二了. 在Visual Studio中,我们可以自行设置命令行参 ...
- 某一线互联网公司前端面试题总结css部分
1,css3选择器 :not(selector) 选择页面内所有type!=text的类型: input:not([type=text]){ color: red; font-weight: bold ...
- Ajax在jQuery中的应用(加载异步数据、请求服务器数据)
加载异步数据 jQuery中的load()方法 load(url,[data],[callback]) url:被加载的页面地址 [data]:可选项表示发送到服务器的数据,其格式为 key/valu ...
- deep learning3
9.3.Restricted Boltzmann Machine (RBM)受限玻尔兹曼基 假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所 ...
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- 【bzoj3142】[Hnoi2013]数列 数学
题目描述 求满足 $1\le a_i\le n\ ,\ 1\le a_{i+1}-a_i\le m$ 的序列 $a_1...a_k$ 的个数模 $p$ 的值. 输入 只有一行用空格隔开的四个数:N.K ...
- 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组+离散化
题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. John的牛奶按质量可以被赋予一 ...