| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
TLE使我死得不明不白,很有冲动重新再写!!!!!#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
#define PF(x) (scanf("%d",&x))
#define PT(x,y) (scanf("%d%d",&x,&y))
#define PR(x) (printf("%d\n",x))
#define PRT(x,y)(printf("%d %d\n",x,y))
#define PB(x)(scanf("%I64d",&x))
#define PRB(x)(printf("%I64d\n",(x)))
typedef __int64 LL;
#define N 500005
#define M 105
#define Mod 1000
#define Inf 0x7ffffff
struct tree
{
int l,r;
int mins;
int id;
};
tree T[4*N];
int ar[N];
int n;
tree result;
void build(int l,int r,int k)
{
T[k].l = l;
T[k].r = r;
T[k].mins = Inf;
T[k].id = 0;
if(l==r) return ;
int mid = (l+r)>>1;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
}
void insert(int l,int r,int k,int v,int id)
{
if(l== v && r == v)
{
T[k].mins = v;
T[k].id = id;
return ;
}
int mid = (l+r)>>1;
if(v<=mid) insert(l,mid,2*k,v,id);
else insert(mid+1,r,2*k+1,v,id);
if(T[2*k].mins<T[k].mins)
{
T[k].mins = T[2*k].mins;
T[k].id = T[2*k].id;
}
if(T[2*k+1].mins<T[k].mins)
{
T[k].mins = T[2*k+1].mins;
T[k].id = T[2*k+1].id;
}
}
void query(int l,int r,int k,int ll,int rr)
{
/*if(l == ll && r == rr) return T[k];
int mid = (l+r)>>1;
if(rr<=mid) return query(l,mid,2*k,ll,rr);
if(ll>mid) return query(mid+1,r,2*k+1,ll,rr);
tree a = query(l,mid,2*k,ll,mid);
tree b = query(mid+1,r,2*k+1,mid+1,rr);
if(a.mins>b.mins) return b;
return a;*/
if(l>=ll && r<=rr)
{
if(result.mins>T[k].mins) result = T[k];
return ;
}
int mid = (l+r)>>1;
if(mid>=ll) query(l,mid,2*k,ll,rr);
if(mid<rr) query(mid+1,r,2*k+1,ll,rr);
}
int fun(int mod,int tos)
{
int id,ans;
id = tos;
ans = -1;
for(int i=tos;i>0;i--)
{
if(ans == -1)
ans = ar[i]%mod;
else if(ans>ar[i]%mod)
ans = ar[i]%mod,id = i;
}
return id;
}
void init()
{
int test=1;
bool flag = 0;
while(1)
{
PF(n);
if(n == 0) break;
build(1,N,1);
if(flag) puts("");flag = 1;
printf("Case %d:\n",test++);
char s[10];
int x;
int tos=1;
for(int i=0;i<n;i++)
{
scanf("%s%d",s,&x);
if(s[0] == 'B')
{
ar[tos] = x;
insert(1,N,1,x,tos);
tos++;
}
else
{
if(tos==1) {puts("-1");continue;}
if(x<4000)
printf("%d\n",fun(x,tos-1));
else
{
int l,r;
l = 1,r = x-1;
int ans,id;
ans = -1;
while(l<=N)
{
result.mins = Inf;
query(1,N,1,l,r);
if(l==1) l = x;
else l+=x;
r+=x;
if(r>N) r = N;
if(result.mins == Inf) continue;
if(ans == -1) ans = result.mins%x,id = result.id;
else if(ans>result.mins%x)
ans = result.mins%x,id = result.id;
}
printf("%d\n",id);
}
}
}
}
return ;
}
int main()
{
init();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator