2020.02.09【NOIP普及組】アナログC組
45282 ワード
0
【普組シミュレーション試合】マノン(farmer.pas/cpp)
1
【普組シミュレーション試合】馬語翻訳(trans.pas/cpp)
2
【一般模擬試合】馬球試合(polo.pas/cpp)
3
【普及シミュレーション】数列(sequence.pas/cpp)
T1
タイトルの説明
入力
しゅつりょく
サンプル入力
サンプル出力
【様式解釈】
データ範囲の制限
O(N^4)
T2
タイトルの説明
入力
しゅつりょく
サンプル入力
サンプル出力
【様式解釈】
データ範囲の制限
dijの板題
T3
タイトルの説明
入力
しゅつりょく
サンプル入力
【入力サンプル2】
サンプル出力
【様式解釈】
【出力サンプル2】
【様式解釈】
データ範囲の制限
f[i]iを人数とする行列数を表す我々はまず最大の数を探し出して、1~maxの中で可能な人数を列挙して、それから私達は繰返しで、2からsqrt(i)まで、iの因数を見つけて、この時2つの可能性があります:1.f[j]+=f[i] 2.jの因数k,f[k]+=f[i]となると事は決する
T4
タイトルの説明
入力
しゅつりょく
サンプル入力
サンプル出力
データ範囲の制限
%60
【普組シミュレーション試合】マノン(farmer.pas/cpp)
1
【普組シミュレーション試合】馬語翻訳(trans.pas/cpp)
2
【一般模擬試合】馬球試合(polo.pas/cpp)
3
【普及シミュレーション】数列(sequence.pas/cpp)
T1
タイトルの説明
, “ ”, 。
, , N*N , , 。 。
, 。 , , , , 。 , , 。
, , , 。
入力
N, N*N。
N , N A(i,j), i j 。
( : , , 。)
しゅつりょく
。
サンプル入力
3
1 2 3
4 5 6
7 8 9
サンプル出力
2
【様式解釈】
データ範囲の制限
【 】
40% , N<=10。
100% , N<=50, -1000
O(N^4)
#include
#include
#include
using namespace std;
long long f[2001][2001],a[2001][2001],d[5000001],n,ans;
int main(){
freopen("farmer.in","r",stdin);
freopen("farmer.out","w",stdout);
memset(f,0,sizeof(f));
scanf("%lld",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
for(int x=1;x<=i;x++)
for(int y=1;y<=j;y++)
d[f[i][j]-f[i][y-1]-f[x-1][j]+f[x-1][y-1]]++;
for(int x=i+1;x<=n;x++)
for(int y=j+1;y<=n;y++)
ans+=d[f[x][y]-f[x][j]-f[i][y]+f[i][j]];
for(int x=1;x<=i;x++)
for(int y=1;y<=j;y++)
d[f[i][j]-f[i][y-1]-f[x-1][j]+f[x-1][y-1]]=0;
for(int x=1;x<=i;x++)
for(int y=j+1;y<=n;y++){
d[f[i][y]-f[x-1][y]-f[i][j]+f[x-1][j]]++;
}
for(int x=i+1;x<=n;x++)
for(int y=1;y<=j;y++)
ans+=d[f[x][j]-f[i][j]-f[x][y-1]+f[i][y-1]];
for(int x=1;x<=i;x++)
for(int y=j+1;y<=n;y++)
d[f[i][y]-f[x-1][y]-f[i][j]+f[x-1][j]]=0;
}
printf("%lld",ans);
return 0;
}
T2
タイトルの説明
, 。 。 , , 。
M , K 。 , , 1 N 。 , 。
入力
N, K M, , , 。
M , K 。 ( 1 N)。
しゅつりょく
。 , -1。
サンプル入力
9 3 5
1 2 3
1 4 5
3 6 7
5 6 7
6 8 9
サンプル出力
4
【様式解釈】
1-3-6-9 1-5-6-9
データ範囲の制限
【 】
40% N<=100, 1<=K<=20, M<=40。
100% 1<=N<=100000, 1<=K<=1000, 1<=M<=1000。
dijの板題
#include
#include
#include
using namespace std;
long long dis[100100];
int n,m,k,a[2000][2000];
void spfa(){
long long f=1;
memset(dis,0x3f,sizeof(dis));
dis[1]=1;
while(f!=0){
f=0;
for(int i=1;i<=m;i++){
long long minn=0x3ffffff,bz=0x3fffffff;
for(int j=1;j<=k;j++)
if(dis[a[i][j]]<minn)
minn=dis[a[i][j]];
if(minn==bz)continue;
for(int j=1;j<=k;j++)
if(dis[a[i][j]]>minn+1)
dis[a[i][j]]=minn+1,f=1;
}
}
}
int main(){
freopen("trans.in","r",stdin);
freopen("trans.out","w",stdout);
cin>>n>>k>>m;
for(int i=1;i<=m;i++)
for(int j=1;j<=k;j++)
cin>>a[i][j];
spfa();
if(dis[n]==dis[0])cout<<-1;
else cout<<dis[n];
}
T3
タイトルの説明
, , , 。 。
, , 。 , , , ( , )。 , , , 。
, , , , 。 , 2 。
入力
N, 。
N a(i), i 。
しゅつりょく
。
サンプル入力
【 1】
3 1 3 6
【入力サンプル2】
5 4 6 3 8 9
サンプル出力
【 1】
6
【様式解釈】
3 , 1 。 2 3 , 2 , 6 。
【出力サンプル2】
9
【様式解釈】
3 , 2,3,5 。 3 , 9 。
データ範囲の制限
【 】
20% 2<=N<=100, 1<=a(i)<=10000。
50% 2<=N<=20000。
100% 2<=N<=200000, 1<=a(i)<= 2000000。
f[i]iを人数とする行列数を表す我々はまず最大の数を探し出して、1~maxの中で可能な人数を列挙して、それから私達は繰返しで、2からsqrt(i)まで、iの因数を見つけて、この時2つの可能性があります:1.f[j]+=f[i] 2.jの因数k,f[k]+=f[i]となると事は決する
#include
#include
using namespace std;
long long m,n,k,x,y,f[4000000];
int main(){
freopen("polo.in","r",stdin);
freopen("polo.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>k;
f[k]++;
m=max(k,m);
}
for(int i=1;i<=m;i++){
if(f[i]!=0)
for(int j=2;j*j<=i;j++){
if(i%j==0){
if(i!=j)f[j]+=f[i];
if(j*j!=i)f[i/j]+=f[i];
}
}
}
for(int i=1;i<=m;i++){
if(f[i]>1)//
x=max(f[i]*i,x);
}
cout<<x;
return 0;
}
T4
タイトルの説明
N , A, 。
入力
N,A
N , N 。
しゅつりょく
, 。
サンプル入力
5 1
1 2 3 4 5
サンプル出力
14
データ範囲の制限
60% N <= 1000
100% N <= 100000
longint 。
%60
#include
#include
using namespace std;
long long m,n,k,a[1000100],b[1000100];
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]-=k;
b[i]=b[i-1]+a[i];
}
k=0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(b[j]-b[i-1]>0)k++;
}
}
cout<<k;
return 0;
}