[CodeForces 52C]Circular RMQ
评分:省选/NOI-,难度:普及+/提高
这题真的和RMQ没有半点关系,只需要一个裸的线段树,连pushdown都不需要,只需要两种操作:区间修改和区间求最小值,在回溯时加上标记即可,唯一有点思维含量的是对环的处理,如果左端点大于了右端点,就维护(l,n)(1,r),否则正常维护即可,不知道线段树怎么打的可以看我的博客:线段树
下面给出参考代码:
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- struct node
- {
- long long l,r,w,tag;
- }tree[];
- long long n,m,q,x,y,k,ans;
- void build(long long l,long long r,long long k)
- {
- tree[k].l=l;tree[k].r=r;
- if(l==r)
- {
- scanf("%lld",&tree[k].w);
- return;
- }
- long long mid=(l+r)/;
- build(l,mid,k*);
- build(mid+,r,k*+);
- tree[k].w=min(tree[k*].w,tree[k*+].w);
- }
- void add(long long k,long long w,long long ll,long long rr)
- {
- long long l=tree[k].l,r=tree[k].r;
- if(l>=ll&&r<=rr)
- {
- tree[k].tag+=w;
- return;
- }
- //cout<<k<<" "<<l<<" "<<r<<endl;
- long long mid=(l+r)/;
- //cout<<x<<" "<<y<<endl;
- if(ll<=mid)add(k*,w,ll,rr);
- if(rr>mid)add(k*+,w,ll,rr);
- tree[k].w=min(tree[k*].w+tree[k*].tag,tree[k*+].w+tree[k*+].tag);
- return;
- }
- long long query(long long k,long long ll,long long rr)
- {
- if(tree[k].l>=ll&&tree[k].r<=rr)
- {
- return tree[k].w+tree[k].tag;
- }
- if(tree[k].l>rr||tree[k].r<ll)
- {
- return ;
- }
- long long mid=(tree[k].l+tree[k].r)/,lc,rc;
- lc=query(k*,ll,rr);
- rc=query(k*+,ll,rr);
- return min(lc,rc)+tree[k].tag;
- }
- int main()
- {
- cin>>n;
- build(,n,);
- cin>>m;
- for(long long i=;i<=m;i++)
- {
- cin>>x>>y;
- x++;y++;
- char c=getchar();
- if(c=='\n')
- {
- //4 1
- ans=;
- if(x>y)cout<<min(query(,x,n),query(,,y));
- else cout<<query(,x,y);
- cout<<endl;
- }
- else
- {
- cin>>q;
- if(x>y)add(,q,x,n),add(,q,,y);
- else add(,q,x,y);
- }
- }
- return ;
- }
[CodeForces 52C]Circular RMQ的更多相关文章
- CodeForces 52C Circular RMQ(间隔周期段树,间隔更新,间隔总和)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are g ...
- CodeForces 52C Circular RMQ (线段树)
线段树区间更新维护最小值...记得下放标记... 如果线段树上的一个完整区间被修改,那么最小值和最大值增加相应的值后不变, 会改变是因为一部分改变而另外一部分没有改变所以维护一下就好. 询问的时候也要 ...
- codeforces 803G Periodic RMQ Problem
codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...
- 「CF52C」Circular RMQ
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given circular array \(a_0, a_ ...
- CF#52 C Circular RMQ (线段树区间更新)
Description You are given circular array a0, a1, ..., an - 1. There are two types of operations with ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...
- 【CF52C】Circular RMQ(线段树区间加减,区间最值)
给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...
- codeforces 873E(枚举+rmq)
题意 有n(n<=3000)个人参与acm比赛,每个人都有一个解题数,现在要决定拿金牌的人数cnt1,拿银牌的人数cnt2,拿铜牌的人数cnt3,各自对应一个解题数区间[d1,c1],[d2,c ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
随机推荐
- shell 搜索指定目录下所有 jar 文件生成csv文件
虽说比较简单,但希望分享给大家.按需求改成想找的:例如txt,xls 等. 脚本名 扫描的路径 文件名 testFind.sh / testFind.txt (如果未配置环境变量 ./testFi ...
- 使用python3搭建Linux-mariadb主从架构
环境准备两台: 192.168.193.90 master 192.168.193.91 slave 需要Linux装python环境: https://www.cnblogs.com/kingzhe ...
- tuple&dict
# n = (12,[23,56]) # n[1][0] = 89 #元组不可修改,但元组内部的列表内部的元素可以修改,但内部的列表的内部也是元组,则他不可修改 # print(n) # n = (1 ...
- [POI2008]Sta(树形dp)
[POI2008]Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面 ...
- debian系列systemd 配置nodejs服务
1 新建service配置文件 vi /etc/systemd/system/node.service [Unit] Description=My super nodejs app [Service ...
- node.js从入门到放弃《什么是node.js》
1.什么是node.js Node.js是一个后端的Javascript运行环境(支持的系统包括*nux.Windows),这意味着你可以编写系统级或者服务器端的Javascript代码. Node. ...
- 微信 ios img图片不显示问题
使用div标签,将图片作为background .
- CF527E Data Center Drama
链接CF527E Data Center Drama 题目大意:给你一个无向图,要求加最少的边,然后给这些无向图的边定向,使得每一个点的出入度都是偶数. \(n<=10^5,n\leq 2*10 ...
- JavaScript 工作原理之十-使用 MutationObserver 监测 DOM 变化
原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十章. 网络 ...
- centos7标准版命令界面和图形界面相互切换
1.root登陆终端 2.输入命令 vi /etc/inittab ,查看两种界面的启动模式: 3.退出vi模式,,输入命令systemctl get-default 查看当前系统启动模式:我的是命令 ...