zoukankan      html  css  js  c++  java
  • BZOJ1012 [JSOI2008]最大数 线段树

    题目描述

    现在请求你维护一个数列,要求提供以下两种操作:

    1、 查询操作。

    语法:Q L

    功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

    限制:LLL不超过当前数列的长度。(L>0)(L > 0)(L>0)

    2、 插入操作。

    语法:A n

    功能:将nnn加上ttt,其中ttt是最近一次查询操作的答案(如果还未执行过查询操作,则t=0t=0t=0),并将所得结果对一个固定的常数DDD取模,将所得答案插入到数列的末尾。

    限制:nnn是整数(可能为负数)并且在长整范围内。

    注意:初始时数列是空的,没有一个数。

    输入输出格式

    输入格式:

    第一行两个整数,MMM和DDD,其中MMM表示操作的个数(M≤200,000)(M le 200,000)(M200,000),DDD如上文中所述,满足(0<D<2,000,000,000)(0<D<2,000,000,000)(0<D<2,000,000,000)

    接下来的MMM行,每行一个字符串,描述一个具体的操作。语法如上文所述。

    输出格式:

    对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

    输入输出样例

    输入样例#1: 复制
    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2
    
    输出样例#1: 复制
    96
    93
    96
    

    说明

    [JSOI2008]

    本题数据已加强

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<map>
    #include<set>
    #include<vector>
    #include<queue>
    #include<bitset>
    #include<ctime>
    #include<time.h>
    #include<deque>
    #include<stack>
    #include<functional>
    #include<sstream>
    //#include<cctype>
    //#pragma GCC optimize(2)
    using namespace std;
    #define maxn 200005
    #define inf 0x7fffffff
    //#define INF 1e18
    #define rdint(x) scanf("%d",&x)
    #define rdllt(x) scanf("%lld",&x)
    #define rdult(x) scanf("%lu",&x)
    #define rdlf(x) scanf("%lf",&x)
    #define rdstr(x) scanf("%s",x)
    #define mclr(x,a) memset((x),a,sizeof(x))
    typedef long long  ll;
    typedef unsigned long long ull;
    typedef unsigned int U;
    #define ms(x) memset((x),0,sizeof(x))
    const long long int mod = 98765431;
    #define Mod 1000000000
    #define sq(x) (x)*(x)
    #define eps 1e-5
    typedef pair<int, int> pii;
    #define pi acos(-1.0)
    //const int N = 1005;
    #define REP(i,n) for(int i=0;i<(n);i++)
    typedef pair<int, int> pii;
    
    inline int rd() {
    	int x = 0;
    	char c = getchar();
    	bool f = false;
    	while (!isdigit(c)) {
    		if (c == '-') f = true;
    		c = getchar();
    	}
    	while (isdigit(c)) {
    		x = (x << 1) + (x << 3) + (c ^ 48);
    		c = getchar();
    	}
    	return f ? -x : x;
    }
    
    
    ll gcd(ll a, ll b) {
    	return b == 0 ? a : gcd(b, a%b);
    }
    int sqr(int x) { return x * x; }
    
    
    
    /*ll ans;
    ll exgcd(ll a, ll b, ll &x, ll &y) {
    	if (!b) {
    		x = 1; y = 0; return a;
    	}
    	ans = exgcd(b, a%b, x, y);
    	ll t = x; x = y; y = t - a / b * y;
    	return ans;
    }
    */
    
    ll MOD, m;
    struct node {
    	int l, r;
    	ll MAX;
    }t[maxn<<2];
    
    void pushup(int rt) {
    	t[rt].MAX = max(t[rt << 1].MAX, t[rt << 1 | 1].MAX);
    }
    
    void build(int l, int r, int rt) {
    	t[rt].l = l; t[rt].r = r;
    	if (l == r) {
    		t[rt].MAX = -inf; return;
    	}
    	int mid = (l + r) >> 1;
    	build(l, mid, rt << 1); build(mid + 1, r, rt << 1 | 1);
    	pushup(rt);
    }
    
    void upd(int loc, int rt, ll val) {
    	if (t[rt].l == t[rt].r) {
    		t[rt].MAX = val; return;
    	}
    	int mid = (t[rt].l + t[rt].r) >> 1;
    	if (loc <= mid)upd(loc, rt << 1, val);
    	if (mid < loc)upd(loc, rt << 1 | 1, val);
    	pushup(rt);
    }
    
    ll query(int L, int R, int rt) {
    	if (L <= t[rt].l&&t[rt].r <= R) {
    		return t[rt].MAX;
    	}
    	int mid = (t[rt].l + t[rt].r) >> 1;
    	ll ans = -inf;
    	if (L <= mid)ans = max(ans, query(L, R, rt << 1));
    	if (mid < R)ans = max(ans, query(L, R, rt << 1 | 1));
    	return ans;
    }
    
    int main()
    {
    	//	ios::sync_with_stdio(0);
    	rdllt(m); rdllt(MOD);
    	build(1, m , 1);
    //	for (int i = 1; i <= m * 4; i++)t[i].MAX = -inf;
    	ll ans = 0;
    	int tot = 0;
    	while (m--) {
    		char opt[2]; rdstr(opt);
    		if (opt[0] == 'A') {
    			ll n; rdllt(n);
    			n = ((n + MOD) % MOD + (ans + MOD) % MOD) % MOD;
    			upd(++tot, 1, n);
    		}
    		else {
    			int l = rd();
    			ans = query(tot - l + 1, tot, 1);
    			printf("%lld
    ", ans);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    DataTable转List<T>
    Ajax跨域解决方案
    日期格式换算
    序列化和反序列化
    C#导出数据量大于100万【csv】
    DataSet转Model
    正则表达式-小数-XML取值验证
    微信绑定欢迎页面
    正则表达式 从X开始到X结束
    html5的新特性有哪些?除了新标签之外还有新的特性?新增的标签主要是为了什么?
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/10371737.html
Copyright © 2011-2022 走看看