トピックリンク:https://codeforces.com/contest/1284
A:新年とゲーム
そこに、N列Sであることが効果の対象1、S 2 .... S N及びm列T 1、T 2 .... T nは、毎年、および対応するSがTに対応見つける必要そしてそれらを接続します。ルール、それは最後の文字列に達したときに、後方の文字列の後に毎年移動、最初の文字列に対応する、最初の年から始まり、来年は最初の文字列に戻ります。
N入力効果ストリングSにサンプル1、S 2 .... S nは、入力文字列Tの後にM 1、T 2 .... T N。その後、yは整数を表し、年ごとに求め、Qの問い合わせに答える必要があります。N、M(1≤n、m≤20)の範囲内の各数値は 、 以下の文字列長より110,1≤q≤2020,1≤y≤10より大きい。9。
この質問に対する私の解決策は、mとnは最終的に0又はターンであれば、直接%であることができる、二つの文字列の対応する位置に配列されている見つけることです。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
string ss1[25],ss2[25];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
cin>>ss1[i];
for(int i=1;i<=m;i++)
cin>>ss2[i];
int q;
scanf("%d",&q);
while(q--)
{
int t;
scanf("%d",&t);
int t1=t%n;
int t2=t%m;
if(!t1)t1=n;
if(!t2)t2=m;
cout<<ss1[t1]<<ss2[t2]<<endl;
}
return 0;
}
B:新年とアセントシーケンス
任意の2つの配列の組み合わせで影響を受けるN昇順に存在する(それらと組み合わせて、順序を変更せずに)指定された(すなわち、正面位置に位置の数よりも小さい数)の後。
入力整数N(1≤n≤1e5)、次の行のn(1≦LがL、このシーケンスの長さを表す)初めに、L lに桁S続いI、J(0≦S I、J ≦10 。6)、およびすべてのLは1E5を超えません。
この問題に格納された最大値と各シーケンスの最小値の溶液、およびこの配列自体を昇順があるか否かを判定する。それ自体上昇、最小0から1の値と接頭辞を追加したがあれば最小番号の後に+1プレフィックスは、行うと。最後に、最大値は、接頭辞から撮影してすることができます。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
const int maxn=1e6+7;
int minn[maxn],maxx[maxn];
bool ok[maxn];
int mmm[maxn];
int main()
{
int n;
ll sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int l;
scanf("%d",&l);
int a;
int max1,min1;
scanf("%d",&max1);
min1=max1;
for(int j=2;j<=l;j++)
{
scanf("%d",&a);
if(a<min1)min1=a;
if(a>min1)ok[i]=1;
if(a>max1)max1=a;
}
maxx[i]=max1;
minn[i]=min1;
if(ok[i])mmm[0]++;
else mmm[min1+1]++;
}
for(int i=1;i<maxn;i++)
mmm[i]+=mmm[i-1];
for(int i=1;i<=n;i++)
{
if(ok[i])sum+=n;
else{
sum+=mmm[maxx[i]];
}
}
cout<<sum<<endl;
return 0;
}
C:新年と順列
この問題は、連続するサブシーケンスのサイズと一致しているので、最大マイナス最小長はマイナス1に等しく、それは見ることができる、連続した配列を見つけることです。これにより、配置する必要はラインだけを頼りにしています。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
const int maxn=250007;
ll fa[maxn];
int main()
{
int n,mod;
fa[0]=1;
scanf("%d%d",&n,&mod);
for(int i=1;i<=n;i++)fa[i]=fa[i-1]*i%mod;
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=((n-i+1)*(fa[i]*fa[n-i+1]%mod))%mod;
sum%=mod;
}
cout<<sum<<endl;
}