20190813アナログ試験(低級)+14

二つの検査倍クライ

最初の操作SB T2が20分を失ったが、かろうじて17〜15分乾燥した髪は、最初の行の部屋を立ち往生されているが

私はただリラックスすると、コーチはニュースを来た:次のテストサブ室後

なんてこった まあテストを継続

T130minは(による暴力へと何のビートを戦うません)カットオフ、T250pts暴力キック、そして無駄の1Hに正の解決策があると思い、30分後、彼らは、T3に移動しました

T3桁DPは、しかし、エラー状態ので、調子の出ない定義され、そして最終的には3分と呼ばれる力で投げ

T3はゼロバースト、と私は死の可変の充電サイクルを定義しているので、それを

私は、全体のリスト、またはrank15の結果を再生するには感じ終え、ランキングを見るrank19見終わったとき?

それから私は、最初の部屋に剛

私は、この時間は、試験はミスが前を復元することはできませんが、後者が調整されているにもかかわらず、形状の外に常に、どのように言うべき

それを維持

0813:

T1:週

爆発の検索、説明していません

T2:任意の

emmm .....この質問は私のアイデアや他の人が同じではない、について何かを言います

私たちはラインの寄与がXである上、ラインによる寄与ラインをカウントしていると仮定し、この行の寄与はどのくらいです

我々は最初の接頭番号とブロックの各列の和、各行及びlink_xプレフィックスとライン上に接続されたエッジの数を消します

そして、明らかに和link_xのこの行への貢献は、この事は、二次元の接頭辞およびメンテナンスすることができ、O(1)クエリすることができ

しかし、我々はエッジを残したので、これは、問題になり、接頭辞が間違っている可能性があり

私たちは、プレフィックスとlink_y各列に対処し、この問題を解決するには、左側に接続することができます

#include <ビット/ STDC ++ H>
 の#defineは長い長いllの
 使用 名前空間STDを、
CONST  INT MX [ 4 ] = { 1、 - 100 }、私の[ 4 ] = { 001、 - 1 }。
int型 N、今M、Q、ANS、XXX、YYY、YY、XX、ゾル[ 2002 ] [ 2002 ]、SLM [ 2002 ] [ 2002 ]、SIM [ 2002 ] [ 2002 ]。
チャー S [ 2010 ] [ 2010 ]。
INT メイン(){ 
    scanf関数(" %D%D%D "、&​​N、&M&Q)。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
        のscanf(" %sの"、S [I] + 1 )。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){
         ためのint型 J = 1 ; J <= Mであり、j ++ ){ 
            ゾル[I] [J] =ゾル[I]、[J- 1 ] +ゾル[ I- 1 ] [j]は-sol [I- 1 ] [J- 1 ]。
            もし(S [I] [J- 1!] = ' 1 ' && S [I] [J] == ' 1 ')ゾル[I] [J] ++ ; 
            SLM [I] [J] = SLM [I]、[J- 1 ] + SLM [I- 1 ] [j]を-slm [I- 1 ] [J- 1 ]。
            もし(S [I] [J] == ' 1 ' && S [I- 1 ] [j] == ' 1 ')SLM [I] [J] ++ ; 
            SIM [I] [J] = SIM [I- 1 ] [J]。
            もし(S [I] [J] == S [I] [J- 1 ] && S [I] [J] == ' 1 ')SIM [I] [J] ++ ; 
        } 
    } 
    一方(scanf関数(" %D%D%D%D "、およびXXX、&YYY、およびXX&YY)== 4 ){ 
        ANS =ゾル[XX] [YY] -sol [XXX- 1 ] [YY] -ゾル[XX] [yyy- 1 ] +ゾル[XXX- 1 ] [yyy- 1 ] + SIM [XX] [YYY] -sim [XXX- 1 ] [YYY]。
        もし(XX-XXX> = 1)ans- = SLM [XX] [YY] -slm [XXX] [YY] -slm [XX] [yyy- 1 ] + SLM [XXX] [yyy- 1 ]。
        printf(" %d個の\ n " 、ANS)。
    } 
    戻り 0 
}
コードの表示

T3:フライ

首先,我们仔细观察鬼畜值的定义,会惊奇的发现他让求的就是C(x,2),即两两相交的个数

又由于y单调递增,问题进一步转化为求逆序对数

然而这题卡内存,我们需要一些特殊的处理方法

我们发现X是由多段等差数列组成的

考虑等差数列中两项Xi和Xi+1的关联,发现Xi+1的答案就是Xi的答案-之前循环次数

因为之前每个数列必有一个数和Xi构成逆序对而和Xi+1构不成逆序对

对每个数列第一项特殊处理就好了

第一个不完整的数列需要加特判

#include<bits/stdc++.h>
#define ll long long
#define cri const register int
#define re register
using namespace std;
ll c[100010],a;
inline void add(cri x){
    for(int i=x;i<=a;i+=i&-i) c[i]++;
}
inline ll get(cri x){
    ll ans=0;
    for(int i=x;i>=1;i-=i&-i) ans+=c[i];
    return ans;
}
int main(){
    ll n,X,mod,x,lst,ans=0,num=0,i,lans;
    scanf("%lld%lld%lld%lld",&n,&X,&a,&mod);
    if(X<a) add(X+1);
    lst=X;
    x=(X+a)%mod;
    for(i=2;i<=n&&x>=a;i++){
        lst=x;
        x+=a;
        if(x>=mod) x-=mod;
    }
    for(i;i<=n;i++){
        if(x<a) ans+=(lst=i-1-(get(x+1))),num++,add(x+1);
        else ans+=(lst=lst-num+(x<X));
        x+=a;
        if(x>=mod) x-=mod;
    }
    printf("%lld",ans);

}
View Code

未完待续咕了

 

おすすめ

転載: www.cnblogs.com/mikufun-hzoi-cpp/p/11355716.html