CF 264A(向内的双向队列)

C. Escape from Stones
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Squirrel Liss lived in a forest peacefully, but unexpected trouble happens. Stones fall from a mountain. Initially Squirrel Liss occupies an interval [0, 1]. Next, n stones
will fall and Liss will escape from the stones. The stones are numbered from 1 to n in order.

The stones always fall to the center of Liss's interval. When Liss occupies the interval [k - d, k + d] and a stone falls to k,
she will escape to the left or to the right. If she escapes to the left, her new interval will be [k - d, k]. If she escapes to the right,
her new interval will be [k, k + d].

You are given a string s of length n. If the i-th
character of s is "l" or "r",
when the i-th stone falls Liss will escape to the left or to the right, respectively. Find the sequence of stones' numbers from left to right after all
the n stones falls.

Input

The input consists of only one line. The only line contains the string s (1 ≤ |s| ≤ 106).
Each character in s will be either "l" or "r".

Output

Output n lines — on the i-th line you should print
the i-th stone's number from the left.

Sample test(s)
input
llrlr
output
3
5
4
2
1
input
rrlll
output
1
2
5
4
3
input
lrlrr
output
2
4
5
3
1
Note

In the first example, the positions of stones 1, 2, 3, 4, 5 will be , respectively. So you should print the sequence: 3, 5, 4, 2, 1.

不能用模拟double+除法,会爆精度啊!!(long double 也不行)

其实只要根据性质,在序列前后添加即可。

靠,人生中的处女Hack,竟然是被Hack…(受?)


#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<functional>
#include<algorithm>
#include<cctype>
using namespace std;
#define MAXN (1000000+10)
//pair<double,int> a[MAXN];
char s[MAXN];
int n,a[MAXN];
int main()
{
	scanf("%s",&s);
	n=strlen(s);
	int l=1,r=n;
	for (int i=0;i<n;i++)
	{
		if (s[i]=='l') a[r--]=i+1;
		else a[l++]=i+1;
	}



	for (int i=1;i<=n;i++) cout<<a[i]<<endl;



}

CF 253B(队列上维护2个指针后移)

B. 实验误差
time limit per test

1 second

memory limit per test

256 megabytes

input

input.txt

output

output.txt

小明做实验,测了n次结果,因为误差,这些结果不一样。

至少修改多少结果,才能使最大的结果不超过最小的结果的2倍?

Input

第一行一个整数 n (2 ≤ n ≤ 105),第二行有n个数c1, c2, ..., cn表示结果(1 ≤ ci ≤ 5000)

Output

输出一个整数,表示最小修改次数。

Sample test(s)
input
6
4 5 3 8 3 7
output
2
input
4
4 3 2 4
output
0
Note

第1个数据删除8,7,第二个数据本身就满足条件。

排序,从小到大枚举最小数,并把后指针挪向最大的不用修改的数进行统计即可。


#include<cstdio>
#include<functional>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN (100000+100)
int a[MAXN];
int n;
int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);

	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	a[n+1]=1000000;
//	for (int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
	int t=1,ans=0;
	for (int h=1;h<=n;h++)
	{
		while (a[h]*2>=a[t+1]) t++;
		ans=max(ans,t-h+1);
	}
	cout<<n-ans<<endl;

}



RQNOJ 598(用b记录元素是否在队中)

查看题目 Show Problem

题目:[NOIP2010]机器翻译

问题编号:598


题目描述

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。
这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。
假设内存中有M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M−;;1,软件会将新单词存入一个未使用的内存单元;若内存中已存入M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。
假设一篇英语文章的长度为N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

【数据范围】
对于10%的数据有M=1,N≤ 5。
对于100%的数据有0<M≤ 100,0<N ≤ 1000。

输入格式

in,输入文件共2 行。每行中两个数之间用一个空格隔开。
第一行为两个正整数M 和N,代表内存容量和文章的长度。
第二行为N 个非负整数,按照文章的顺序,每个数(大小不超过1000)代表一个英文
单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出格式

共1 行,包含一个整数,为软件需要查词典的次数。

样例输入

【输入输出样例1】
3 7
1 2 1 5 4 4 1

【输入输出样例2】
2 10
8 824 11 78 11 78 11 78 8 264

样例输出

【输入输出样例1】
5

【输入输出样例2】
6

纯粹的模拟,用一个b数组表示某一个数字是否在队中

Program translate;
const
   maxm=100;
   maxn=1000;
var
   b:array[1..maxn] of boolean;
   n,m,i,j,p:longint;
   q:array[1..maxn] of longint;
   head,tail:longint;
begin
   read(m,n);
   head:=1;tail:=0;
   fillchar(b,sizeof(b),false);
   for i:=1 to n do
   begin
      read(p);
      if b[p] then continue;
      b[p]:=true;
      inc(tail);
      q[tail]:=p;
      if (tail-head+1>m) then
      begin
         b[q[head]]:=false;
         inc(head);
      end;
   end;
   writeln(tail);



end.

POJ 2823(双端队列)

这题考双端队列……好偏门的数据结构……

Program c;
const
    maxn=1000000;
type
   node=record
        num,d:longint;
        end;
   douq=record
        d:array[1..maxn] of node;
        l,r:longint;
        end;

var
   n,k,i,j:longint;
   a:array[1..maxn] of longint;
   ans1,ans2:array[1..maxn] of longint;
   minq,maxq:douq;
procedure push(var q:douq;num2,d2:longint);
begin
   with q do
   begin
      inc(r);
      d[q.r].num:=num2;
      d[q.r].d:=d2;
   end;
end;
procedure popl(var q:douq;i:longint);
begin
   with q do
   begin
      if d[l].num=i then inc(l);
   end;
end;
procedure popr(up,i:longint);
var
   j:longint;
begin
   if up=1 then
   begin
      with minq do
      begin
         while (l<r) and (d[r].d>i) do dec(r);
         if l=r then
         if d[r].d>i then dec(r);

      end;
   end
   else
   begin
      with maxq do
      begin
         while (l<r) and (d[r].d<i) do dec(r);
         if l=r then
         if d[r].d<i then dec(r);
      end;

   end;
end;
begin
   read(n,k);
   for i:=1 to n do read(a[i]);
   fillchar(minq,sizeof(minq),0);
   minq.l:=1;
   fillchar(maxq,sizeof(maxq),0);
   maxq.l:=1;
   if k=1 then
   begin
      for i:=1 to n-1 do write(a[i],' ');
      writeln(a[n]);
      for i:=1 to n-1 do write(a[i],' ');
      writeln(a[n]);
   end
   else
   begin
      for i:=1 to k do
      begin
         popr(1,a[i]);
         push(minq,i,a[i]);
         popr(0,a[i]);
         push(maxq,i,a[i]);
      end;
      ans1[1]:=minq.d[minq.l].d;
      ans2[1]:=maxq.d[maxq.l].d;
      for i:=k+1 to n do
      begin
         popl(minq,i-k);
         popl(maxq,i-k);
         popr(1,a[i]);
         push(minq,i,a[i]);
         popr(0,a[i]);
         push(maxq,i,a[i]);
         ans1[i-k+1]:=minq.d[minq.l].d;
         ans2[i-k+1]:=maxq.d[maxq.l].d;


      end;
      for i:=1 to n-k do write(ans1[i],' ');
      writeln(ans1[n-k+1]);
      for i:=1 to n-k do write(ans2[i],' ');
      writeln(ans2[n-k+1]);
   end;
end.