Codeforces Round#632(Div。2)C(カウントの質問)(D構築の質問)F(数学的導出の質問)

タイトルリンク

C.ユージーンと配列

トピック:長さnのシーケンスを与え、サブシーケンス(添え字が連続している)がいくつサブシーケンスであるかを尋ねます。

適切なサブシーケンスの配置:このシーケンスのサブシーケンス(添え字は連続的ではありません)の合計はゼロではありません。

練習:合計マイナス違法。

不正な方法:lは左の境界を表します。接頭辞sumを使用して、現在の左座標Lと右座標Rの合計をゼロにします。左座標の左と右座標の右の両方を組み合わせることは違法です。

この時点で、境界lをL + 1の位置に移動します。次に新しいL1 R1 L <= L1を見つけたので、二重計算が行われます。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e5+10;
ll n;
ll a[N],pre[N];
map<ll,ll>mp;
int main()
{

    scanf("%lld",&n);
    rep(i,1,n) scanf("%lld",&a[i]);
    ll ans=n*(n+1)/2;

    ll sum=0;
    mp[0]=1;
    int l=1;
    rep(i,1,n)
    {
        pre[i]=pre[i-1]+a[i];
        if(mp[pre[i]]>=l){
            sum+=(n-i+1)*(mp[pre[i]]-l+1);
            l=mp[pre[i]]+1;
        }
        mp[pre[i]]=i+1;
    }
    printf("%lld\n",ans-sum);


}

D.学校での挑戦№41

長い間読んだ後、私はまだそれを間違っていました。

参照タイトルとソリューションリンク:これ

解決策:

コード:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=3e3+10;
char s[N];
vector<int>v[3000100];
int n,k,mink,maxk;
void print()
{
    int p1=0,p2=0;
    int kk=mink;
    while(kk<k){
        //kk++;
        printf("1 %d\n",v[p1][p2]);
        p2++;
        if(p2==v[p1].size()) p2=0,p1++;
        else kk++;
    }


    printf("%d ",v[p1].size()-p2);
    for(int i=p2;i<v[p1].size();++i) printf("%d ",v[p1][i]);puts("");


    for(int i=p1+1;i<mink;++i){
        printf("%d ",v[i].size());
        for(int val:v[i]) printf("%d ",val);
        puts("");
    }
}
void run(int id)
{
    for(int i=1;i<n;++i){
        if(s[i]=='R'&&s[i+1]=='L')
        {
            swap(s[i],s[i+1]);
            v[id].push_back(i);
            ++i;
        }
    }
}
int main()
{
    cin>>n>>k>>s+1;
    run(0);
    while(v[mink].size()&&mink<=k)
    {
        maxk+=v[mink].size();
        mink++;
        run(mink);
    }
    //printf("mink:%d maxk:%d k:%d\n",mink,maxk,k);

    if(mink<=k&&k<=maxk) print();
    else puts("-1");
}

F.ケイトと不完全さ

トピック:シーケンス1からnまでの長さkのシーケンスを作成する必要がある、長さnのシーケンスを提供します。このシーケンスの任意の2つのgcdの最大値を、このシーケンスのランクとして定義します。

次に、2からnまでのkを見つけるように依頼します。各シーケンスのランクが最小になります。

私の方法は非常に魅力的です。2からnまでの各数値は、ランク付けする最小の素因数で除算され、これらの数値を出力するとよいでしょう。

良い解決策があります:これ

 

元の記事519件を公開 賞賛された69件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/qq_41286356/article/details/105408712