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 的询问更新答案. 我们先考虑最暴力的做法, ...
随机推荐
- Python课程之元组
元组(Tuple) 一.定义: 与列表(list)不同的是,元组不支持修改,但是若元组中的元素本身是可变对象,如列表,则可以修改.元素之间用逗号隔开,并且元素的类型可以任意. 二.操作: 1.创建:直 ...
- jQuery 如何存储,获取和删除 Cookies
jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { options = option ...
- usb转串口模块下载时遇到的问题
ch340g usb转TTL模块,烧写wifi模块ESP8266固件时,为图省事,我直接用的该模块的3.3v电为wifi模块供的电,结果刚一上电就出现串口模块消失(听到噔的一声),电脑设备管理器里就看 ...
- 自己动手制作更好用的markdown编辑器-01
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im 文章目录 1. 简介 2. 项目结构 3. 程序主界面 4. 拖动窗口 5. app ...
- Effective C++ 条款47
本节条款的题目:请使用trait classes来表示类型信息 本节条款主要讲述的技术是怎样在编译期间实现对迭代器类型的推断,依据推断的类型进行最优处理. 我们先来看一下迭代器的种类: 1.input ...
- atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js
atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js 1.1. 复合变量,也就是类似$$a的变量,它会进行两次的解释. 1 1.2. 数据库里面的复合变量1 ...
- OC-7-内存管理
课程要点: 内存管理的必要性 MRC(手动管理) 自动释放池 ARC是怎么对内存进行管理的 内存管理的必要性 OC是一门面向对象的语言,在软件运行过程中会创造大量的对象,每创建一个对象系统就会给其分配 ...
- Linux gcc编译器
GNU CC(通常称为GCC)是GNU项目的编译器,他能够编译C.C++语言编写的程序. 使用gcc,程序员可以对编译过程有更多控制,编译过程分为3个阶段. --预处理 --汇编 --链接 程序员可以 ...
- C++数组类型与函数类型
之所以将C++的数组类型与函数类型拿到一块说,是因为两者在很多地方都一样. 首先,声明形式上类似: 数组类型: type [num] ...
- redis的下载
网址一:https://github.com/dmajkic/redis/downloads 网址二:http://windows.php.net/downloads/pecl/releases/re ...