首页 > 代码库 > poj3145(线段树)

poj3145(线段树)

题意:两种操作,一种B t向集合中插入元素t,另一种A t,查询集合中模y最小的数,如果有多个最小则取最后插入的那个。操作数<=40000,1 ≤ t≤ 500 000,1 ≤ y ≤ 1 000 000.


解法:每个数都插入等于其坐标的位置。线段树维护区间最小值,然后每次询问都查询[0,y-1],[y-1,2*y-1]....各循环节区间的最小值然后分别松弛答案。当y过小的时候,复杂度会退化,可以完全暴力枚举,这个复杂度和数据有关系。


代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef unsigned long long LL;
const int Max=500110;
const int INF=1e9+7;
int tool[Max*10];
struct point
{
    int value;
    int time;
};
bool operator<(const point& a,const point& b)
{
    if(a.value!=b.value)
        return a.value<b.value;
    return a.time>b.time;
}
struct node
{
    int l,r;
    node *pl,*pr;
    point thing;
} nodes[2*Max];
int tot=0;
void buildtree(node *p,int left,int right)
{
    p->l=left;
    p->r=right;
    p->thing.value=http://www.mamicode.com/INF;>