当前位置: 首页 > news >正文

Codeforces 1053 (Div.2)

Codeforces 1053 (Div.2)

C. Incremental Stay

题意: 有n个人,存在2*n个时刻,分配这2n个时刻给予n个人进出的时间,输出当博物馆容量为(1-n)时,这些人呆在博物馆的总时长最大值

思路: 对于\(i \in [1, n]\)匹配前(i - 1)个时刻和后(i - 1)个时刻为(i - 1)个游客进出的时间,中间剩余的一个游客进进出出,维护奇数前缀和与偶数前缀和,然后模拟即可。

Tag: 前缀和, 贪心匹配

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
#define endl "\n"
typedef pair<int, int> Pii;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REP3(i, m, n) for (int i = (m); (i) < int(n); ++ (i))
#define rep(i,b) for(int i=(int)(0);i<(int)(b);i++)
#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define ALL(x) begin(x), end(x)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(s) (s).begin(),(s).end()
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define drep(i, n) drep2(i, n, 0)
#define rever(vec) reverse(vec.begin(), vec.end())
#define sor(vec) sort(vec.begin(), vec.end())
#define fi first
#define FOR_(n) for (ll _ = 0; (_) < (ll)(n); ++(_))
#define FOR(i, n) for (ll i = 0; (i) < (ll)(n); ++(i))
#define se second
#define pb push_back
#define P pair<ll,ll>
#define PQminll priority_queue<ll, vector<ll>, greater<ll>>
#define PQmaxll priority_queue<ll,vector<ll>,less<ll>>
#define PQminP priority_queue<P, vector<P>, greater<P>>
#define PQmaxP priority_queue<P,vector<P>,less<P>>
#define NP next_permutation
#define die(a) {cout<<a<<endl; return;}
#define dier(a) {return a;}
//const ll Mod = 1000000009;
const ll Mod = 998244353;
//const ll Mod = 1000000007;
#define inv(a) q_pow((ll)a, Mod - 2)
const ll inf = 4000000000000000000ll;
const ld eps = ld(0.00000000001);
static const long double pi = 3.141592653589793;
template<class T>void vcin(vector<T> &n){for(int i=0;i<int(n.size());i++) cin>>n[i];}
template<class T,class K>void vcin(vector<T> &n,vector<K> &m){for(int i=0;i<int(n.size());i++) cin>>n[i]>>m[i];}
template<class T>void vcout(vector<T> &n){for(int i=0;i<int(n.size());i++){cout<<n[i]<<" ";}cout<<endl;}
template<class T>void vcin(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cin>>n[i][j];}}}
template<class T>void vcout(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cout<<n[i][j]<<" ";}cout<<endl;}cout<<endl;}
void yes(bool a){cout<<(a?"yes":"no")<<endl;}
void YES(bool a){cout<<(a?"YES":"NO")<<endl;}
void Yes(bool a){cout<<(a?"Yes":"No")<<endl;}
void possible(bool a){ cout<<(a?"possible":"impossible")<<endl; }
void Possible(bool a){ cout<<(a?"Possible":"Impossible")<<endl; }
void POSSIBLE(bool a){ cout<<(a?"POSSIBLE":"IMPOSSIBLE")<<endl; }
#define FOR_R(i, n) for (ll i = (ll)(n)-1; (i) >= 0; --(i))
template<class T>auto min(const T& a){ return *min_element(all(a)); }
//template<class T>auto max(const T& a){ return *max_element(all(a)); }
template<class T,class F>void print(pair<T,F> a){cout<<a.fi<<" "<<a.se<<endl;}
template<class T>bool chmax(T &a,const T b) { if (a<b) { a=b; return 1; } return 0;}
template<class T>bool chmin(T &a,const T b) { if (b<a) { a=b; return 1; } return 0;}
template<class T> void ifmin(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
template<class T> void ifmax(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
ll fastgcd(ll u,ll v){ll shl=0;while(u&&v&&u!=v){bool eu=!(u&1);bool ev=!(v&1);if(eu&&ev){++shl;u>>=1;v>>=1;}else if(eu&&!ev){u>>=1;}else if(!eu&&ev){v>>=1;}else if(u>=v){u=(u-v)>>1;}else{ll tmp=u;u=(v-u)>>1;v=tmp;}}return !u?v<<shl:u<<shl;}
ll modPow(ll a, ll n, ll Mod) { if(Mod==1) return 0;ll ret = 1; ll p = a % Mod; while (n) { if (n & 1) ret = ret * p % Mod; p = p * p % Mod; n >>= 1; } return ret; }
vector<ll> divisor(ll x){ vector<ll> ans; for(ll i = 1; i * i <= x; i++){ if(x % i == 0) {ans.push_back(i); if(i*i!=x){ ans.push_back(x / ans[i]);}}}sor(ans); return ans; }
ll pop(ll x){return __builtin_popcountll(x);}
ll poplong(ll x){ll y=-1;while(x){x/=2;y++;}return y;}
P hyou(P a){ll x=fastgcd(abs(a.fi),abs(a.se));a.fi/=x;a.se/=x;if(a.se<0){a.fi*=-1;a.se*=-1;}return a;}
P Pplus(P a,P b){ return hyou({a.fi*b.se+b.fi*a.se,a.se*b.se});}
P Ptimes(P a,ll b){ return hyou({a.fi*b,a.se});}
P Ptimes(P a,P b){ return hyou({a.fi*b.fi,a.se*b.se});}
P Pminus(P a,P b){ return hyou({a.fi*b.se-b.fi*a.se,a.se*b.se});}
P Pgyaku(P a){ return hyou({a.se,a.fi});}ll q_pow(ll x, ll n, ll Mod) {ll res = 1;for (; n > 0; n /= 2) {if (n % 2) res = res * x % Mod;x = x * x % Mod;}return res % Mod;
}ll i, j;
ll n, m, k, x;
ll l, r, p, q;
ll a, b;
void solve() {cin >> n;m = 2LL * n;vector<ll> a(m + 1, -1);for(int i = 1; i <= m; ++i) cin >> a[i];vector<ll> pre1(n + 1, 0);for(int i = 1; i <= n; ++i) pre1[i] = pre1[i - 1] + (a[2 * i] - a[2 * i - 1]);vector<ll> pre2(n + 1, 0);for(int i = 1; i <= (n - 1); ++i) pre2[i] = pre2[i - 1] + (a[2 * i + 1] - a[2 * i]);ll sm = 0;cout << pre1[n] << " ";for(int i = 1; i <= (n - 1); ++i) {sm += a[2LL * n - i + 1] - a[i];if(i % 2 == 1) {cout << sm + max(0LL, pre2[(m - i - 1) / 2] - pre2[(i - 1) / 2]) << " ";} else {cout << sm + max(0LL, pre1[(m - i) / 2] - pre1[(i / 2)]) << " ";}}cout << endl; return;
}
int main() {std::ios::sync_with_stdio(false);std::cout.tie(0);int t;cin >> t;while(t--) solve();
}

D. Grid Counting

题意: 给你一个n*n的网格图,再给你一个n长度的数组a,必须满足以下三个条件

  1. (1<=k<=n)第k行必须有ak个黑色格子
  2. (1<=k<=n),有且只有一个索引\(max(xi, yi) = k\)
  3. (1<=k<=n),有且只有一个索引\(max(xi, n + 1 -yi) = k\)

思路: 先忽略条件1,把条件2转换成左上方每一层的L型状格子有且只有一个格子,条件3则对应右上方的每一层有且只有一个格子,经过相互限制可以发现,可以选择的只有上方的倒三角形状的格子,且每一列必须有且只有有一个来满足条件2,3,接下来加上条件1跑一遍组合数即可。

Tag:组合数学,图形分析(需要转化为图上的前缀和直觉)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
#define endl "\n"
typedef pair<int, int> Pii;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REP3(i, cmp, n) for (int i = (cmp); (i) < int(n); ++ (i))
#define rep(i,b) for(int i=(int)(0);i<(int)(b);i++)
#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define ALL(x) begin(x), end(x)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(s) (s).begin(),(s).end()
#define drep2(i, cmp, n) for (int i = (cmp)-1; i >= (n); --i)
#define drep(i, n) drep2(i, n, 0)
#define rever(vec) reverse(vec.begin(), vec.end())
#define sor(vec) sort(vec.begin(), vec.end())
#define fi first
#define FOR_(n) for (ll _ = 0; (_) < (ll)(n); ++(_))
#define FOR(i, n) for (ll i = 0; (i) < (ll)(n); ++(i))
#define se second
#define pb push_back
#define P pair<ll,ll>
#define PQminll priority_queue<ll, vector<ll>, greater<ll>>
#define PQmaxll priority_queue<ll,vector<ll>,less<ll>>
#define PQminP priority_queue<P, vector<P>, greater<P>>
#define PQmaxP priority_queue<P,vector<P>,less<P>>
#define NP next_permutation
#define die(a) {cout<<a<<endl; return;}
#define dier(a) {return a;}
//const ll Mod = 1000000009;
const ll Mod = 998244353;
//const ll Mod = 1000000007;
#define inv(a) q_pow((ll)a, Mod - 2)
const ll inf = 4000000000000000000ll;
const ld eps = ld(0.00000000001);
static const long double pi = 3.141592653589793;
template<class T>void vcin(vector<T> &n){for(int i=0;i<int(n.size());i++) cin>>n[i];}
template<class T,class K>void vcin(vector<T> &n,vector<K> &cmp){for(int i=0;i<int(n.size());i++) cin>>n[i]>>cmp[i];}
template<class T>void vcout(vector<T> &n){for(int i=0;i<int(n.size());i++){cout<<n[i]<<" ";}cout<<endl;}
template<class T>void vcin(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cin>>n[i][j];}}}
template<class T>void vcout(vector<vector<T>> &n){for(int i=0;i<int(n.size());i++){for(int j=0;j<int(n[i].size());j++){cout<<n[i][j]<<" ";}cout<<endl;}cout<<endl;}
void yes(bool a){cout<<(a?"yes":"no")<<endl;}
void YES(bool a){cout<<(a?"YES":"NO")<<endl;}
void Yes(bool a){cout<<(a?"Yes":"No")<<endl;}
void possible(bool a){ cout<<(a?"possible":"impossible")<<endl; }
void Possible(bool a){ cout<<(a?"Possible":"Impossible")<<endl; }
void POSSIBLE(bool a){ cout<<(a?"POSSIBLE":"IMPOSSIBLE")<<endl; }
#define FOR_R(i, n) for (ll i = (ll)(n)-1; (i) >= 0; --(i))
template<class T>auto min(const T& a){ return *min_element(all(a)); }
//template<class T>auto max(const T& a){ return *max_element(all(a)); }
template<class T,class F>void print(pair<T,F> a){cout<<a.fi<<" "<<a.se<<endl;}
template<class T>bool chmax(T &a,const T b) { if (a<b) { a=b; return 1; } return 0;}
template<class T>bool chmin(T &a,const T b) { if (b<a) { a=b; return 1; } return 0;}
template<class T> void ifmin(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
template<class T> void ifmax(T t,T u){if(t>u){cout<<-1<<endl;}else{cout<<t<<endl;}}
ll fastgcd(ll u,ll v){ll shl=0;while(u&&v&&u!=v){bool eu=!(u&1);bool ev=!(v&1);if(eu&&ev){++shl;u>>=1;v>>=1;}else if(eu&&!ev){u>>=1;}else if(!eu&&ev){v>>=1;}else if(u>=v){u=(u-v)>>1;}else{ll tmp=u;u=(v-u)>>1;v=tmp;}}return !u?v<<shl:u<<shl;}
ll modPow(ll a, ll n, ll Mod) { if(Mod==1) return 0;ll ret = 1; ll p = a % Mod; while (n) { if (n & 1) ret = ret * p % Mod; p = p * p % Mod; n >>= 1; } return ret; }
vector<ll> divisor(ll x){ vector<ll> ans; for(ll i = 1; i * i <= x; i++){ if(x % i == 0) {ans.push_back(i); if(i*i!=x){ ans.push_back(x / i);}}}sor(ans); return ans; }
ll pop(ll x){return __builtin_popcountll(x);}
ll poplong(ll x){ll y=-1;while(x){x/=2;y++;}return y;}
P hyou(P a){ll x=fastgcd(abs(a.fi),abs(a.se));a.fi/=x;a.se/=x;if(a.se<0){a.fi*=-1;a.se*=-1;}return a;}
P Pplus(P a,P b){ return hyou({a.fi*b.se+b.fi*a.se,a.se*b.se});}
P Ptimes(P a,ll b){ return hyou({a.fi*b,a.se});}
P Ptimes(P a,P b){ return hyou({a.fi*b.fi,a.se*b.se});}
P Pminus(P a,P b){ return hyou({a.fi*b.se-b.fi*a.se,a.se*b.se});}
P Pgyaku(P a){ return hyou({a.se,a.fi});}const int MX = 2e5 + 5; // 组合数上限
ll q_pow(ll x, ll n) {ll res = 1;for (; n > 0; n /= 2) {if (n % 2) res = res * x % Mod;x = x * x % Mod;}return res % Mod;
}
// 组合逆元模板
long long fac[MX]; // 组合数除数
long long inv_fac[MX];  // 组合数被除数(通过费马小定理转化为逆元)
void init() {fac[0] = 1;for (int i = 1; i < MX; i++) {fac[i] = fac[i - 1] * i % Mod;}// 1 * 2 * 3 * 4 * 5 * 6   除数个数累计// for(int i = 0; i < 10; ++i) std::cout << fac[i] << std::endl;inv_fac[MX - 1] = q_pow(fac[MX - 1], Mod - 2);  // 费马小定理转化for (int i = MX - 1; i > 0; i--) {inv_fac[i - 1] = inv_fac[i] * i % Mod;}return;
}
long long comb(int n, int k) {  //  n 个数里面选k个数// inv_fac[n - k] 抵消fac[n - k]if(k == 0) return 1;return fac[n] * inv_fac[k] % Mod * inv_fac[n - k] % Mod;
}ll i, j;
ll n, k;
ll l, r, p, q;void solve() {cin >> n;vector<ll> a(n+1, 0);ll sum=0;for(int i=1;i<=n;++i){ cin>>a[i]; sum+=a[i]; }if(sum != n) {cout << 0 << endl;return;}vector<ll> d;d.reserve(n);for(ll j = 1; j <= n; ++j) d.pb(min(j, n + 1 - j));sort(d.begin(), d.end());// vcout(d);// prevector<ll> pre(n + 1, 0);for(int i = 1; i <= n; ++i) pre[i] = (pre[i - 1] + a[i]);// ll res = 1;for(int j = 1; j <= n; ++j) {ll dval = d[j - 1];ll tmp = pre[dval] - (j - 1);if(tmp <= 0) {res = 0;break;}res = res * (tmp % Mod) % Mod;}if(res == 0) {cout << 0 << endl;return;}for(int i = 1; i <= n; ++i) {res = res * inv_fac[a[i]] % Mod;res %= Mod;}cout << res << endl;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);init();int t;cin >> t;while(t--) solve();
}
http://www.hskmm.com/?act=detail&tid=16820

相关文章:

  • 抗体药物偶联物(ADCs)生物分析:拆解 “靶向导弹” 体内轨迹的核心技术
  • 详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学
  • 使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案
  • 为什么应该测试无JavaScript的页面体验
  • 前台部分数据不显示
  • 指针定义以及二维数组内存地址(java/c++/python)
  • 解码数据结构线性表之顺序表
  • 中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃
  • Jupyter NoteBook / Jupyter Lab的安装与使用
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 易基因:Nat Rev Drug Discov/IF101.8:何川团队顶刊综述RNA修饰系统作为疾病治疗靶点的研究进展
  • 国产适配 + AI 一键生成!亿图图示 14.5 全平台绘图指南:260 种图表 + Visio 兼容,开发者 / 办公党速藏
  • 关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page
  • Mini L-CTF 2025 WP
  • K8S APIServer压力高,导致控制器Leader续约失败而重启问题
  • 【2025-09-24】连岳摘抄
  • 8K 视频修复提速 50%!Topaz Video AI 7.0.0 实战指南:AI 增强 + 本地化模型 + GPU 加速全解析
  • Qwen 发布高精度实时音视频同传模型;AirPods 实时翻译功能新增中文丨日报
  • vivo 浏览器福利体系架构演进之路
  • 2024JCR最新完整版期刊名单!【附带21-23年完整版表格】
  • ESP8266+CH340+SG90舵机远程控制开关
  • 【ACM出版、连续三届EI检索】第四届人工智能与智能信息处理国际学术会议(AIIIP 2025)
  • 08_多线程编程
  • VisionPro学习笔记- PMAlignTOOL
  • FeignClient提示No subject alternative DNS name matching配置SSL
  • 【组合数学基础9】Catalan数(卡特兰数)笔记
  • 详细介绍:npm玩转技巧
  • 软件构造的基本原理 1章
  • 【2025-09-23】性格问题
  • mvnd 安装和配置