Codeforces 240F. TorCoder 线段树
线段树统计和维护某一区间内的字母个数。。
。
。
3 seconds
256 megabytes
input.txt
output.txt
A boy named Leo doesn't miss a single TorCoder contest round. On the last TorCoder round number 100666 Leo stumbled over the following problem. He was given a string s,
consisting of n lowercase English letters, and m queries.
Each query is characterised by a pair of integers li, ri (1 ≤ li ≤ ri ≤ n).
We'll consider the letters in the string numbered from 1 to n from left to right, that is, s = s1s2... sn.
After each query he must swap letters with indexes from li to ri inclusive
in string s so as to make substring (li, ri) a
palindrome. If there are multiple such letter permutations, you should choose the one where string (li, ri) will
be lexicographically minimum. If no such permutation exists, you should ignore the query (that is, not change string s).
Everybody knows that on TorCoder rounds input line and array size limits never exceed 60, so Leo solved this problem easily. Your task is to
solve the problem on a little bit larger limits. Given string s and m queries,
print the string that results after applying all m queries to strings.
The first input line contains two integers n and m (1 ≤ n, m ≤ 105) —
the string length and the number of the queries.
The second line contains string s, consisting of n lowercase
Latin letters.
Each of the next m lines contains a pair of integers li, ri (1 ≤ li ≤ ri ≤ n)
— a query to apply to the string.
In a single line print the result of applying m queries to string s.
Print the queries in the order in which they are given in the input.
7 2
aabcbaa
1 3
5 7
abacaba
3 2
abc
1 2
2 3
abc
A substring (li, ri) 1 ≤ li ≤ ri ≤ n) of
string s = s1s2... sn of
length n is a sequence of characters slisli + 1...sri.
A string is a palindrome, if it reads the same from left to right and from right to left.
String x1x2... xp is lexicographically
smaller than string y1y2... yq,
if either p < q and x1 = y1, x2 = y2, ...
, xp = yp,
or exists such number r(r < p, r < q),
that x1 = y1, x2 = y2, ...
, xr = yr and xr + 1 < yr + 1.
/* ***********************************************
Author :CKboss
Created Time :2015年07月20日 星期一 07时29分48秒
File Name :CF240F_2.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; const int maxn=100100; int n,m;
int sum[28][maxn<<2];
int add[maxn<<2]; /// lazy
char str[maxn];
int cs[28]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 void cls(int rt)
{
add[rt]=-1;
for(int i=0;i<26;i++) sum[i][rt]=0;
} void push_up(int rt)
{
for(int i=0;i<26;i++)
sum[i][rt]=sum[i][rt<<1]+sum[i][rt<<1|1];
} void push_down(int l,int r,int rt)
{
if(add[rt]!=-1)
{
int m=(l+r)/2;
int id = add[rt]; cls(rt<<1); cls(rt<<1|1); add[rt<<1]=add[rt<<1|1]=add[rt];
sum[id][rt<<1]=m-l+1; sum[id][rt<<1|1]=r-m; add[rt]=-1;
}
} void build(int l,int r,int rt)
{
add[rt]=-1;
if(l==r)
{
int id=str[l]-'a';
sum[id][rt]++; add[rt]=id;
return ;
}
int m=(l+r)/2;
build(lson); build(rson);
push_up(rt);
} void query(int L,int R,int l,int r,int rt)
{ if(L<=l&&r<=R)
{
for(int i=0;i<26;i++) cs[i]+=sum[i][rt];
return ;
} push_down(l,r,rt); int m=(l+r)/2;
if(L<=m) query(L,R,lson);
if(R>m) query(L,R,rson); push_up(rt);
} void update(int id,int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
cls(rt); add[rt]=id;
sum[id][rt]=r-l+1; return ;
} push_down(l,r,rt); int m=(l+r)/2;
if(L<=m) update(id,L,R,lson);
if(R>m) update(id,L,R,rson); push_up(rt);
} char res[maxn]; void solve(int L,int R)
{
int op=-1,odd=0; memset(cs,0,sizeof(cs));
query(L,R,1,n,1);
for(int i=0;i<26;i++)
{
if(cs[i]%2) { odd++; op=i; }
if(odd>1) return ;
} int st=L,en=R;
int MID=L+(R-L+1)/2;
for(int i=0;i<26;i++)
{
if(cs[i])
{
if(cs[i]/2)
{
update(i,st,st+cs[i]/2-1,1,n,1);
update(i,en-cs[i]/2+1,en,1,n,1); st=st+cs[i]/2;
en=en-cs[i]/2;
}
if(cs[i]%2==1)
{
update(i,MID,MID,1,n,1);
}
}
}
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout); scanf("%d%d",&n,&m);
scanf("%s",str+1); /// build
build(1,n,1); int L,R;
while(m--)
{
scanf("%d%d",&L,&R); solve(L,R);
}
for(int i=1;i<=n;i++)
{
memset(cs,0,sizeof(cs));
query(i,i,1,n,1);
for(int j=0;j<26;j++)
if(cs[j])
{
putchar('a'+j); break;
}
}
putchar(10); return 0;
}
Codeforces 240F. TorCoder 线段树的更多相关文章
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
- Sereja and Brackets CodeForces - 380C (线段树+分治思路)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- CodeForces 91B Queue (线段树,区间最值)
http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
- Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)
Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...
随机推荐
- spring揭秘读书笔记----ioc的基本概念
在看ico概念之前,先想一下我们平常需要依赖某个类时会怎么做? 无非是在要用到的地方写如下代码: Person person = new Person(); //然后就可以用person对象来获取Pe ...
- olede读excel
注意点:需要比较excel文件中是否有重复列时,需要设置HDR=No,IMEX=1,即把第一列当做数据读取,不然读到的datatable列名会被自动加数字后缀. /// < summary> ...
- vb调试dll
1.有两个工程BW_DetectCard.vbp(生成dll)及识别卡检测软件.vbp(生成exe) 2.打开工程<识别卡检测软件.vbp>,在文件--添加工程--现存,找到要引用的dll ...
- nvidia显卡驱动卸载和卸载后的问题
因为装了nvidia显卡驱动后开机一直处于循环登录界面.password输入正确也是进不去.然后就决定卸载nvidia显卡驱动.安装之后出现还是循环登陆. 是openGL的问题 有至少两种解决方 ...
- oracle 11g 中 (oracle 10g) crsctl 的 替换命令
oracle 11g 中 (oracle 10g) crsctl 的 替换命令 Deprecated Command Replacement Commands crs_stat ---集群状态 ...
- Angularjs学习笔记7_directive1
1.基础知识 directive()接受两个参数 · name:字符串,指令的名字 · factory_function:函数,指令的行为 应用启动时,以name作为该应用的标识注册factory_f ...
- 美团HD(6)-添加搜索遮罩
DJSelectCityViewController.m /** SearchBar开始编辑 */ - (void)searchBarTextDidBeginEditing:(UISearchBar ...
- wp8页面导向
一般打开的是MainPage.xaml需要打开另一个页面的时候,用NavigationService.Navigate(uri);当然uri要配置是相对路径还是绝对路径Uri uri = new Ur ...
- stm32开发板无法正常写入的问题或者写入后无法正常运行的问题
在调试stm32的程序的时候遇到这样一个问题. 用Keil往stm32里写入程序时出现无法访问内存的错误.情况如下 然后 J-link没有提示异常.偶尔可以下载成功,但是程序无法正确的执行. 经过一番 ...
- 【实用】如何在windows下快速截图?
如何在windows下快速截图? 快速截图是很多人的需求.截图的工具和方案也很多,但是,这里给出一个通用的,被大众认为最高效的一个解决方案. 我们都知道键盘上有一个"prt sc" ...