牛オフ練習一致44 Bセグメント小さなY(思考)

リンク:https://ac.nowcoder.com/acm/contest/634/B
出典:牛オフネットワーク

タイトル説明
、i番目のセグメントの長さはa_iaで、n個の線分を与える
I 、各ラインセグメントにジャンプすることができ、I + 1、J + 1のi番目のセグメントにおける位置jの位置から。線分J + 1の長さよりも最初のi + 1以下であれば、私は、その後、ジャンプし続ける条0位置セグメントに戻ります。所望の位置にホップの数、i番目のセグメント0のn番目のセグメントからQジャンプ入力の量を減らすために、によって、次の配列を取得する方法unsigned int型SA、SB、SC、MODをint型、unsigned int型ランド(){ SA ^ = << 16 SA、SAは= SA ^ >> 5; SA = SA ^ << 1; unsigned int型= T SA、SA = SB; SB = SC、SC ^ = T ^ SA、SCを返す; } (INTメイン) { CIN >> N-MOD >> >> SA SBのSC >>; のための(INT I = 1; I <= N; ++ I)A [I] =ランド()MOD +%1; } 入力説明:最初の行は2つの正の整数nは、MOD、n個の線分の総数を示します





















第3つの数字、それぞれSA、SB、SC用のライン
出力説明:
セグメント数を示すライン数Nとそれぞれのジャンプから。
実施例1つ
の入力
レプリケーション
。5 5
5 6 4
出力
コピー
13

アイデア:

[I]の各々は無限長であると仮定し、次いで、ANS = N *(N-1)/ 2

その後、我々はそこから来余分なジャンプを考えますか?

iは1 +ときに最初に線分J + 1の長さ未満である場合、それはジャンプの複数が存在するであろう、0位置のi番目の行に戻ります。

私は複数回(あなたはどのように図面を理解することができますiとjジャンプ間の線分の長さを制限するので、私は、j番目のセグメントに行ってきました位置は上記のすべて、その後、0の位置にジャンプします場合。その後、我々は知ることができます)

その後、我々は後ろから前にプッシュダウンでき、私は、上記に沿ったものを見て蓄積する答えを行います。

詳細コードを参照してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2) { ans = ans * a % MOD; } a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int *p);
const int maxn = 20000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
unsigned int SA, SB, SC;
int mod;
int n;
unsigned int a[maxn];
unsigned int Rand()
{
    SA ^= SA << 16;
    SA ^= SA >> 5;
    SA ^= SA << 1;
    unsigned int t = SA;
    SA = SB;
    SB = SC;
    SC ^= t ^ SA;
    return SC;
}
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);


    cin >> n >> mod >> SA >> SB >> SC;
    for (int i = 1; i <= n; ++i) { a[i] = Rand() % mod + 1; }

    ll ans=(n*(n-1))/2;
    ll x=a[n];
    for(int i=n-1;i>=1;--i)
    {
        x--;
        if(x>a[i])
        {
            x=a[i];// 取较小的作为限制条件
        }
        if(!x)
        {
            ans+=(i-1);// 这个位置前面的每一个线段都会多跳一次。
            x=a[i];
        }
    }
    cout<<ans<<endl;

    return 0;
}

inline void getInt(int *p)
{
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    } else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}



おすすめ

転載: www.cnblogs.com/qieqiemin/p/11348352.html