poj 3145 Harmony Forever(线段树)
2014-05-07 19:40
423 查看
poj 3145 Harmony Forever
奇葩怪异吐血题,无力多说、、、
#include<stdio.h>
#include<string.h>
#define MAXN 600000
#define INF 2000000
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{
int l,r;
int val;
}t[MAXN<<2];
void construct(int l,int r,int p)
{
t[p].l=l,t[p].r=r,t[p].val=INF;
if(l==r) return ;
int m=mid;
construct(l,m,lch);
construct(m+1,r,rch);
}
int min(int a,int b) {return a<b?a:b;}
void modify(int x,int p)
{
if(t[p].l==t[p].r)
{
t[p].val=x;
return ;
}
int m=mid;
if(x<=m) modify(x,lch);
else modify(x,rch);
t[p].val=min(t[lch].val,t[rch].val);
}
void query(int l,int r,int p,int &num)
{
if(t[p].l>=l&&t[p].r<=r)
{
num=min(num,t[p].val);
return ;
}
int m=mid;
if(l<=m) query(l,r,lch,num);
if(r>m) query(l,r,rch,num);
}
int rec[MAXN],id[MAXN];
int main()
{
int n,x,cas=1;
char op[3];
while(scanf("%d",&n)!=EOF&&n)
{
if(cas>1) printf("\n");
printf("Case %d:\n",cas++);
construct(1,MAXN,1);
int up=0,max=0;
memset(id,-1,sizeof(id));
while(n--)
{
scanf("%s%d",op,&x);
if(op[0]=='B'&&id[x]==-1)
{
rec[up]=x;
id[x]=up;
modify(x,1);
up++;
if(x>max) max=x;
}
else
{
int ans=-1,re=x;
if(x<5000)
{
for(int i=up-1;i>=0;i--)
{
if(rec[i]%x<re)
{
re=rec[i]%x;
ans=id[rec[i]];
}
if(re==0) break;
}
}
else
{
int dd=MAXN/x;
int re=x;
for(int i=0;i<=dd;i++)
{
int num=INF;
int l=i*x;
if(l<1) l=1;
int r=(i+1)*x-1;
if(r>MAXN) r=MAXN;
query(l,r,1,num);
if(num==INF) continue;
if(num%x<re)
{
re=num%x;
ans=id[num];
}
else if(num%x==re)
{
if(id[num]>ans) ans=id[num];
}
}
}
if(ans!=-1) ans++;
printf("%d\n",ans);
}
}
}
return 0;
}
奇葩怪异吐血题,无力多说、、、
#include<stdio.h>
#include<string.h>
#define MAXN 600000
#define INF 2000000
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{
int l,r;
int val;
}t[MAXN<<2];
void construct(int l,int r,int p)
{
t[p].l=l,t[p].r=r,t[p].val=INF;
if(l==r) return ;
int m=mid;
construct(l,m,lch);
construct(m+1,r,rch);
}
int min(int a,int b) {return a<b?a:b;}
void modify(int x,int p)
{
if(t[p].l==t[p].r)
{
t[p].val=x;
return ;
}
int m=mid;
if(x<=m) modify(x,lch);
else modify(x,rch);
t[p].val=min(t[lch].val,t[rch].val);
}
void query(int l,int r,int p,int &num)
{
if(t[p].l>=l&&t[p].r<=r)
{
num=min(num,t[p].val);
return ;
}
int m=mid;
if(l<=m) query(l,r,lch,num);
if(r>m) query(l,r,rch,num);
}
int rec[MAXN],id[MAXN];
int main()
{
int n,x,cas=1;
char op[3];
while(scanf("%d",&n)!=EOF&&n)
{
if(cas>1) printf("\n");
printf("Case %d:\n",cas++);
construct(1,MAXN,1);
int up=0,max=0;
memset(id,-1,sizeof(id));
while(n--)
{
scanf("%s%d",op,&x);
if(op[0]=='B'&&id[x]==-1)
{
rec[up]=x;
id[x]=up;
modify(x,1);
up++;
if(x>max) max=x;
}
else
{
int ans=-1,re=x;
if(x<5000)
{
for(int i=up-1;i>=0;i--)
{
if(rec[i]%x<re)
{
re=rec[i]%x;
ans=id[rec[i]];
}
if(re==0) break;
}
}
else
{
int dd=MAXN/x;
int re=x;
for(int i=0;i<=dd;i++)
{
int num=INF;
int l=i*x;
if(l<1) l=1;
int r=(i+1)*x-1;
if(r>MAXN) r=MAXN;
query(l,r,1,num);
if(num==INF) continue;
if(num%x<re)
{
re=num%x;
ans=id[num];
}
else if(num%x==re)
{
if(id[num]>ans) ans=id[num];
}
}
}
if(ans!=-1) ans++;
printf("%d\n",ans);
}
}
}
return 0;
}
相关文章推荐
- POJ-3145-Harmony Forever-线段树暴力
- POJ 3145 Harmony Forever 笔记
- POJ 3145 线段树 分块?+暴力
- D POJ 3145 Harmony Forever
- POJ 3145 线段树 分块?+暴力
- 线段树专辑 —— pku 3145 Harmony Forever
- POJ 3145 Harmony Forever
- POJ 3667 Hotel (线段树区间合并 )
- POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)
- POJ3264--点更新的线段树--RMQ--Balanced Lineup
- hdu 1542 & poj 1151 Atlantis 线段树扫描线求矩形面积并
- poj 2528 Mayor's posters(线段树+离散化)
- POJ 2481 Cows 线段树
- POJ 3468 A Simple Problem with Integers(线段树)
- [转]poj 1823 Hotel 线段树
- POJ 2828 Buy Tickets(多校连萌,线段树模拟插入)
- poj 2828 Buy Tickets(线段树)
- poj 2828 线段树
- POJ 1177 Picture (线段树扫描线)
- poj 2892 hdu 1540 不错的线段树题