1. 程式人生 > >牛客OI周賽7-提高組 B小睿睿的詢問(ST打表)

牛客OI周賽7-提高組 B小睿睿的詢問(ST打表)

表示 str iostream acm con pre 編號 urn ons

鏈接:https://ac.nowcoder.com/acm/contest/371/B
來源:牛客網

小睿睿的n個妹紙排成一排,每個妹紙有一個顏值val[i]。有m個詢問,對於每一個詢問,小睿睿想知道區間[L,R]顏值最高而編號最小的妹紙是哪一個 對於妹紙們的顏值val[i],其生成函數為:
void generate_array(int n,int seed)
{
    unsigned x = seed;
    for (int i=1;i<=n;++i)
    {
        x ^= x << 13;
        x ^= x >> 17;
        x ^= x << 5;
        val[i]=x%100;
    }
}
對於每一組詢問,區間[L,R]的生成函數為:
void generate_ask(int n,int m,int seedx,int seedy)
{
    unsigned x=seedx,y=seedy;
    for (int i=1;i<=m;++i)
    {
        x ^= x << 13;
        x ^= x >> 17;
        x ^= x << 5;
        y ^= y << 13;
        y ^= y >> 17;
        y ^= y << 5;
        L=(x^lastans)%n+1,R=(y^lastans)%n+1;
        if (L>R)swap(L,R);
        //解決詢問
    }
}

其中lastans為上個詢問的答案,對於第一個詢問,lastans為0

輸入描述:

第1行2個整數n,m,分別表示序列長度和詢問次數

第2行3個整數seed,seedx,seedy,意義如題所示

輸出描述:

一行一個整數,表示所有詢問的答案的異或和
示例1

輸入

10 5
3 5 7

輸出

2

思路:裸的ST
#include <cstdio>
#include <map>
#include <iostream>
#include<cstring>
#include
<bits/stdc++.h> #define ll long long int #define M 6 using namespace std; inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1}; int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1}; const int inf=0x3f3f3f3f; const ll mod=1e9+7; int val[100007]; int f[100007][20]; int L,R,lastans,ans; void generate_array(int n,int seed) { unsigned x = seed; for (int i=1;i<=n;++i) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; val[i]=x%100; } } int maxn(int i,int j){ if(val[i]>val[j]) return i; else if(val[i]<val[j]) return j; else return i>j?j:i; } void preST(int len){ for(int i=1;i<=len;i++) f[i][0]=i; int k=log(len)/log(2)+1; for(int j=1;j<k;j++) for(int i=1;i<=(len-(1<<j)+1);i++) f[i][j]=maxn(f[i][j-1],f[i+(1<<(j-1))][j-1]); } int queryST(int l,int r){ int k=log(r-l+1)/log(2); return maxn(f[l][k],f[r-(1<<k)+1][k]); } void generate_ask(int n,int m,int seedx,int seedy) { unsigned x=seedx,y=seedy; for (int i=1;i<=m;++i) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; y ^= y << 13; y ^= y >> 17; y ^= y << 5; L=(x^lastans)%n+1,R=(y^lastans)%n+1; if (L>R)swap(L,R); // cout<<L<<" "<<R<<endl; lastans=queryST(L,R); // cout<<lastans<<endl; ans^=lastans; } cout<<ans<<endl; } int main(){ ios::sync_with_stdio(false); int seed,seedx,seedy; int n,m; while(cin>>n>>m){ cin>>seed>>seedx>>seedy; generate_array(n,seed); lastans=0; int tt=m; ans=0; preST(n); generate_ask(n,tt,seedx,seedy); } }

牛客OI周賽7-提高組 B小睿睿的詢問(ST打表)