prow2012-A3-0007
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
题意:给出一串长度为N的序列,给出M组询问,每组询问一段[l,r]区间内的重复情况,如有输出最后一组重复的数字,否者输出OK.
用类似正向表建立的方法,标识出每个数字最后一次出现位置,这样可以dp每个位置,得到最迟一次发现一对重复数字的位置在哪。
查询的时候,比较右端点的DP值和左端点,就能判断是否区间内有重复。
{{{
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <sstream>
#include <string>
#include <math.h>
using namespace std;
map<int,int> pos;
int L[50100],R[50100],ans[50100],order[50100];
int pre[501000],A[501000],f[501000];
int main(){
int i,N,M;
while(scanf("%d",&N)!=EOF){
pos.clear();
f[0] = 0;
for (i=1;i<=N;i++)
{
scanf("%d",&A[i]);
pre[i] = pos[A[i]];
pos[A[i]] = i;
f[i] = max(f[i-1],pre[i]);
}
scanf("%d",&M);
for (i=0;i<M;i++)
{
scanf("%d%d",&L[i],&R[i]);
if (f[R[i]]>=L[i]) printf("%d\n",A[f[R[i]]]);
else printf("OK\n");
}
printf("\n");
}
}
}}}
题意:给出一串长度为N的序列,给出M组询问,每组询问一段[l,r]区间内的重复情况,如有输出最后一组重复的数字,否者输出OK.
用类似正向表建立的方法,标识出每个数字最后一次出现位置,这样可以dp每个位置,得到最迟一次发现一对重复数字的位置在哪。
查询的时候,比较右端点的DP值和左端点,就能判断是否区间内有重复。
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <sstream>
#include <string>
#include <math.h>
using namespace std;
map<int,int> pos;
int L[50100],R[50100],ans[50100],order[50100];
int pre[501000],A[501000],f[501000];
int main(){
int i,N,M;
while(scanf("%d",&N)!=EOF){
pos.clear();
f[0] = 0;
for (i=1;i<=N;i++)
{
scanf("%d",&A[i]);
pre[i] = pos[A[i]];
pos[A[i]] = i;
f[i] = max(f[i-1],pre[i]);
}
scanf("%d",&M);
for (i=0;i<M;i++)
{
scanf("%d%d",&L[i],&R[i]);
if (f[R[i]]>=L[i]) printf("%d\n",A[f[R[i]]]);
else printf("OK\n");
}
printf("\n");
}
}