5月月赛(* ̄︿ ̄)
啊啊啊啊啊我讨厌月赛
第一题:30分
很裸的快速幂,结果考的时候成功的把\(k={10^{10^{9}}}\)看成了\(k^{10^9}\),脑子一抽以为可以用long long
存
然后就完美的溢出+\(\color {red}{WA}了\)
其实即使看到了我也不会,我忘记了怎么打快速幂了_(:з」∠)_
神奇的快速幂
第二题:20分
20分,我记得我是只写了lis的基本,没写改编得的_(:з」∠)_
我很完美的想到了0的位置完全可以算出前后的大小差距,然后看能用差距补多少个0
然后我不会了
\(\color {lightblue}{艹}\)
后来看std,凑这不是我的想法吗
\(\huge {完了}\),果然是我太蔡了,正解我都想出来了我居然不会写
我觉得挺好的一篇关于lower_bound的解释
第三题
区间查询,第一时间反应就是线段树(啊啊啊啊std就是线段树然而最可怕的是我忘记线段树了我曾经会的啊啊啊)
那.....我贴个我曾经的\(\color {blue}{线段树}\)模板在这里好了_(:з」∠)_
#include<iostream>
#include<cstring>
#define lson (o<<1)
#define rson ((o<<1)|1)
typedef long long ll;
using namespace std;
struct node{
ll sum;
ll lazyTag;
}t[400010];
ll n,m;
ll a[400010];
/*void build(int o,int l,int r);
void pushUp(int o);
void pushDown(int o,int l,int r);
void modify(int o,int l,int r,int ql,int qr,int k);
void update(int l,int r,int ql,int qr,int k);
void f(int o,int l,int r,int k);
int query(int o,int l,int r,int ql,int qr);*/
void f(ll o,ll l,ll r,ll k)
{
t[o].lazyTag+=k;
t[o].sum+=k*(r-l+1);
}
void pushUp(ll o)
{
t[o].sum=t[lson].sum+t[rson].sum;//sum
// cout<<o<<" "<<t[o].sum<<endl;
}
void pushDown(ll o,ll l,ll r)
{
ll mid=(l+r)>>1;
f(lson,l,mid,t[o].lazyTag);//左
f(rson,mid+1,r,t[o].lazyTag);//右
t[o].lazyTag=0;//标记清零
}
void build(ll o,ll l,ll r)
{
if(l==r)
{
t[o].sum=a[l];
return;
}
ll mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushUp(o);
}
void modify(ll o,ll l,ll r,ll ql,ll qr,ll k)
{
if(ql<=l&&r<=qr)//如果在区间内
{
f(o,l,r,k);
return;
}
pushDown(o,l,r);
ll mid=(l+r)>>1;
if(ql<=mid)
modify(lson,l,mid,ql,qr,k);
if(mid<qr)
modify(rson,mid+1,r,ql,qr,k);
pushUp(o);
}
ll query(ll o,ll l,ll r,ll ql,ll qr)
{
ll res=0;
if(ql<=l&&r<=qr)
return t[o].sum;
ll mid=(l+r)>>1;
pushDown(o,l,r);
if(ql<=mid)
res+=query(lson,l,mid,ql,qr);
if(mid<qr)
res+=query(rson,mid+1,r,ql,qr);
return res;
}
int main()
{
cin>>n;
cin>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int t;
ll x,y,k;
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>t;
switch(t)
{
case 1:
cin>>x>>y>>k;
modify(1,1,n,x,y,k);
break;
case 2:
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
break;
}
}
return 0;
}
\(\huge {真的完了}\)