1. CF558E A Simple Task

题意:

给定由小写字母组成的字符串 \(s\) 每一次操作如下:

  • \(opt=0\) :将 \([l,r]\) 降序排序

  • \(opt=1\) :将 \([l,r]\) 升序排序

输出最终字符串

题解:

大致思想为,建 \(26\) 棵线段树,代表每一种字母。

操作:区间查询出每一种字母的个数,记为 \(cnt[c]\) 。

排序:按照 从 \(a\) 至 \(z\)从 \(z\) 至 \(a\) 依次向后覆盖 \(cnt[i]\) 个位置 。

输出答案:对于每一位,枚举 \([a,z]\) ,找出覆盖这一位的字母 。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Maxn 100005
#define Maxc 27
int n,m;
struct Tree
{int sum,ch_laz;
}tree[Maxc][Maxn<<2];
int cnt[Maxc];
void build(int opt,int p,int nl,int nr)
{tree[opt][p].ch_laz=-1;if(nl==nr) return;int mid=(nl+nr)>>1;if(mid>=nl) build(opt,p<<1,nl,mid);if(mid<nr) build(opt,p<<1|1,mid+1,nr);
}
void pushdown(int opt,int p,int nl,int nr)
{if(tree[opt][p].ch_laz==-1) return;int mid=(nl+nr)>>1;tree[opt][p<<1].sum=(mid-nl+1)*tree[opt][p].ch_laz;tree[opt][p<<1|1].sum=(nr-mid)*tree[opt][p].ch_laz;tree[opt][p<<1].ch_laz=tree[opt][p<<1|1].ch_laz=tree[opt][p].ch_laz;tree[opt][p].ch_laz=-1;
}
void pushup(int opt,int p)
{tree[opt][p].sum=tree[opt][p<<1].sum+tree[opt][p<<1|1].sum;
}
void change(int opt,int p,int nl,int nr,int l,int r,int x)
{if(nl>=l && nr<=r){tree[opt][p].sum=(nr-nl+1)*x;tree[opt][p].ch_laz=x;return;}pushdown(opt,p,nl,nr);int mid=(nl+nr)>>1;if(mid>=l) change(opt,p<<1,nl,mid,l,r,x);if(mid<r) change(opt,p<<1|1,mid+1,nr,l,r,x);pushup(opt,p);
}
int query(int opt,int p,int nl,int nr,int l,int r)
{if(nl>=l && nr<=r) return tree[opt][p].sum;pushdown(opt,p,nl,nr);int mid=(nl+nr)>>1,ret=0;if(mid>=l) ret+=query(opt,p<<1,nl,mid,l,r);if(mid<r) ret+=query(opt,p<<1|1,mid+1,nr,l,r);pushup(opt,p);return ret;
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);cin>>n>>m;for(int i=0;i<26;i++) build(i,1,1,n);char x;for(int i=1;i<=n;i++) cin>>x,change(x-'a',1,1,n,i,i,1);for(int i=1,l,r,k;i<=m;i++){cin>>l>>r>>k;memset(cnt,0,sizeof(cnt));if(k){for(int i=0;i<26;i++) cnt[i]=query(i,1,1,n,l,r),change(i,1,1,n,l,r,0);for(int i=0,pos=l;i<26;i++) if(cnt[i]) change(i,1,1,n,pos,pos+cnt[i]-1,1),pos+=cnt[i];}else{for(int i=25;i>=0;i--) cnt[i]=query(i,1,1,n,l,r),change(i,1,1,n,l,r,0);for(int i=25,pos=l;i>=0;i--) if(cnt[i]) change(i,1,1,n,pos,pos+cnt[i]-1,1),pos+=cnt[i];}}for(int i=1;i<=n;i++) for(int j=0;j<26;j++)if(query(j,1,1,n,i,i)) { printf("%c",j+'a'); break; }printf("\n");//fclose(stdin);//fclose(stdout);return 0;
}

2. P2824 [HEOI2016/TJOI2016]排序

题意:

给定由 \([1,n]\) 组成的排列,每一次操作如下:

  • \(opt=0\) :将 \([l,r]\) 升序排序

  • \(opt=1\) :将 \([l,r]\) 降序排序

最后输出第 \(Pos\) 位的值。

题解:

与上一题不同的是:这里有 \(n\) 种元素,但是只用查询一位的值 。

考虑二分答案!!

二分第 \(Pos\) 位的取值,将大于等于 \(mid\) 的值都改为 \(1\) ,将小于 \(mid\) 的值都改为 \(0\) ,离线进行一遍所有操作。

若操作完后第 \(Pos\) 位为 \(1\) ,则 \(ans\ge mid\) ,否则 \(ans<mid\) 。

注意:(代码第 \(72\) 行)

cnt=query(1,1,n,l[i],r[i]); 中, \(cnt\) 的可能为 \(0\) ,在接下来的覆盖中可能会出现 \(l>r\) ,应该及时判断 。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Maxn 100005
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int n,m,Pos,L,R,ans;
int a[Maxn],tmp[Maxn],opt[Maxn],l[Maxn],r[Maxn];
struct Data
{int sum,laz;
}tree[Maxn<<2];
void pushup(int p)
{tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
}
void pushdown(int p,int nl,int nr)
{if(tree[p].laz!=-1){int mid=(nl+nr)>>1;tree[p<<1].sum=(mid-nl+1)*tree[p].laz;tree[p<<1|1].sum=(nr-mid)*tree[p].laz;tree[p<<1].laz=tree[p<<1|1].laz=tree[p].laz;tree[p].laz=-1;}
}
void build(int p,int nl,int nr)
{tree[p].sum=0,tree[p].laz=-1;if(nl==nr) { tree[p].sum=tmp[nl]; return; }int mid=(nl+nr)>>1;build(p<<1,nl,mid),build(p<<1|1,mid+1,nr);pushup(p);
}
void change(int p,int nl,int nr,int l,int r,int k)
{if(nl>=l && nr<=r){tree[p].sum=(nr-nl+1)*k;tree[p].laz=k;return;}pushdown(p,nl,nr);int mid=(nl+nr)>>1;if(mid>=l) change(p<<1,nl,mid,l,r,k);if(mid<r) change(p<<1|1,mid+1,nr,l,r,k);pushup(p);
}
int query(int p,int nl,int nr,int l,int r)
{if(nl>=l && nr<=r) return tree[p].sum;pushdown(p,nl,nr);int mid=(nl+nr)>>1,ret=0;if(mid>=l) ret+=query(p<<1,nl,mid,l,r);if(mid<r) ret+=query(p<<1|1,mid+1,nr,l,r);pushup(p);return ret;
}
bool check(int val)
{for(int i=1;i<=n;i++) tmp[i]=(a[i]>=val)?1:0;build(1,1,n);for(int i=1,cnt;i<=m;i++){cnt=query(1,1,n,l[i],r[i]);change(1,1,n,l[i],r[i],0);if(!cnt) continue;if(opt[i]==0) change(1,1,n,r[i]-cnt+1,r[i],1);else change(1,1,n,l[i],l[i]+cnt-1,1);}return query(1,1,n,Pos,Pos);
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=rd(),m=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=m;i++) opt[i]=rd(),l[i]=rd(),r[i]=rd();Pos=rd();L=1,R=n,ans=1;while(L<=R){int mid=(L+R)>>1;if(check(mid)) ans=mid,L=mid+1;else R=mid-1;}printf("%d\n",ans);//fclose(stdin);//fclose(stdout);return 0;
}

【做题记录】区间排序—线段树相关推荐

  1. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  2. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  3. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  4. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  5. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  6. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  7. 退役前的做题记录4.0

    退役前的做题记录4.0 最近主要在LOJ上写题 536. 「LibreOJ Round #6」花札 比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中.连边可以对每种颜色以及数字建一个点 ...

  8. 2020.9月做题记录

    八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...

  9. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

最新文章

  1. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
  2. 部署tomcat环境
  3. AAAI 2020 | 多模态基准指导的生成式多模态自动文摘
  4. 老码农揭开行业黑幕:如何编写无法维护的代码
  5. idea maven PKIX path building failed
  6. python自学流程-Python系统学习流程图,教你一步步学习python
  7. ubuntu 16.04 编译 opencv_contrib 3.4, nonfree
  8. Docker网络配置进阶
  9. linux线程同步之互斥锁——linux的关键区域
  10. asp.net 读取excel文件
  11. 33 个送给 Java 程序员的练手项目合集
  12. 线段树合并复杂度证明
  13. php根据汉字首字母分组,利用PHP获取汉字首字母并且分组排序详解
  14. 【Java面试题】19 final,finally和finalize的区别
  15. AI5天训练-视觉生产技术探究和应用
  16. 托管型呼叫中心与自建型呼叫中心的区别
  17. lightNLP:框架功能丰富,开箱即用
  18. 人工智能究竟能否实现?
  19. 每个国家对应的语言Locale和国家代码对照表
  20. 传智播客总裁黎活明“传智专修学院成立暨揭牌仪式”演讲实录

热门文章

  1. Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...
  2. 软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...
  3. realloc函_[转载]realloc函数的使用及注意事项(转)
  4. pe下找不到ssd硬盘_【进入pe系统后认不到硬盘解决方法】进入pe系统看不到硬盘_pe系统不认硬盘...
  5. [C++11]自动类型推导auto
  6. [剑指offer]面试题35:第一个只出现一次的字符
  7. 打印最少硬币的组合-dp+记录路径
  8. hdu1213 How Many Tables-并查集
  9. C++实现链式存储二叉树
  10. java 普通类获取session_如何在Java的普通类中获取Session以及request对象