noip基础数据结构太多了又太捞了 所以也就那么几个了

单调队列滑动窗口

 #include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
struct node{int id,val;};
int n,m,k,l,a,b,c,mx[maxn],ma[maxn];
deque<node>q1;deque<node>q2;
int main(){cin>>n>>m;
for(int i=;i<=n;i++){cin>>a;
while(!q1.empty()&&q1.back().id<i-m+)q1.pop_back();
while(!q2.empty()&&q2.back().id<i-m+)q2.pop_back();
while(!q1.empty()&&q1.front().val<a)q1.pop_front();
q1.push_front({i,a});
while(!q2.empty()&&q2.front().val>a)q2.pop_front();
q2.push_front({i,a});
if(i>=k)mx[i]=q1.back().val,ma[i]=q2.back().val;
}for(int i=m;i<=n;i++)cout<<ma[i]<<" ";cout<<endl;
for(int i=m;i<=n;i++)cout<<mx[i]<<" ";
}

线段树1

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
ll n,m,k,l,a,b,c,d,tree[maxn*],lazy[maxn*],s[maxn];
#define lson (node<<1)
#define rson (lson|1)
void build(int node,int l,int r){
if(l==r){tree[node]=s[l];return ;}int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);tree[node]=tree[lson]+tree[rson];
}
void pushup(int node,int l,int r){if(lazy[node]==){return ;}
int mid=(l+r)>>;
tree[lson]+=lazy[node]*(mid-l+);tree[rson]+=lazy[node]*(r-mid);
lazy[lson]+=lazy[node],lazy[rson]+=lazy[node];lazy[node]=;
}
void add(int node,int l,int r,int x,int y,int k){
if(l==x&&y==r){tree[node]+=k*(r-l+);lazy[node]+=k;return ;}
int mid=(l+r)>>;pushup(node,l,r);
if(y<=mid)add(lson,l,mid,x,y,k);else if(x>=mid+)add(rson,mid+,r,x,y,k);
else add(lson,l,mid,x,mid,k),add(rson,mid+,r,mid+,y,k);
tree[node]=tree[lson]+tree[rson];
}
ll query(int node,int l,int r,int x,int y){
if(l==x&&y==r){return tree[node];}
int mid=(l+r)>>;pushup(node,l,r);
if(y<=mid)return query(lson,l,mid,x,y);else if(x>=mid+)return query(rson,mid+,r,x,y);
else return query(lson,l,mid,x,mid)+query(rson,mid+,r,mid+,y);
}
int main(){
cin>>n>>m;for(int i=;i<=n;i++)cin>>s[i];build(,,n);
for(int i=;i<=m;i++){
cin>>a;if(a==){
cin>>a>>b>>c;add(,,n,a,b,c);
}else{
cin>>a>>b;cout<<query(,,n,a,b)<<endl;
}
}
}

线段树2

 #include<iostream>
#include<cstdio>
#define ll long long
#define lson (node<<1)
#define rson ((node<<1)+1)
using namespace std;
const int maxn=;
int n,m;
ll tree[maxn*],lazy_product[maxn*];
ll lazy_sum[maxn*];
ll s[maxn],p;
void build(int node,int l,int r){lazy_product[node]=;
if(l==r){tree[node]=s[l];return;}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
tree[node]=tree[lson]+tree[rson];
} void pushdown(int node,int l,int r,int mid){
tree[lson]*=lazy_product[node];tree[rson]*=lazy_product[node];
tree[lson]+=(mid-l+)*lazy_sum[node];tree[rson]+=(r-mid)*lazy_sum[node];
tree[lson]%=p;tree[rson]%=p;
lazy_product[lson]*=lazy_product[node];lazy_product[rson]*=lazy_product[node];
lazy_sum[lson]*=lazy_product[node];lazy_sum[rson]*=lazy_product[node];
lazy_sum[lson]+=lazy_sum[node];lazy_sum[rson]+=lazy_sum[node];
lazy_sum[lson]%=p;lazy_sum[rson]%=p;
lazy_product[lson]%=p;lazy_product[rson]%=p;
lazy_sum[node]=;lazy_product[node]=;
}
void add(int node,int l,int r,int x,int y,int val){
if(x==l&&r==y){tree[node]+=(r-l+)*val,tree[node]%=p,lazy_sum[node]+=val;return;}
int mid=(l+r)>>;pushdown(node,l,r,mid);
if(y<=mid)add(lson,l,mid,x,y,val);
else if(x>=mid+)add(rson,mid+,r,x,y,val);
else{add(lson,l,mid,x,mid,val);add(rson,mid+,r,mid+,y,val);}
tree[node]=tree[lson]+tree[rson];tree[node]%=p;
} void product(int node,int l,int r,int x,int y,int val){
if(x==l&&r==y){tree[node]*=val;tree[node]%=p;lazy_product[node]*=val;lazy_product[node]%=p;
lazy_sum[node]*=val;lazy_sum[node]%=p;return;
}int mid=(l+r)>>;pushdown(node,l,r,mid);
if(y<=mid)product(lson,l,mid,x,y,val);
else if(x>=mid+)product(rson,mid+,r,x,y,val);
else product(lson,l,mid,x,mid,val),product(rson,mid+,r,mid+,y,val);
tree[node]=tree[lson]+tree[rson];tree[node]%=p;
} ll find(int node,int l,int r,int x,int y){
if(x==l&&r==y)return tree[node]%p;
int mid=(l+r)>>;pushdown(node,l,r,mid);
if(y<=mid)return find(lson,l,mid,x,y);
if(x>=mid+)return find(rson,mid+,r,x,y);
return (find(lson,l,mid,x,mid)+find(rson,mid+,r,mid+,y))%p;
} int main(){cin>>n>>m>>p;
for(int i=;i<=n;i++)scanf("%d",&s[i]);
build(,,n);
for(int i=;i<=m;i++){int a;cin>>a;
if(a==){int x,y,k;
scanf("%d%d%d",&x,&y,&k);
product(,,n,x,y,k);
}if(a==){int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(,,n,x,y,k);
}if(a==){int x,y;
scanf("%d%d",&x,&y);
cout<<find(,,n,x,y)%p<<endl;
}
}return ;
}

最新文章

  1. IntelliJ IDEA使用(一):创建maven web项目
  2. Linux下基于vsftpd搭建ftp服务器
  3. JavaScript中的apply和call函数详解(转)
  4. RTTI: dynamic_cast typeid
  5. flask-cors
  6. PHP之:PHP框架
  7. 微信订阅号里实现oauth授权登录,并获取用户信息 (完整篇)
  8. 软件开发之路、Step 1 需求分析
  9. arm_cm4.c关于kinetis的修改
  10. ASP.NET 免费开源控件
  11. Java设计模式13:常用设计模式之桥接模式(结构型模式)
  12. JS中,如何查询一个对象的所有属性
  13. innerText和innerHTML的区别
  14. BZOJ 1123: [POI2008]BLO( tarjan )
  15. 走进 Visual Studio Mobile Center for Xamarin.Forms
  16. 防盗链[referer]
  17. 基于netty框架的Socket传输
  18. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT
  19. 源码安装python +NGINX 的坎坷路 +uwsgi安装 部署django 的CRM项目
  20. Python中斐波那契数列的赋值逻辑

热门文章

  1. IT兄弟连 JavaWeb教程 EL表达式中的内置对象
  2. 日志组件Log2Net的介绍和使用(附源码开源地址)
  3. 【BZOJ4548】小奇的糖果
  4. 最长XX序列问题小结 By cellur925
  5. cmd - 命令行窗口中文乱码
  6. python selenium模块调用浏览器的时候出错
  7. Jquery | 基础 | html()
  8. 牛客寒假6-D.美食
  9. nginx之location简单匹配总结
  10. python+selenium 页面中存在选项卡时,获取页面内容的小技巧