模拟 , 显然 p p p 之差大于 10 肯定是 0
#include
using namespace std;
std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
#define ls (loc<<1)
#define rs ((loc<<1)|1)
const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
ll x1, p1, x2, p2;
void solve(cint T) {
cin >> x1 >> p1 >> x2 >> p2;
p1 -= p2;
if(p1 > 10) cout << '>' << endl;
else if(p1 < -10) cout << '<' << endl;
else {
if(p1 > 0) while(p1) { x1 *= 10; --p1; }
if(p1 < 0) while(p1) { x2 *= 10; ++p1; }
if(x1 < x2) cout << '<' << endl;
else if(x1 == x2) cout << '=' << endl;
else cout << '>' << endl;
}
}
int main() {
//freopen("1.in", "r", stdin);
//cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T_=1;
std::cin >> T_;
for(int _T=1; _T<=T_; _T++)
solve(_T);
return 0;
}
贪心 , 取最小的作为除数
#include
using namespace std;
std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
#define ls (loc<<1)
#define rs ((loc<<1)|1)
const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int n;
int a[200100];
void solve(cint T) {
cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
sort(a+1, a+1+n);
for(int i=2; i<=n/2+1; i++) {
cout << a[i] << ' ' << a[1] << endl;
}
}
int main() {
//freopen("1.in", "r", stdin);
//cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T_=1;
std::cin >> T_;
for(int _T=1; _T<=T_; _T++)
solve(_T);
return 0;
}
裸的二分
#include
using namespace std;
std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
#define ls (loc<<1)
#define rs ((loc<<1)|1)
const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
ll n, h;
ll a[101];
bool check(ll x) {
ll rh = h;
for(int i=2; i<=n; i++) {
rh -= min(x, a[i]-a[i-1]);
}
rh -= x;
return rh <= 0;
}
void solve(cint T) {
cin >> n >> h;
for(int i=1; i<=n; i++) cin >> a[i];
ll l = 1, r = h, mid;
while(l < r) {
mid = l + (r-l)/2;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout << r << endl;
}
int main() {
//freopen("1.in", "r", stdin);
//cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T_=1;
std::cin >> T_;
for(int _T=1; _T<=T_; _T++)
solve(_T);
return 0;
}
转移比较复杂的dp
考虑当前最大数是 x x x
如果 m e x = x − 1 mex=x-1 mex=x−1 , 那么下一个可以选 x − 1 x-1 x−1 或 x x x
如果 m e x = x + 1 mex=x+1 mex=x+1 , 那么下一个可以选 x + 2 x+2 x+2 或 x x x
所以可以设 d p [ 0 / 1 ] [ x ] dp[0/1][x] dp[0/1][x] 表示最大数为 x x x 且 m e x = x − 1 / m e x = x + 1 mex=x-1/mex=x+1 mex=x−1/mex=x+1 的情况数
答案就是所有的累加
#include
using namespace std;
std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
#define ls (loc<<1)
#define rs ((loc<<1)|1)
const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int n;
int a[500500];
ll dp[2][500500];
void solve(cint T) {
cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
ll s = 0;
dp[1][0] = 1;
for(int i=1; i<=n; i++) {
dp[0][a[i]] += dp[0][a[i]];
if(a[i] == 0) ++ dp[0][0];
if(a[i]) dp[1][a[i]] += dp[1][a[i]];
dp[1][a[i]+2] += dp[1][a[i]+2];
if(a[i] >= 1) dp[0][a[i]] += dp[0][a[i]-1];
if(a[i] >= 2) dp[1][a[i]] += dp[0][a[i]-2];
if(a[i] == 1) ++ dp[1][1];
dp[1][a[i]] %= mod2;
dp[1][a[i]+2] %= mod2;
dp[1][a[i]] %= mod2;
dp[0][a[i]] %= mod2;
}
ll ans = mod2 - dp[1][0];
for(int i=0; i<=n; i++) ans = (ans + dp[0][i] + dp[1][i]) % mod2;
for(int i=0; i<=n; i++) dp[0][i] = dp[1][i] = 0;
cout << ans << endl;
}
int main() {
//freopen("1.in", "r", stdin);
//cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T_=1;
std::cin >> T_;
for(int _T=1; _T<=T_; _T++)
solve(_T);
return 0;
}
bfs
可以发现 , 如果一个点能到达 L , 当且仅当四周的不能到达 L 的点的个数(不计算墙)小于 2
所以将所有 L 扔进队列里跑 bfs , 每次将新的能到达的点四周的 free block 扔进队列
每个点至多进入 4 次队列
#include
using namespace std;
std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
#define ls (loc<<1)
#define rs ((loc<<1)|1)
const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int n, m;
vector<char> s[1000100];
struct node {
int x, y;
};
bool isfree(cint x, cint y) {
if(x < 0 || x >= n || y < 0 || y >= m) return 0;
return s[x][y] == '.';
}
bool check(cint x, cint y) {
return (isfree(x-1, y) + isfree(x, y-1) + isfree(x+1, y) + isfree(x, y+1)) < 2;
}
void solve(cint T) {
cin >> n >> m;
char ss;
queue<node> q;
for(int i=0; i<n; i++) {
s[i].clear();
for(int j=0; j<m; j++) {
cin >> ss;
s[i].push_back(ss);
if(ss == 'L') q.push({i, j});
}
}
while(!q.empty()) {
node k = q.front();
q.pop();
if(s[k.x][k.y] != 'L' && !check(k.x, k.y)) continue;
if(s[k.x][k.y] != 'L') s[k.x][k.y] = '+';
if(isfree(k.x-1, k.y)) q.push({k.x-1, k.y});
if(isfree(k.x, k.y-1)) q.push({k.x, k.y-1});
if(isfree(k.x+1, k.y)) q.push({k.x+1, k.y});
if(isfree(k.x, k.y+1)) q.push({k.x, k.y+1});
}
for(int i=0; i<n; i++) {
for(char r: s[i]) cout << r;
cout << '\n';
}
}
int main() {
//freopen("1.in", "r", stdin);
//cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T_=1;
std::cin >> T_;
for(int _T=1; _T<=T_; _T++)
solve(_T);
return 0;
}
不会