浙江省伝統中国医学大学の第12回学部プログラムデザインコンペティション

問題A. JhadgreのC言語プログラム

注目は地獄

問題B. WpremigのAHの戦い

Bashゲームは3つの状況で説明されています。
m <= nの場合、最初から勝つことができます。
m> nおよびm%(n + 1)== 0の場合、最初の移動は無効にする必要があります。
m> nかつm%(n + 1)!= 0の場合、最初にm%(n + 1)をとるだけで済みます。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

int m, n;

int main()	
{
	while (scanf("%d%d", &n, &m) != EOF)
	{
		if (m % (n + 1) == 0)
			puts("You are loser");
		else if (n >= m)
		{
			for (int i = m; i < n; i ++)
				printf("%d ", i);
			printf("%d\n", n);
		}
		else
			printf("%d\n", m % (n + 1));
	}
	return 0;
}

問題C. Wpremigの三角形

三角形を幅dの長方形に分割し、高から低に並べ替えます。次に、領域で最適になるように最初のL / d長方形を選択する必要があります。次に、長方形を無限に分割した後、最後に選択した長方形の高さがHであるとします。次に、高さがHより大きい三角形の場合、選択された三角形に属する高さHの長方形が必要です。次に、高さがHより大きいすべての三角形について、高さHのパーツを領域に配置する必要があります。つまり、交差の高さはHです。
結論:
1.最短の辺がx軸に配置されます;
2. x軸に配置された辺が決定されると、最適解は、x軸に平行な直線上のすべての三角形の交点を満たします

上記の結論から、三角形が高いほど選択が容易であることは明らかであり、三角形が高いほど優れています。
この結論により、二等分点の高さはこの問題を簡単に解決できます

#include <cstdio>
#include <cmath>
using namespace std;
const double eps = 1e-8;
const int maxn = 100010;

int T, cas = 1, n;
double r, a[maxn], b[maxn], c[maxn];
double area[maxn], height[maxn];

double f(double h)
{
    double ret = 0;
    for (int i=1;i<=n;i++)
        if (h < height[i]) ret += a[i] * (1.0 - h / height[i]);
    return ret;
}

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%lf", &n, &r);
        for (int i=1;i<=n;i++) scanf("%lf%lf%lf", &a[i], &b[i], &c[i]);
        for (int i=1;i<=n;i++)
        {
            double p = (a[i] + b[i] + c[i]) / 2;
            area[i] = sqrt(p * (p-a[i]) * (p-b[i]) * (p-c[i]));
            height[i] = area[i] * 2 / a[i];
        }
        double low = 0, high = 1000000, mid;
        while ( fabs(high - low) > eps )
        {
            mid = (low + high) / 2;
            if (f(mid) <= r) high = mid;
            else low = mid;
        }
        double ans = 0, h = mid;
        for (int i=1;i<=n;i++)
            if (h < height[i]) ans += a[i] * (1.0 - h / height[i]) * (height[i] - h) / 2;
        printf("%.3lf\n", ans + h * r);
    }
    return 0;
}

問題D. Jhadgreのはしご

送信、データ範囲はINT_MAXではなくintより大きいことに注意してください

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

int main()
{
	long long n,l;
	cin>>n>>l;
	long long ans = l;
	for (int i = 0 ; i < n ; ++i) {
		long long x;cin>>x;
		if (x > ans) ans = x;
	}
	cout<<ans - l<<endl;
	return 0;
} 

問題E.ジャドグレの合唱形成

もともとは、ツリーセットツリーを通過できるようにしたかったのですが…タイトルの時間制限やスペース制限がもっとぎこちないので、単純に二分法に変更しました。

最初に1回だけ質問する場合を考えます。次に、質問の順序がkであると仮定します。答えを中間で除算できます。各チェックは、すべての変更をトラバースし、ツリー配列を作成し、[x、y]間隔に数値zを追加する操作です。 z> = midの場合、[a、b]の間隔全体に+1を与えます。最後に、クエリ間隔の合計、つまり、この間隔の中央の数値> =の数。この数> = kの場合、2で割り、答えを記録します。それ以外の場合、2で割ります。

最も時間がかかる場所はメンテナンスであり、メンテナンス操作はmidにのみ関連しており、特定のクエリとは何の関係もないことがわかります。したがって、クエリの処理を検討し、 "上向き二分法"(つまり[mid + 1、r])および "下向き二分法"クエリ(つまり[l、mid])である必要があるすべてのクエリを毎回セットに入れて、もちろん、同時に、それらに影響を与える可能性のある変更も、クエリの後にコレクションに追加する必要があります。そうすると、操作は個別に再帰的に続行されます。

クエリの場合、クエリ間隔の合計がクエリのランキング以上の場合、クエリは「上向き二分法」セットに分割され、それ以外の場合は「下向き二分法」セットに分割されます。

変更の場合、変更によって追加された数が<= midの場合、[mid + 1、r]で回答されたと判断されたクエリに寄与してはならないため、「下向き二分法」のセットにのみ追加する必要があります。
それ以外の場合したがって、この変更は区間[l、mid]のクエリに貢献したに違いありません。[l、mid]の質問のランキングから1を引くと、この変更は「up dichotomy」セットの問い合わせにのみ寄与するため、この変更を「up dichotomy」に追加します。コレクション内。

それらの数については、それを維持するためにBITを使用するだけです。間隔更新+間隔クエリ。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAXN 50005
typedef long long LL;
using namespace std;
int n,m,id[MAXN],t1[MAXN],t2[MAXN],T=0;
LL ans[MAXN];

LL read(){
    LL x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';c=getchar();
    }
    return x*f;
}

struct Node1{
    int opt,a,b;
    LL c;
}O[MAXN];
struct BIT{
    LL c[MAXN];int sign[MAXN];
    int lowbit(int x){return x&-x;}
    void add(int pos,int x){
        while(pos<=n){
            if(sign[pos]!=T)c[pos]=0,sign[pos]=T;
            c[pos]+=x,pos+=lowbit(pos);
        }
    }
    LL query(int pos){
        LL res=0;
        while(pos>0){
            if(sign[pos]!=T)c[pos]=0,sign[pos]=T;
            res+=c[pos],pos-=lowbit(pos);
        }
        return res;
    }
}c1,c2;

void ADD(int a,int b){
    c1.add(a,1),c1.add(b+1,-1);
    c2.add(a,a),c2.add(b+1,-b-1);
}
LL QUERY(int a,int b){
    LL res=0;
    res+=(b+1)*c1.query(b)-c2.query(b);
    res-=a*c1.query(a-1)-c2.query(a-1);
    return res;
}
void solve(int l,int r,int ansl,int ansr){
    if(l>r)return;
    if(ansl==ansr){
        for(int i=l;i<=r;i++)
        if(O[id[i]].opt==2)ans[id[i]]=ansl;
        return;
    }
    int mid=(ansl+ansr)>>1;
    int j=1,k=1;
    T++;
    for(int i=l;i<=r;i++){
        int idx=id[i];
        if(O[idx].opt==1){
            if(O[idx].c<=mid)t1[j++]=idx;
            else t2[k++]=idx,ADD(O[idx].a,O[idx].b);
        }
        else{
            LL res=QUERY(O[idx].a,O[idx].b);
            if(res>=O[idx].c)t2[k++]=idx;
            else t1[j++]=idx,O[idx].c-=res;
        }
    }
    --j,--k;
    for(int i=1;i<=j;i++)id[l+i-1]=t1[i];
    for(int i=1;i<=k;i++)id[l+j+i-1]=t2[i];
    solve(l,l+j-1,ansl,mid),solve(l+j,r,mid+1,ansr);
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++){
    	O[i].opt=read();
		O[i].a=read();
		O[i].b=read();
		O[i].c=read();
		id[i]=i;
	}
    solve(1,m,-n,n);
    for(int i=1;i<=m;i++)
    	if(O[i].opt==2)
			printf("%d\n",ans[i]);
    return 0;
}

問題F.ジャドグレの悲しい

再帰、小さなdp、さりげなく書く。

#include <bits/stdc++.h>
using namespace std;
int n;
int a[100000];
int fun(int x){
	if (x > n) return 0;
	return min(fun(a[x]),fun(x + 5)) + 1;
}

int main()
{
	scanf("%d",&n);
	for (int i = 1 ; i <= n ; ++i)
		scanf("%d",&a[i]);
	cout<< fun(1) * 2<<endl; 
	return 0;
} 

問題G. Wpremigの計量問題

最初に結論を出します:異なる品質のボールを見つけ、y回の重量を知る必要がある場合、計量できるボールの最大数はn = (3 k − 3)/ 2(3 ^ k-3)/ 2です。3k3 / 2

プルーフ考え方は以下の通りであり、補題は順番に証明される:
補題1
がm個のボールがあるか、または標準または標準より重く、そしてnボールが標準または標準と少なくとも一つの標準ボールより軽い、次いで計量のk個の時間があってもよい場合どのボールであるかを決定するための必要十分条件:m + n≤3 k m +n≤3^ kメートル+k

補題2:
標準の重量であるか、それより軽いか重いかがわからないボールがn個あり、標準のボールが少なくとも1個ある場合、k回の判定に必要な十分な条件:n≤1/2( 3 k + 1)n≤1/ 2(3 ^ k + 1)1 / 2 3k+1

補題3:
標準の重さ、軽いか重いか、少なくとも1つの標準的なボールかどうかを知らずにn個のボールがある場合、k回の計量でどのボールがどれであるか、またボールが軽いか重いかを判断できます。重要な条件は次のとおりです。n≤1/2(3 k − 1)n≤1/ 2(3 ^ k-1)1 / 2 3K -1
補題1の充足を証明するアイデアがある:
レットM = 3 I + J、N = 3、K + RM = 3I + J、N = 3K + Rメートル=3 +j =3 k+r重くなる可能性のある両側にiを、軽い可能性のあるkにiを置き、次にj、r = 0、1、2の合計9つの可能性があります。分類について議論し、再帰的に検討してください。
必要性は明白です。
補題2の十分性の証明の考え方は:
(3 k + 1)/ 2(3 ^ k + 1)/ 23k+1 / 2ボール、初回(3 k − 1 + 1)/ 2(3 ^ {k-1} +1)/ 23k 1+1 /左側の 2つのボール、(3 k − 1 − 1)/ 2(3 ^ {k-1} -1)/ 23k 11 / 2ボール+右側の標準ボール、残りの(3 k − 1 + 1)/ 2(3 ^ {k-1} +1)/ 23k 1+1 / 2最初の計量、再帰によってバランスが証明されるか、補題によってアンバランスが証明されます。
補題3の十分性証明は同じ考え方で、違いは残りの(3 k − 1 − 1)/ 2(3 ^ {k-1} -1)/ 2にあります。3k 11 / 2ボール。
補題3の必要性の証明の考え方は、上記の質問2のそれと同じ
です。補題2の比較証明はより厄介ですが、考え方は依然として似ています。最初の計量が不均衡な場合は補題1を使用し、バランスが取れている場合は再帰的に使用します。
最後に、最初の計量では、2つの問題の証明を個別に検討する必要があります。これは、借りる標準的なボールがなく、数が補題より1つ少ないため、補題の結論を使用して、同様のアイデアで証明できるためです。

#include <bits/stdc++.h>
using namespace std;
int main(){
	int x,y;
	while (~scanf("%d%d",&x,&y)){
		if (x <= 2){
			puts("No");
			continue;
		}
		long long now = 3;
		int k;
		for (k = 2 ; k < 15 ; ++k){
			now *= 3;
			if ((now-3)/2 >= x) break;
		}
		if (k <= y) puts("Yes");
		else puts("No");
	}
	return 0;
} 

問題H. Jhadgreの帰り道

明らかに、「L」→「W」→「Q」のパスに従って検索することは困難です。最初に各「W」に移動し、次に「W」から「Q」への最短パスを検索する必要があるためですが、このパスは想像できます。 「L」→「W」←「Q」となりますので、「W」を意識する必要はありません。
したがって、「L」から始まり「Q」から始まり、各「W」をトラバースするbfsの2回、「L」と「Q」からこのポイントまでの最短パスの合計が重要です。寝室に戻る最短の方法は、最短のものを頼むだけです。

または、それぞれ「L」と「Q」から始まる2回のbfsで2つのbfsを実行し、マップ全体をトラバースしてすべての「W」の最短パスを判断します。

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 2010;
const int INF = 0x3f3f3f3f;

int n, m;
int vis[MAXN][MAXN];
int ret[2][MAXN][MAXN];
char a[MAXN][MAXN];
int xx[4] = {1,-1,0,0};
int yy[4] = {0,0,1,-1};

void bfs(int xxx, int yyy, int d) {
	queue< pair<int, int> > q;
	q.push(make_pair(xxx, yyy));
	vis[xxx][yyy] = 1;
	ret[d][xxx][yyy] = 0;
	while(!q.empty()) {
		int tx = q.front().first;
		int ty = q.front().second;
		q.pop();
		for (int i = 0;i < 4; ++i) {
			int x = tx + xx[i];
			int y = ty + yy[i];
			if (x >= 0 && x < n && y >= 0 && y < m && a[x][y] != '#' && !vis[x][y]) {
				ret[d][x][y] = ret[d][tx][ty] + 1;
				vis[x][y] = 1;
				q.push(make_pair(x, y));
			}
		}
	}
}

int main() {
	while (~scanf("%d %d", &n, &m)){
		queue< pair<int, int> > q;
		memset(ret, INF, sizeof(ret));
		memset(vis, 0, sizeof(vis));
		int sx, sy;
		int tx, ty;
		for (int i = 0;i < n; ++i) {
			scanf("%s", a[i]);
			for (int j = 0;j < m; ++j) {
				if (a[i][j] == 'W') {
					q.push(make_pair(i, j));
				} else if (a[i][j] == 'L') {
					sx = i;
					sy = j;
				} else if (a[i][j] == 'Q') {
					tx = i;
					ty = j;
				}
			}
		}
		bfs(sx, sy, 0);
		memset(vis, 0, sizeof(vis));
		bfs(tx, ty, 1);
		int ans = INF;
		while(!q.empty()) {
			int x = q.front().first;
			int y = q.front().second;
			q.pop();
			ans = min(ans, ret[0][x][y] + ret[1][x][y]);
		}
		printf("%d\n", ans);
	}
	return 0;
}

問題I. JhadgreのCookie

タイトルを送信します。string.find()

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

int main()
{
	int N;scanf("%d",&N);
	int ans = 0 ;
	while (N--){
		string x;cin>>x;
		if (x.find("zailaiyihe") != string::npos){
			ans++;
		} 
	} 
	cout<<ans<<endl;
	return 0;
} 

問題J. Jhadgreの階段を登る

ダブルforループで十分です...モジュロは1 e 9 + 7 1e9 + 7ではないことに注意してください1 e 9+71 e 8 + 7 1e8 + 71 e 8+7

#include <iostream>
#include <cstdio>
using namespace std;
const int mod = 100000007;
int dp[10100];
int main() {
	int n;
    dp[0] = 1;
    for (int i = 1; i <= 10000; ++i) {
        dp[i] = dp[i - 1];
        for (int j = i - 2; j >= 0; j -= 2) {
            dp[i] += dp[j];
            dp[i] %= mod;
        }
    }
    while (cin>>n)
    	cout << dp[n] << endl;
    return 0;
}

問題K.ジャドグレのπ

BBP式またはさまざまな収束方法がすべて可能です。
http://www.huanqiujiemi.com/7xqE25x.html
参考画像...日本で出版された本

#include <cstdio>
#include <cmath>
#include <iostream>
#define MAX_C 56000
int a = 10000, b, c = MAX_C, d, e, f[MAX_C + 1], g, n, ans, cnt;
using namespace std;

int main()
{
	int pp;
    scanf("%d", &n);
    a = 10000;
	b = d = e = g = ans = cnt = 0;
	c = MAX_C; 
	for (; b - c; ) f[b++] = a / 5;
    for (; d = 0, g = c * 2; c -= 14, ans = e + d / a, e = d % a, cnt++) {
        if (cnt * 4 > n) break;
        for (b = c; d += f[b]*a, f[b] = d % --g, d /= g--, --b; d *= b);
    }
    if (n % 4 == 0) cout << (ans / 1000);
    else if (n % 4 == 1) cout << ((ans / 100) % 10);
    else if (n % 4 == 2) cout << ((ans / 10) % 10);
    else if (n % 4 == 3) cout << (ans % 10);
    cout<<endl;
	return 0;
}

L. WpremigのNiuniuの問題

英語のリーディング質問
まず、5次元配列を使用してすべての可能なスコアを前処理し、次に各データセットを直接合計してから、/ 13を計算します。丸めに注意してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

inline void read(int &x)
{
    x = 0;char ch = getchar(), c = ch;
    while(ch < '0' || ch > '9')c = ch, ch = getchar();
    while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
    if(c == '-')x = -x;
}

inline int min(int a,int b)
{return a<b?a:b;}

int ans[15][15][15][15][15];
int x,y,m,n,z,sum;

inline void init()
{
    for(int a = 1;a <= 13;++ a)
        for(int b = 1;b <= 13;++ b)
            for(int c = 1;c <= 13;++ c)
                for(int d = 1;d <= 13;++ d)
                    for(int e = 1;e <= 13;++ e)
    {
        if(a<5 && b<5 && c<5 && d<5 && e<5 && a+b+c+d+e <= 10)
            ans[a][b][c][d][e] = 60;
        else if(a>10 && b>10 && c>10 && d>10 && e>10)
            ans[a][b][c][d][e] = 50;
        else if((a==b && b==c && c==d) || (a==b && b==c && c==e) || (a==b && b==d && e==d) || (a==e && e==c && c==d) || (e==b && b==c && c==d))            
            ans[a][b][c][d][e] = 40;
        else
        {
            x = min(a,10),y = min(b,10),m = min(c,10),n = min(d,10),z = min(e,10);
            if((x+y+m)%10 == 0 || (y+m+n)%10 == 0 || (m+n+z)%10 == 0 || (x+y+n)%10 == 0 || (x+y+z)%10 == 0 || (y+m+z)%10 == 0 || (y+n+z)%10 == 0 || (x+n+z)%10 == 0 || (x+m+n)%10 == 0 || (x+m+z)%10 == 0)
            {
                sum = x+y+m+n+z;
                if(sum%10 == 0)
                    ans[a][b][c][d][e] = 30;
                else if(sum%10 < 7)
                    ans[a][b][c][d][e] = sum%10;
                else
                    ans[a][b][c][d][e] = (sum%10)*2;
            }
        }
    }
}

int main()
{
    init();
    int t;
    read(t);
    for(;t;--t)
    {
        sum = 0;
        read(x),read(y),read(m),read(n);
        for(register int i = 1;i <= 13;++ i)
            sum += ans[x][y][m][n][i];
        sum = (sum/13.0)+0.5;
        printf("%d\n",sum);
    }
    return 0;
}

問題M. WpremigとJhadgreの宝の地図

グラフの色を黒と白にします。
黒のグリッドの数を黒、
白のグリッドの数を白に
設定し、黒のグリッドとsumblack
の値、および白のグリッドの値の合計sumwhiteに設定します。

端の各グリッドの数がxになるとすると、
黒* x – sumblack =白* x – sumwhite
x =(sumblack – sumwhite)/(黒–白)

1.黒≠白の場合、xを解いてからネットワークフローチェックを使用できます
。2。黒=白の場合、正当なxの場合、k> = xは
黒=白=>(黒+ white)%2 == 0は、完全なカバレッジのレイヤーを構築できるため、
xを2に分割し、ネットワークフローを使用して確認できます

チェック
構築の
場合ポイントkが白の場合、エッジ(s、k、x – v [k])を
作成しますポイントkが黒の場合
、隣接するポイントuへのエッジ(k、t、x – v [k])作成します、V(uは白)、エッジ(u、v、inf)を作成して
、フローがいっぱいかどうか判断します。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
const int s=1690,t=1691;
const LL oo2=1e17,oo1=1e13,oo3=1e15;
int a[50][50],num[50][50],xx[]={0,0,1,-1},yy[]={1,-1,0,0},
fir[1700],ne[10010],to[10010],que[1700],f[1700],
m,n,tot;
LL w[10010];
bool ok(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}
void init()
{
    int i,j;
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
}
void add(int u,int v,LL x)
{
    tot++;
    ne[tot*2]=fir[u];
    fir[u]=tot*2;
    to[tot*2]=v;
    w[tot*2]=x;
    ne[tot*2+1]=fir[v];
    fir[v]=tot*2+1;
    to[tot*2+1]=u;
    w[tot*2+1]=0;
}
bool find()
{
    int hd=1,tl=1,i,u,v;
    que[1]=s;
    memset(f,0,sizeof(f));
    f[s]=1;
    while (hd<=tl)
    {
        u=que[hd++];
        for (i=fir[u];i;i=ne[i])
          if (w[i]&&!f[v=to[i]])
          {
            f[v]=f[u]+1;
            que[++tl]=v;
          }
    }
    return f[t];
}
LL dfs(int u,LL lim)
{
    int i,v;
    LL ret=0,x;
    if (u==t) return lim;
    for (i=fir[u];i&&ret<lim;i=ne[i])
      if (w[i]&&f[v=to[i]]==f[u]+1)
      {
        x=dfs(v,min(lim-ret,w[i]));
        ret+=x;
        w[i]-=x;
        w[i^1]+=x;
      }
    if (!ret) f[u]=0;
    return ret;
}
bool ok(LL x)
{
    int i,j,kk,x1,y1;
    tot=0;
    memset(fir,0,sizeof(fir));
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        if (i+j&1) add(s,num[i][j],x-a[i][j]);
        else add(num[i][j],t,x-a[i][j]);
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        if (i+j&1)
          for (kk=0;kk<4;kk++)
            if (ok(x1=i+xx[kk],y1=j+yy[kk]))
              add(num[i][j],num[x1][y1],oo3);
    while (find())
    {
        int xxx;
        xxx=1;
        while (dfs(s,oo2));
    }
    for (i=fir[s];i;i=ne[i])
      if (w[i]) return 0;
    return 1;
}
void solve1()
{
    int i,j;
    LL s0=0,s1=0,x;
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        if (i+j&1) s1+=a[i][j];
        else s0+=a[i][j];
    x=s0-s1;
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        if (a[i][j]>x)
        {
            printf("-1\n");
            return;
        }
    if (!ok(x)) printf("-1\n");
    else printf("%lld\n",(x*m*n-s0-s1)/2);
}
void solve0()
{
    int i,j;
    LL s0=0,s1=0,x,l,r,mid;
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        if (i+j&1) s1+=a[i][j];
        else s0+=a[i][j];
    if (s0!=s1)
    {
        printf("-1\n");
        return;
    }
    l=0;
    for (i=1;i<=n;i++)
      for (j=1;j<=m;j++)
        l=max(l,(LL)a[i][j]);
    r=oo1;
    while (l<r)
    {
        mid=(l+r)/2;
        if (ok(mid)) r=mid;
        else l=mid+1;
    }
    if (l==oo1) printf("-1\n");
    else printf("%lld\n",(l*m*n-s0-s1)/2);
}
int main()
{
    int T,i,j;
    for (i=1;i<=40;i++)
      for (j=1;j<=40;j++)
        num[i][j]=i*40+j;
    scanf("%d",&T);
    while (T--)
    {
        init();
        if (m*n&1) solve1();
        else solve0();
    }
}

おすすめ

転載: blog.csdn.net/jnxxhzz/article/details/85211569