51nod1485 字母排序

【题解】
开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可。同时也有平衡树做
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define rg register
#define N 200010
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((a[u].l+a[u].r)>>1)
using namespace std;
int n,m,opt,l,r,q[];
struct tree{
int l,r,cnt[],set;
}a[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void build(int u,int l,int r){
a[u].l=l; a[u].r=r; a[u].set=-;
if(l<r){
build(ls,l,mid); build(rs,mid+,r);
for(rg int i=;i<;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i];
}
else a[u].cnt[getchar()-'a']++;
}
inline void pushdown(int u){
if(a[u].set==-) return; int set=a[u].set;
for(rg int i=;i<;i++) a[ls].cnt[i]=a[rs].cnt[i]=;
a[ls].cnt[a[ls].set=set]=(a[ls].r-a[ls].l+);
a[rs].cnt[a[rs].set=set]=(a[rs].r-a[rs].l+);
a[u].set=-;
}
void update(int u,int l,int r,int set){
if(l<=a[u].l&&a[u].r<=r){
for(rg int i=;i<;i++) a[u].cnt[i]=;
a[u].cnt[a[u].set=set]=(a[u].r-a[u].l+);
return;
}
pushdown(u);
if(l<=mid) update(ls,l,r,set);
if(r>mid) update(rs,l,r,set);
for(rg int i=;i<;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i];
}
void query(int u,int l,int r){
if(l<=a[u].l&&a[u].r<=r){
for(rg int i=;i<;i++) q[i]+=a[u].cnt[i];
return;
}
pushdown(u);
if(l<=mid) query(ls,l,r);
if(r>mid) query(rs,l,r);
}
void out(int u,int pos){
if(a[u].l==a[u].r) for(rg int i=;i<;i++)if(a[u].cnt[i]){putchar(i+'a'); return;}
pushdown(u);
if(pos<=mid) out(ls,pos); else out(rs,pos);
}
int main(){
n=read(); m=read(); build(,,n);
while(m--){
memset(q,,sizeof(q));
l=read(); r=read(); opt=read();
query(,l,r); int now=l;
if(opt==){
for(rg int i=;i<;i++)if(q[i]) update(,now,now+q[i]-,i),now+=q[i];
}
else{
for(rg int i=;i>=;i--)if(q[i]) update(,now,now+q[i]-,i),now+=q[i];
}
memset(q,,sizeof(q));
}
for(rg int i=;i<=n;i++) out(,i);
return ;
}
法。
51nod1485 字母排序的更多相关文章
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
- 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。
package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...
- 获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
package com.lixu.tongxunlu; import java.util.ArrayList; import com.lixu.tongxunlu.PinnedSectionListV ...
- Android 联系人字母排序(仿微信)
现在很多APP只要涉及到联系人的界面,几乎都会采取字母排序以及导航的方式.作为程序猿,这种已经普及的需求还是需要学习的,于是小生开始了在网上默默的学习之路,网上学习的资料质量参差不齐,不过也有很不错的 ...
- HashMap加入数据后,会自动根据首字母排序
1.Map<String, ArrayList<XX>> entityHashMap = new HashMap<>(); 然后增加一些数据,会发现根据String ...
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...
- mysql中文名字按首字母排序
在mysql数据库中可以使用GBK编码对中文进行排序,如名字按首字母排序 order by convert(substr(tu.username,1,1) using 'GBK') 其中substr方 ...
- string字母排序,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- php按照中文首字母排序
1> 网络上很多php的工具类可以将汉字转为拼音: 2> 将拼音进行排序即可 另一种则是类似mysql转码方式: 1 foreach ($array as $key=>$value) ...
随机推荐
- 15.extjs tabPanel的用法
转自:https://blog.csdn.net/mezhaha/article/details/78878894 本文导读:TabPanel继承于Ext.Panel,Ext.TabPanel就是有选 ...
- 国外知名IT网站(转载)
转自:http://supportopensource.iteye.com/blog/780566 =========================================== 1.Cnet ...
- bzoj 4806: 炮【dp】
同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...
- goalng——time包学习
1.星期:type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturda ...
- org.apache.poi.hssf.util.Region
从POI 3.18开始被Deprecated,在3.20版本中被移除了,所以3.20以前的都有 为了避免这个问题,用CellRangeAddress代替Region,其用法相同
- $Hdu1381\ Crazy\ Search$
前置芝士 :string 的 基本用法 string s = "hello world" ; string tmp(s,0,5) ; cout << tmp <& ...
- 牛客网-3 网易编程题(1拓扑&2二叉树的公共最近祖先&3快排找第K大数)
1. 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更 ...
- 获取Sprite上某一个点的透明度
转载[ http://www.cnblogs.com/Androider123/p/3795050.html] 本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要 ...
- NHibernate3.2学习笔记
一.开发环境 数据库:SQLServer2008 编译器:VS2010 .Net版本:.Net Framework 4.0 二.涉及第三方程序集 NHibernate.dll:版本3.2 Iesi.C ...
- 场景分割:MIT Scene Parsing 与DilatedNet 扩展卷积网络
MIT Scene Parsing Benchmark简介 Scene parsing is to segment and parse an image into different image re ...