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的更多相关文章

  1. CF679E Bear and Bad Powers of 42

    一段时间不写线段树标记,有些生疏了 codeforces 679e Bear and Bad Powers of 42 - CHADLZX - 博客园 关键点是:42的次幂,在long long范围内 ...

  2. codeforces 679e Bear and Bad Powers of 42

    传送门:http://codeforces.com/contest/679/problem/E 题目意思很清晰,给你一个序列,要求你完成以下三个操作: 1.输出A[i] 2.将[a,b]区间的所有数字 ...

  3. Codeforces 679E - Bear and Bad Powers of 42(线段树+势能分析)

    Codeforces 题目传送门 & 洛谷题目传送门 这个 \(42\) 的条件非常奇怪,不过注意到本题 \(a_i\) 范围的最大值为 \(10^{14}\),而在值域范围内 \(42\) ...

  4. Codeforces679E. Bear and Bad Powers of 42

    传送门 今天子帧的一套模拟题的T3. 考试的时候其实已经想到了正解了,但是一些地方没有想清楚,就没敢写,只打了个暴力. 首先考虑用线段树维护区间信息. 先把每个值拆成两个信息,一是距离他最近的且大于他 ...

  5. 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 ...

  6. 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 ...

  7. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  8. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  9. Codeforces 680D Bear and Tower of Cubes 贪心 DFS

    链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...

随机推荐

  1. openwrt procd

    接着前面写过的一篇关于 procd 的笔记. procd 在 STATE_INIT 时会运行 /etc/inittab 中描述的几个级别指定程序. procd_inittab_run("re ...

  2. mysql下distinct和group by区别对比

    在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...

  3. 基于第三方微信授权登录的iOS代码分析

    本文转载至 http://www.cocoachina.com/ios/20140922/9715.html 微信已经深入到每一个APP的缝隙,最常用的莫过分享和登录了,接下来就以代码的形式来展开微信 ...

  4. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo DP+矩阵快速幂加速

    E. Okabe and El Psy Kongroo     Okabe likes to take walks but knows that spies from the Organization ...

  5. SSM整理笔记3——配置解析

    github:https://github.com/lakeslove/SSM 项目的目录结构如下 首先,配置web.xml <?xml version="1.0" enco ...

  6. Phoenix put the sql back in NoSql

    Overview | Apache Phoenix http://phoenix.apache.org/index.html Apache Phoenix enables OLTP and opera ...

  7. What is the difference between message queue pattern and publish-subscribe?

    What is the difference between message queue pattern and publish-subscribe? - Quora https://www.quor ...

  8. C语言中的声明与定义的差别

    1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...

  9. eclipse4.3 解决没有check out as maven project

    最近想工作之余写点测试demo,习惯了公司的开发环境,便决定自己搭建开发环境,首先是找到好用的eclipse,就是能够使用eclipse创建maven project工程,该工程能够被eclipse的 ...

  10. HDU2476 String painter —— 区间DP

    题目链接:https://vjudge.net/problem/HDU-2476 String painter Time Limit: 5000/2000 MS (Java/Others)    Me ...