2019ハング電界マルチ第十校

2019ハング電界マルチ第十校

これは剛の最後の家ではありません

1003バレンタインデー

午前1時02分で解きます

\(N \) 2つの項目、各項目があり、\(P_Iを\)確率あなたを幸せに、各項目は独立したイベントであれば、あなたはサブセットを選択したいあなたを幸せに、単に確率の数としてあなたを幸せに最大

私は数学のプレーヤーではないよ、しかしzgggがそれに従事していない、zgggにそれを読んだ後、私は突然、私は本当に!?昨年のケースを倍増vjudgeこれを行っているように見える質問を思い出し、それを読んだ後のビットを変更しました...

しなければならない選択することである(のp \)\最大数(選択されていないに等しいより大きくなければなりません選択した項目のp値)、問題への公式の証明ソリューションcodeforces442B見ることができます

1005ウェルカムパーティー

1:24(+1)で解か

質問のチームメイトの翻訳の意味の後:Nの項目があります\((2 <= N <= 1E5)\) 各項目が2点の重みを持っている\(a_iを、b_i \)は、次の2つにこれらのアイテムが欲しいです非空セットA、B、最小差分値の絶対値の最大値と記事のB物品Aの最大値Bとなるよう

まずソートし、その後下降列挙によって\(a_iを\) Aの最大値は、特定のセットBにおけるより大きな値限り、未LOWER_BOUND次いで、項目(値を列挙未満として最初に現在の列挙記事)に等しい現在の列挙値B以上の値を見つけ、次に見つけるために、その(現在の列挙値より最後以下)前、およびその後列挙に合格しました最大b値の項目が最大値B答えが多重集合で維持することができるように更新されることができる値を確認するために比較します

コードを書くために彼のチームメイトを保持します

1008コイン

3:08(+2)でsovled

そこ\(nは(1 <= N <= 1E5)\) 項目のグループは、各項目は、2つの値がされている\(a_iを、B_i \) あなたが条件で、k個の項目の値は、物品の最大化を選択する必要があり、そのあなたはグループのBを選択した場合、あなたは、出力のグループを選択する必要があります\(2n個\)表す数、\(k個\)から\(1 \)をするために(2N \)\答えを

違和感メイト以上のBである場合、物品のグループのための貪欲スキームを与え、置く、二条のようなB、AB別段の合計サイズは、物品2の重量の平均値とします、アイテムのこれらの複数をソートし、それぞれに\(K \)単独治療

以下のための\(k個の\)、k番目の項目が直接見える、すなわち選択\([2N-K + 1 、2N] \)の区間内の項目、セグメントが有効である場合、次いで合わせた値間隔物品答えは

この間隔は、すなわち、有効でない場合\(2N-Kの\)\(2N-K + 1 \ ) 物品2の大きさであり、2つの場合があり、一方は次いで、物品2の大きさを選択することですそれはあなたがすべての商品の独立性を放棄することができ、最小のものが似ているあきらめて、選択した項目を放棄し、B項目を(あなたがあきらめた場合、それは対応する独立しているため、違法な事態が発生することはありませんマージする必要がありますBは、(彼らは独立しているので、それ以外の場合は、小さなよりも間違いなく良いB、最低限のことはできません))選択されていない、第二には、この記事を選択することはないので、最大のものを見つけるためにそこに選択されていない、あなたは見つけることができますバインドされていますアイテムだけでなく、別の連結項目のすべてが、(同じことは違法な状況になることはできません)を取ることができ合併の現在の記事に注意を払います

私は書くが、まだ貪欲の魔法を感じるために皆のために出していなかったが、

#include<bits/stdc++.h>

using namespace std;
const int maxn=1e5+5;
int n;
long long a[maxn],b[maxn];

struct ele{
    int id;
    long long val,sz;
    bool operator<(const ele& oth) const{
        return val<oth.val;
    }
};
vector <ele> arr;
vector <long long> mmax;
vector <long long> ans;
int main(void){
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        arr.clear();ans.clear();mmax.clear();
        for (int i=1;i<=n;i++){
            scanf("%lld%lld",&a[i],&b[i]);
            a[i]*=2;b[i]*=2;
            if (a[i]>=b[i]) arr.push_back({i,a[i],1}),arr.push_back({i,b[i],1});
            else arr.push_back({i,(a[i]+b[i])/2,2});
            
        }
        sort(arr.begin(),arr.end());
        for (int i=0;i<arr.size();i++){
            long long tmp;
            if (arr[i].sz==1)tmp=arr[i].val;
            else tmp=a[arr[i].id];
            if (mmax.size()==0) mmax.push_back(tmp);
            else mmax.push_back(max(mmax[mmax.size()-1],tmp));
        }
        long long mmin=1e18;
        long long sum=0;
        for (int i=arr.size()-1;i>=0;i--){
            if(arr[i].sz==1){
                sum+=arr[i].val;
                ans.push_back(sum);
                mmin=min(mmin,arr[i].val);
            }else{
                long long tmp=0;
                tmp=sum-mmin+arr[i].val*2;
                tmp=max(tmp,sum+mmax[i]);
                ans.push_back(tmp);
                sum+=arr[i].val*2;ans.push_back(sum);
                mmin=min(mmin,b[arr[i].id]);
            }
        }
        for (int i=0;i<ans.size();i++) printf("%lld%c",ans[i]/2," \n"[i==ans.size()-1]);
    }
}

1009ブロックブレイカー

午後12時37分で解きます

出席の問題、BFS缶

1011 Rounddogを幸せに

4:20(+1)で解か

長さ\(N(1 <= N <= 3E5)\) 場合にのみ要素間隔ペアワイズ互いに素間隔最大値場合幸せ間隔を定義し、以下インターバル長を減算され、列の数である\(K \)間隔の数(一定値)は、喜びを見つけます

彼女はそれが単調なスタック裸のタイトルで、互いに異なる要素を見ていません...

位置\(Iは\)の数字は\(a_iを\)、4つのプロセス番号は、する(a_iを\)\左端位置の最大値である(L_iを\)\、右端の位置\(R_iを\)スタック単調により得られた2つのリニアアレイ)する\(a_iをを\)左端の点で、互いに異なる要素の右端の位置を保証するために\(isl_i \) 右端位置および左端点\(isr_iを\)(二重ポインタを経て得られたこれら2つのリニアアレイ)

そして、あなたは、このような機能カルクを書く(lenは、L、R)R(自分自身を含めていない)で、右を選択することができますLを残している与えられた数である、あなたは必要な間隔の一定数を選択する必要がありますプログラムの数に等しいより大きいLEN長は、最初のコールは、この関数は一定の時間でなければならない(この機能は私のチームメイトによって書かれています)

各位置考える\(Iは\)最大の寄与を生成することができる範囲であり、\(\ [isl_i)\ MAX(L_iを、isr_i)、\分(R_iを、])、1236512に3例のように、現在の位置が寄与が列挙エンドポイントを計算しながら、4(すなわち、番号6)、例として左点を列挙することで、貢献を生成するために、左の点は、1(すなわち、右端点5であります2、3、6、5)、寄与行く回答を生成し、その後、貢献(2,3,6,5,1)が答え、ケース(2を製造するために添加した点2の左側を検討するために添加しました3,6,5算出寄与が繰り返される)、失うする必要がある、というように、最後に64を位置決めするために最大の寄与であり、\は(F(1,2,3,6,5)+ F (2 、3,6,5,1)-f(2,3,6,5)+ F(3,6,5,1,2)-f(3,6,5,1)+ F(6,5 、1,2,3)-f(6,5,1,2)\ )

あなたは列挙するたびにポイントが残っている場合は、確かにTLEは、短辺が、その辺について列挙すべきである、と分析の複雑さは、ランダムなデータ3E5ではありません、おそらく合計は1.2e6倍ですが、私は全体の複雑さを推測しますです\(nlogn \)のは、

もちろん、あなたはまた、除算を使用して行うことを征服することができます

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 10;

int T, a[N], n, k, l[N], r[N], isl[N], isr[N];
int stk[N], top;
int cnt[N];
long long ans;

long long calc(long long v, long long L, long long R) {
    if(v <= 1)
        return (L + 1) * (R + 1);
    if(L + R + 1 < v) return 0;
    v--;
    long long l1 = max(v - R, 0LL), l2 = L;
    long long l3 = min(v, l2);
    return (l3 + l1) * (l3 - l1 + 1) / 2 + (l3 - l1 + 1) * (R - v + 1) + max(0LL, l2 - v) * (R + 1);
}

int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &k);
        ans = 0;
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]); cnt[a[i]] = 0;
        }
        top = 0;
        a[0] = a[n + 1] = 1e9;
        stk[top++] = 0;
        for(int i = 1, j = 0; i <= n; ++i) {
            while(a[stk[top - 1]] < a[i]) top--;
            l[i] = stk[top - 1] + 1;
            stk[top++] = i;
            while(j < n && cnt[a[j + 1]] == 0) cnt[a[++j]]++;
            isl[i] = j;
            cnt[a[i]]--;
        }
        for(int i = 1; i <= n; ++i) cnt[a[i]] = 0;
        top = 0;
        stk[top++] = n + 1;
        for(int i = n, j = n + 1; i >= 1; --i) {
            while(a[stk[top - 1]] < a[i]) top--;
            r[i] = stk[top - 1] - 1;
            stk[top++] = i;
            while(j > 1 && cnt[a[j - 1]] == 0) cnt[a[--j]]++;
            isr[i] = j;
            cnt[a[i]]--;
        }
        for(int i = 1; i <= n; ++i) {
            int len = a[i] - k;
            l[i] = max(l[i], isr[i]);
            r[i] = min(r[i], isl[i]);
            if(l[i] + r[i] > i * 2) {
                int le = l[i], ri = min(r[i], isl[le]), pre = ri;
                ans += calc(len, i - le, ri - i);
                for(le++; le <= i; ++le) {
                    ri = min(r[i], isl[le]);
                    ans += calc(len, i - le, ri - i);
                    ans -= calc(len, i - le, pre - i);
                    pre = ri;
                }
            }
            else {
                int ri = r[i], le = max(l[i], isr[ri]), pre = le;
                ans += calc(len, i - le, ri - i);
                for(ri--; ri >= i; --ri) {
                    le = max(l[i], isr[ri]);
                    ans += calc(len, i - le, ri - i);
                    ans -= calc(len, i - pre, ri - i);
                    pre = le;
                } 
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

そして、より多くの学校では、それは、テンプレートの波を整理する時間だ、終わりました、昨年のようには異なるグレーの名前ではありません、学校よりも大幅には、第2の半分はそれを埋める、曲線が上昇している全体的な傾向を感じました

おすすめ

転載: www.cnblogs.com/tusikalanse/p/11391903.html