1. 程式人生 > 其它 >補題 Codeforces Round #791 (Div. 2) A、B

補題 Codeforces Round #791 (Div. 2) A、B

補題

A題

思路

這題寫的時候沒想清楚,其實就是解4x + 6y = n

一開始沒想清楚輸出-1的情況,導致後面wa了一堆,還以為是題目問題

輸出-1的情況就是n為奇數,或者n小於4的情況

若不輸出-1,則最大是n/4輛,最小按理說是n/6輛,但是因為不能沒有,所以\((n + 4)/6\),保證在n==4的時候最少也有一輛車

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <deque> 
using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
const int N = 200010, M = 60, INF = 1e9; 
int a[N], b[N];
char g[M][M];

bool cmp(int a, int b)
{
	return a > b;
}

int check(char s)
{
	if(s >= 'a' && s <= 'z')
		return s - 'a' + 10;
	else return s - '0';
}

void solve()
{
	LL n;
	cin >> n;
	if(n & 1 || n < 4) puts("-1");
	else cout << (n + 4) / 6 << ' ' << n / 4 << endl;
}


int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		solve();
	}
	
	return 0;
} 


B題

思路:只用輸出和的結果,在最開始全加起來,然後進行加或者減就好了。

唯一困難的是當全部數字被替換之後怎麼去給陣列中所有元素換成x ,否則下次進行單個元素替換的時候就不對

解決方案就是用map或陣列等 + last標識當前陣列是否被全部替換,如果被全部替換,那麼更新sum之前會將當前數更新成被整體替換的值

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <deque> 
#include <map>
#define int long long
using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
const int N = 200010, M = 60, INF = 1e9; 
int a[N], b[N];
char g[M][M];

bool cmp(int a, int b)
{
	return a > b;
}

int check(char s)
{
	if(s >= 'a' && s <= 'z')
		return s - 'a' + 10;
	else return s - '0';
}

void solve()  //核心程式碼
{
	int n, q;
	cin >> n >> q;
	map<int, int> m;
	int last = 0, sum = 0;
	for(int i = 1; i <= n; i++) cin >> a[i], sum += a[i];
	while(q--)
	{
		int tt, x, idx;
		cin >> tt;
		if(tt == 1)
		{
			cin >> idx >> x;
			if(!m[idx] && last)  //如果這個數沒出現過且陣列整體被更新過了
			{
				m[idx] = 1;
				a[idx] = last;
			}
			sum += x - a[idx];
			a[idx] = x;
		}
		else{
			cin >> x;
			sum = n * x;
			last = x;
                        m.clear();
		}
		cout << sum << endl;
	}
}


int main()
{
	int t;
	//cin >> t;
//	while(t--)
//	{
		solve();
//	}
	
	return 0;
}