タイトルの記録を行う2019.7.31CodeChef
今日では、タイトルのカットは、いくつかの道路CodeChefが、良い練習コードに難しいことではありません。クール。
T1
ポータル:XENTASK
洪水問題、奇数蓄積xannyとqwqを引き起こす両方の比較の小さな出力のような$ $ SUM2として$ $ xanny蓄積偶数と奇数ヤナとして偶数ヤナSUM1。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e4+5;
int T,n,a;
long long sum1,sum2;
inline int get()
{
int res=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') res=res*10+c-'0',c=getchar();
return res;
}
int main()
{
T=get();
while(T--)
{
n=get();
sum1=sum2=0;
for(int i=1;i<=n;i++)
{
a=get();
if(i%2) sum1+=a;
else sum2+=a;
}
for(int i=1;i<=n;i++)
{
a=get();
if(i%2) sum2+=a;
else sum1+=a;
}
cout<<min(sum1,sum2)<<endl;
}
return 0;
}
T2
ポータル:
洪水問題。小規模から大規模までのシーケンス、qwqを誘発することができ、重複または分離出力を見つけます
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int T,n,a[N];
inline int get()
{
int res=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') res=res*10+c-'0',c=getchar();
return res;
}
int main()
{
T=get();
while(T--)
{
n=get();
for(int i=1;i<=n;i++) a[i]=get();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(a[i]==a[i+1])
{
printf("%d\n",a[i]);
break;
}
if(a[i+1]!=a[i]+1)
{
if(i==1) printf("%d\n",a[i]);
else printf("%d\n",a[i+1]);
break;
}
}
}
return 0;
}
T3
ポータル:
少し難しいqwq
最初の文字列01文字列を格納し、ブロックの配列の連続するすべてのレコード長を開きます。日本語文は、該当する場合は、直接の出力をすべて$ K $ 0または1を変更し、することができるようにします。そうでない場合は、各ブロックの連続走査長の連続した日の最大数の半分、我々は半ば長ブロックよりも多くがある場合を意味半ばを超えないの連続した日の最大数は、このブロックが半ば長さの数倍であることが必要であることを確実にするためにしている場合いくつかの変換操作を使用します。各通信ブロック数は、RES + = LEN /ミッド$ $、$ LEN /ミッド$時間を消費しています。スキャンした後、$ resを場合> K $は日数が正当ではないです。
#include<bits/stdc++.h>
using namespace std;
char a[1000010];
int b[1000010],cnt,k,n;
bool check(int x)
{
int s=0,i;
for(i=1; i<=cnt; i++)
s+=b[i]/(x+1);
return s<=k;
}
int main()
{
int t,i,l,r,ans,mid,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%s",&n,&k,a+1);
cnt=1;
b[1]=1;
for(i=1; i<=n; i++)
{
if(a[i]==a[i-1]) b[cnt]++;
else
{
cnt++;
b[cnt]=1;
}
}
x=0;
for(i=1; i<=n; i++)
if(a[i]-'0'==(i&1)) x++;
if(x<=k||(n-x)<=k)
{
printf("1\n");
continue;
}
l=2;
r=n;
ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n", ans);
}
return 0;
}
T4
ポータル:
WOCの互いに素-設定されたタイトル裸!しかし、そこに注意を払う必要がありますが大きな値にし、上の小さな値を入れています。
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int N=1e4+5;
int n,T,q,a[N],fa[N];
int find(int x)
{
if(x==fa[x]) return fa[x];
return fa[x]=find(fa[x]);
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int o,x,y;
cin>>T;
while (T--)
{
cin>>n;
for (int i = 1; i <= n; i++) cin>>a[i];
cin>>q;
for (int i = 1; i <= n; i++) fa[i]=i;
while (q--)
{
cin>>o;
if(o)
{
cin>>x;
cout<<find(x)<<endl;
continue;
}
else
{
cin>>x>>y;
int fx=find(x),fy=find(y);
if (fx==fy)
{
cout<<"Invalid query!"<<endl;
continue;
}
else
{
if (a[fx]>a[fy]) fa[fy]=fx;
else if (a[fx]==a[fy]) continue;
else fa[fx]=fy;
}
}
}
}
return 0;
}
T5
ポータル:
難しいqwqが、それは難しいことではありません、辛抱強くプッシュ式はおそらく得ることができるようになります。
まず、小規模から大規模まで3つのシーケンス。$ X_I> y_j $場合と$ X_ {I-1} \ GEQ y_j $、その後、明らかに$ X_ {1 ... I-1}同じ同じ$未満$ y_j $は、$ z_i $のために真です。
我々はmz_i $ $ Y $をとる$ Y_I $、$ X $および$ Z $最大値のインデックスをとる場合表し、$ mx_iを設定します。
利用可能なプッシュ式、
$$
ANS = \ Sigma_。1} ^ {I = {Q}(\ Sigma_ 1} = {J} ^ {mz_j z_i + mz_i Y_I)(\ Sigma_ 1} = {J} ^ {MX_j * Y_I mx_i +)
$$
接頭辞とメンテナンスとすることができます。
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int N=100005;
const int mod=1000000007;
long long t,p,q,r,ans,x[N],y[N],z[N],mx[N],mz[N];
inline long long get()
{
long long res=0;char c = getchar();
while (c < '0'||c > '9') c = getchar();
while (c >= '0'&&c <= '9') res = res * 10 + c - '0',c = getchar();
return res;
}
int main(int argc, char const *argv[])
{
t=get();
while (t--)
{
ans=0;
p=get(), q=get(), r=get();
for (int i = 1; i <= p; i++) x[i] = get();
for (int i = 1; i <= q; i++) y[i] = get();
for (int i = 1; i <= r; i++) z[i] = get();
sort (x+1 ,x+p+1);
sort (y+1 ,y+q+1);
sort (z+1 ,z+r+1);
for (int i = 1; i <= p; i++) x[i] += x[i-1];
for (int i = 1; i <= q; i++) y[i] += y[i-1];
for (int i = 1; i <= r; i++) z[i] += z[i-1];
for (int i = 1; i <= q; i++) mx[i]=p,mz[i]=r;
for (int i = 1; i <= q; i++)
{
for (int j = 1; j <= p; j++)
if (x[j] - x[j-1] > y[i]) mx[i] = j;
for (int j = 1; j <= r; j++)
if (z[j] - z[j-1] > y[i]) mz[i] = j;
}
for (int i = 1; i <= q; i++)
{
ans=(ans + ((mz[i] * y[i] + z[mz[i]]) * (x[mx[i]] + mx[i] * y[i])) % mod) % mod;
cout<<ans<<endl;
}
}
return 0;
}