Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E
话说这题貌似暴力可A啊。。。
正解是想出来了,结果重构代码,调了不知道多久才A
错误记录:
1.线段树搞混num(节点编号)和l(区间端点)
2.之前的dfs没有分离,写的非常混乱,迫不得已重构代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define N 100000
int data[]={,,,,,,,,,,,,,,
,,,,,,,,,,,,
,,,};
bool ok[];
int sd=;
int n,m;
int d[N+];
vector<pii> qq;
//d[i]表示满足data[j]>(i位置的实际值)的最小j
//线段树中查询出的位置的值表示data[d[i]]-(i位置的实际值)
namespace S
{
#define mid (l+((r-l)>>1))
#define lc (num<<1)
#define rc (num<<1|1)
int minn[*N],sum[*N],delv[*N];
void pd(int num)
{
minn[lc]-=delv[num];minn[rc]-=delv[num];
delv[lc]+=delv[num];delv[rc]+=delv[num];
delv[num]=;
}
void delx(int L,int R,int x,int l,int r,int num)
{
if(L<=l&&r<=R)
{
minn[num]-=x;delv[num]+=x;
return;
}
pd(num);
if(L<=mid) delx(L,R,x,l,mid,lc);
if(mid<R) delx(L,R,x,mid+,r,rc);
minn[num]=min(minn[lc],minn[rc]);
}
void setx(int L,int x,int l,int r,int num)
{
if(l==r) {minn[num]=x;return;}
pd(num);
if(L<=mid) setx(L,x,l,mid,lc);
else setx(L,x,mid+,r,rc);
minn[num]=min(minn[lc],minn[rc]);
}
void setsum(int L,int x,int l,int r,int num)
{
if(l==r) {sum[num]=x;return;}
if(L<=mid) setsum(L,x,l,mid,lc);
else setsum(L,x,mid+,r,rc);
sum[num]=sum[lc]+sum[rc];
}
void update(int l,int r,int num)
{
if(minn[num]>) return;
if(l==r) {qq.pb(mp(l,data[d[l]]-minn[num]));return;}//minn[l]->minn[num]
pd(num);
update(l,mid,lc);update(mid+,r,rc);
minn[num]=min(minn[lc],minn[rc]);
}
int gsum(int L,int R,int l,int r,int num)
{
if(L<=l&&r<=R) return sum[num];
int ans=;
if(L<=mid) ans+=gsum(L,R,l,mid,lc);
if(mid<R) ans+=gsum(L,R,mid+,r,rc);
return ans;
}
void work()
{
for(auto pp:qq)
{
int &l=pp.fi,&d=pp.se;
int p=upper_bound(data,data+sd,d)-data;
setx(l,data[p]-d,,n,);
setsum(l,ok[d],,n,);
::d[l]=p;
}
qq.clear();
}
}
char tmp[];
int main()
{
int i,t,L,R,x;
for(i=;i<sd;i++) ok[data[i]]=;
for(i=;i<sd;i++) data[i+sd]=data[i]+;
sd*=;sort(data,data+sd);
data[sd++]=;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) scanf("%d",&t),qq.pb(mp(i,t));
S::work();
while(m--)
{
scanf("%s",tmp);
if(tmp[]=='c')
{
scanf("%d%d",&L,&R);S::update(,n,);S::work();
printf("%d\n",S::gsum(L,R,,n,));
}
else
{
scanf("%d%d%d",&L,&R,&x);
S::delx(L,R,x,,n,);
}
}
return ;
}
https://codeforces.com/problemset/problem/679/E
跟上面那道类似,可以发现涉及到42的幂很少(显然出题人不是想让我们写高精)
因此开一棵线段树维护每个位置到下一个“关键点”(是否是42的幂的属性变化的点)的距离即可
对于区间修改,就用set维护一下相同的区间,一段相同的放在一起处理
大概是这样吧,可能还有一些细节。。
Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E的更多相关文章
- CF679E Bear and Bad Powers of 42
一段时间不写线段树标记,有些生疏了 codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园 关键点是:42的次幂,在long long范围内 ...
- codeforces 679e Bear and Bad Powers of 42
传送门:http://codeforces.com/contest/679/problem/E 题目意思很清晰,给你一个序列,要求你完成以下三个操作: 1.输出A[i] 2.将[a,b]区间的所有数字 ...
- Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)
Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...
- Codeforces679E. Bear and Bad Powers of 42
传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...
- Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array 分块
E. Lucky Array time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
E. Lucky Array Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers w ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- Codeforces 680D Bear and Tower of Cubes 贪心 DFS
链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...
随机推荐
- Java程序员从笨鸟到菜鸟之(十五)Html基础积累总结(下)
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 一:表格 1.表格的基本语法 <table>...</table> ...
- 理解yarn平台,理解万岁,肤浅理解也万岁~
从Hadoop1到Hadoop2很大程度上解放了Jobtracker资源调度的问题,这就得多亏了yarn平台了.我知道的,除了我们的大豆瓣用的是Mesos,咱们国家可以说应该是99.99%都使用的是y ...
- C# delegate Action<T> lambda表达式
转载以记录:http://blog.csdn.net/educast/article/details/7219854 在使用 Action<T> 委托时,不必显式定义一个封装只有一个参数的 ...
- linux初级学习笔记十:linux grep及正则表达式!(视频序号:04_4)
本节学习的命令:grep 本节学习的技能: grep对文本的匹配 正则表达式的使用 知识点十:grep及正则表达式(4_4) grep,egrep,fgrep: grep: 根据模式搜索文本,并将符合 ...
- [Selenium] IOS 之 appium
从 Selenium 的官方文档来看,推荐用户使用 ios-driver 或 appium 而不是官方发布的 iPone Driver. 他们的地址分别是: http://ios-driver.git ...
- [Selenium] 应对使用 Internet Explorer Driver 多个实例时的 cookie 共享问题
在使用 IEDriverServer 可执行文件时,从理论上来说是可通过它来创建并使用多个同时存在的 Internet Explorer Driver 实例的.但在实际使用过程中,总是会碰到与 coo ...
- 【USACO】 奶牛政坛
[题目链接] 点击打开链接 [算法] tarjan算法求LCA [代码] #include<bits/stdc++.h> #define MAXN 200010 #pragma GOC o ...
- AutoIt: send 命令 VS ControlClick的使用
2008年的时候第一次接触AutoIt,当时觉得局限性太多了,就不想学,觉得把Watir,Ruby搞好就行了. 最近一段时间比较闲,发现自己对GUI的自动化操完全是短板,就把AutoIt重新拾起来了. ...
- GridFS大文件的添加、获取、查看、删除
GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频.高清图片等. 利用GridFS可以简化需求. GridFS会直接利用已经建立的 ...
- 酷版移动端iframe改变src,重新加载页面问题探究
最近在酷版上我要做一个内嵌别人的网页的在线服务页面,于是必须用到iframe,以前我以为移动端不支持iframe呢,原来这样都可以....(呵呵,长见识了!我还是只菜鸟) 直接入正题,说说我遇到的困难 ...