HDU-6356 Glad You Came (rmq)

제목: 처음에 n (n < = 1e5) 길이 의 전체 0 인 배열 a 를 생 성하 여 q (q < = 5e6) 그룹 업데이트 (l, r, v) 를 생 성하 여 l 에서 r 구간 내 v 보다 작은 수 를 모두 v 로 업데이트 하고 마지막 으로 n 개의 숫자 또는 값 을 출력 합 니 다.
사고: 시간 카드 가 너무 빡빡 합 니 다. 경기 할 때 우선 대기 열 유지 T, 라인 트 리 도 T, 시간 복잡 도 O (qlogn) 이지 만 q 가 너무 커서 데이터 그룹 수가 많 습 니 다.경기 후 공식 문 제 를 보고 분석 한 것 은 rmq, O (nlogn) 이 며, 업데이트 시 역방향 으로 업데이트 하면 된다.
#include 
using namespace std;
#define inf 0x3f3f3f3f
#define u unsigned int
#define ll long long
const int maxn=1e5+10;
const u mod=(1<<30);
u x,y,z,w;
u rng61()
{
    x=x^(x<<11);
    x=x^(x>>4);
    x=x^(x<<5);
    x=x^(x>>14);
    w=x^(y^z);
    x=y;
    y=z;
    z=w;
    return z;
}

ll dp[maxn][25],f[maxn],p[110],a[maxn];
int main()
{
    #define int ll
    int t,sum=1,num=0;
    p[0]=1;
    cin>>t;
    for(int i=1;i>n>>q>>x>>y>>z;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=22;j++)
                dp[i][j]=0;
        u nn=n;
        for(int i=1;i<=q;i++)
        {
            ll f1=rng61();
            ll f2=rng61();
            ll f3=rng61();
            int l=(int)min((f1%nn)+1,(f2%nn)+1);
            int r=(int)max((f1%nn)+1,(f2%nn)+1);
            int v=(int)(f3%mod);

            int d=f[r-l+1];//  2    
            dp[l][d]=max(dp[l][d],v);
            dp[r-p[d]+1][d]=max(dp[r-p[d]+1][d],v);
        }
        for(int j=f[n];j;j--)
        for(int i=1;i<=n;i++)
        {
            dp[i][j-1]=max(dp[i][j-1],dp[i][j]);///rmq   
            if(i+p[j-1]<=n)
            dp[i+p[j-1]][j-1]=max(dp[i+p[j-1]][j-1],dp[i][j]);///rmq   
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
            ans^=1ll*i*1ll*dp[i][0];
        cout<

좋은 웹페이지 즐겨찾기