Solution Set -「CF 1539」
我是傻逼。
「CF 1539A」Contest Start
Link.
答案是 \(\sum_{i=1}^{n-1}\min\{i,\lfloor\frac{t}{x}\rfloor\}\),等差数列求和优化。
#include<bits/stdc++.h>
#define con(typ) const typ
typedef long long ll;
#define all(x) (x).begin(),(x).end()
using namespace std;
template<typename T>void sf(T &x){x=0;T f=0;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1;for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^'0');if(f)x=-x;}
template<typename T>void pf(T x,char l='\n'){static int s[100],t;if(x<0)putchar('-'),x=-x;do s[++t]=x%10,x/=10;while(x);while(t)putchar(s[t--]^'0');putchar(l);}
int main(){
int T;
ll n,x,t;
for(sf(T);T;--T){
sf(n),sf(x),sf(t);
ll ans=0,d=t/x;
--n;
if(n>=d)ans=(n-d)*d+d*(d+1)/2;
else ans=n*(n+1)/2;
pf(ans);
}
return 0;
}
「CF 1539B」Love Song
Link.
暴力。
#include<bits/stdc++.h>
#define con(typ) const typ
typedef long long ll;
#define all(x) (x).begin(),(x).end()
using namespace std;
template<typename T>void sf(T &x){x=0;T f=0;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1;for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^'0');if(f)x=-x;}
template<typename T>void pf(T x,char l='\n'){static int s[100],t;if(x<0)putchar('-'),x=-x;do s[++t]=x%10,x/=10;while(x);while(t)putchar(s[t--]^'0');putchar(l);}
int cap[100010][26],n,q;
char ch[100010];
int main(){
sf(n),sf(q);
scanf("%s",ch+1);
for(int i=1;i<=n;++i){
memcpy(cap[i],cap[i-1],sizeof(int)*26);
cap[i][ch[i]-'a']++;
}
for(int l,r;q;--q){
sf(l),sf(r);
ll ans=0;
for(int i=0;i<26;++i)ans+=(i+1)*(cap[r][i]-cap[l-1][i]);
pf(ans);
}
return 0;
}
「CF 1539C」Stable Groups
Link.
贪心。
对原序列差分,把差分值拿出来排序后把前几个填了。正确性显然。
#include<bits/stdc++.h>
#define con(typ) const typ
typedef long long ll;
#define all(x) (x).begin(),(x).end()
using namespace std;
template<typename T>void sf(T &x){x=0;T f=0;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1;for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^'0');if(f)x=-x;}
template<typename T>void pf(T x,char l='\n'){static int s[100],t;if(x<0)putchar('-'),x=-x;do s[++t]=x%10,x/=10;while(x);while(t)putchar(s[t--]^'0');putchar(l);}
int n;
ll a[200010],k,x,df[200010];
int main(){
sf(n);sf(k);sf(x);for(int i=1;i<=n;++i)sf(a[i]);
sort(a+1,a+n+1);
for(int i=2;i<=n;++i)df[i]=a[i]-a[i-1];
vector<ll> ald;
for(int i=2;i<=n;++i){
if(df[i]>x)ald.emplace_back(df[i]);
}
sort(all(ald));
int del=0;
for(int i=0;i<int(ald.size());++i){
ll w=ald[i];
if(w%x==0){
if(k>=w/x-1)k-=w/x-1,++del;
else break;
}
else{
if(k>=w/x)k-=w/x,++del;
else break;
}
}
pf(int(ald.size())-del+1);
return 0;
}
「CF 1539D」PriceFixed
Link.
以 \(b\) 为关键字排序。
首先考虑把第一个元素「激活」,即填满 \(b_{1}\) 个商品。
然后后面的元素有两种决策:
- 使用前面已经「激活」的商品来「激活」该商品后买完;
- 直接买 \(a_{i}\) 个,注意分 \(a_{i},b_{i}\) 大小讨论。
两种决策会使总买入商品数不一致,对后面有影响(?)。
现在考场上那个傻逼在想 DP。
但是注意到这样搞的代价是没有差别的,\(2-1=1\) 抵了。
那么就一定存在一种最优方案使得每种产品买恰好 \(a_{i}\) 个,搞两个指针扫一下就行了。
#include<bits/stdc++.h>
#define con(typ) const typ
typedef long long ll;
#define all(x) (x).begin(),(x).end()
using namespace std;
template<typename T>void sf(T &x){x=0;T f=0;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1;for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^'0');if(f)x=-x;}
template<typename T>void pf(T x,char l='\n'){static int s[100],t;if(x<0)putchar('-'),x=-x;do s[++t]=x%10,x/=10;while(x);while(t)putchar(s[t--]^'0');putchar(l);}
struct st{ll a,b;}a[100010];
int n;
int main(){
sf(n);for(int i=1;i<=n;++i)sf(a[i].a),sf(a[i].b);
sort(a+1,a+n+1,[](st x,st y){return x.b<y.b || (x.b==y.b && x.a<y.a);});
ll nw=0,ans=0;
for(int i=1,j=n;i<=j;){
if(nw>=a[i].b){
ans+=a[i].a;
nw+=a[i].a;
++i;
}
else{
if(a[j].a+nw>=a[i].b){
ll temp=a[i].b-nw;
ans+=2*temp;
nw+=temp;
a[j].a-=temp;
}
else{
ans+=a[j].a*2;
nw+=a[j].a;
--j;
}
}
}
pf(ans);
return 0;
}
「CF 1539E」Game with Cards
Link.
gap 略大。搞不动先咕着。
「CF 1539F」Strange Array
Link.
假的,懒得写了,具体看 Rainybunny 的评论吧。
$\ \ \ \ $F:发现对于某个 \(a_{i}\),已知包含它的某个区间中,\(\le a_{i}\) 与 \(>a_{i}\) 的数的数量差就能得到它的特征值。不妨令“大于等于”为 \(+1\),“小于”为 \(-1\),线段树维护区间最大前缀和与最大后缀和,升序扫描 \(a\) 值就能更新答案。\(+1,-1\) 反过来再做一遍,最后是 \(\mathcal O(n\log_{2}n)\) 的。
$\ \ \ \ $赛后瞬间补题的原因大概是细节有点多√
#include<bits/stdc++.h>
#define con(typ) const typ
typedef long long ll;
#define all(x) (x).begin(),(x).end()
using namespace std;
template<typename T>void sf(T &x){x=0;T f=0;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')f=1;for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^'0');if(f)x=-x;}
template<typename T>void pf(T x,char l='\n'){static int s[100],t;if(x<0)putchar('-'),x=-x;do s[++t]=x%10,x/=10;while(x);while(t)putchar(s[t--]^'0');putchar(l);}
template<typename T,typename... Tt>void sf(T &x,Tt&... aa){sf(x),sf(aa...);}
int n,a[200010],stp,Segres;
vector<int> ps[200010];
struct node{int p,s,sm;node(int a=0,int b=0,int c=0){p=a;s=b;sm=c;}};
struct Segtree{
const int n;
vector<node> ns;
Segtree(int n,int fl):n(n),ns(n*4+5){give(1,n,1,fl);}
node mrg(node a,node b){
node c;
c.p=max(a.p,a.sm+b.p);
c.s=max(b.s,b.sm+a.s);
c.sm=a.sm+b.sm;
return c;
}
void give(int l,int r,int p,int v){
if(r-l==0){ns[p]=node(max(v,0),max(v,0),v);return;}
int m=(l+r)/2;
give(l,m,p*2,v),give(m+1,r,p*2+1,v);
ns[p]=mrg(ns[p*2],ns[p*2+1]);
}
void ins(int l,int r,int p,int x,int v){
if(r-l==0){ns[p]=node(max(v,0),max(v,0),v);return;}
int m=(l+r)/2;
if(m>=x)ins(l,m,p*2,x,v);
else ins(m+1,r,p*2+1,x,v);
ns[p]=mrg(ns[p*2],ns[p*2+1]);
}
void qpre(int l,int r,int p,int x){
if(l>=x){stp=max(stp,Segres+ns[p].p);Segres+=ns[p].sm;return;}
int m=(l+r)/2;
if(m>=x)qpre(l,m,p*2,x);qpre(m+1,r,p*2+1,x);
}
void qsuf(int l,int r,int p,int x){
if(r<=x){stp=max(stp,Segres+ns[p].s);Segres+=ns[p].sm;return;}
int m=(l+r)/2;
if(m<x)qsuf(m+1,r,p*2+1,x);qsuf(l,m,p*2,x);
}
void ins(int x,int y){ins(1,n,1,x,y);}
int qpre(int x){Segres=stp=0;qpre(1,n,1,x);return stp;}
int qsuf(int x){Segres=stp=0;qsuf(1,n,1,x);return stp;}
};
int main(){
sf(n);for(int i=1;i<=n;++i)sf(a[i]),ps[a[i]].emplace_back(i);
int value=1;
vector<int> ans(n);
for(int value=1;value>-2;value-=2){
Segtree t(n,value);
for(int i=1;i<=n;++i){
if(value==-1)for(int x:ps[i])t.ins(x,-value);
for(int x:ps[i]){
int r0,r1;
r1=t.qpre(x);
r0=t.qsuf(x);
if((r0+r1-1)&1)ans[x-1]=max(ans[x-1],(r0+r1-1)/2);
else{
if(value==1)ans[x-1]=max(ans[x-1],(r0+r1-1)/2);
else ans[x-1]=max(ans[x-1],(r0+r1-2)/2);
}
}
if(value==1)for(int x:ps[i])t.ins(x,-value);
}
}
for(int x:ans)pf(x,' ');
return 0;
}
Solution Set -「CF 1539」的更多相关文章
- Diary / Solution Set -「WC 2022」线上冬眠做噩梦
大概只有比较有意思又不过分超出能力范围的题叭. 可是兔子的"能力范围" \(=\varnothing\) qwq. 「CF 1267G」Game Relics 任意一个 ...
- Solution Set -「ARC 107」
「ARC 107A」Simple Math Link. 答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
随机推荐
- P1751 贪吃虫 题解
题意: 题目传送门 在一棵 n 个结点的树上,有 k 个贪吃虫去吃食物. 每个贪吃虫都走到达食物的唯一路径. 当一条贪吃虫通向食物的道路上有另一条贪吃虫,则较远的那只停止移动. 多条贪吃虫要进入同一节 ...
- 关于Pod中进程在节点中的研究
最近研究OpenShift virtulization, 各种Pod对KVM进程的封装,引发了Pod中进程到底在Node中是什么表现形势的好奇,因为对基础知识的不扎实,还是希望找个环境能仔细看看,建立 ...
- 全球权威的 IT 研究公司 Gartner,发布未来五大隐私趋势
Gartner(高德纳) 公司是全球最具权威的 IT 研究与顾问咨询公司之一,它成立于 1979 年,总部设在美国康涅狄克州斯坦福.其研究范围覆盖全部 IT 产业,包括 IT 的研究.发展.评估.应用 ...
- 使用C#编写.NET分析器-第二部分
译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...
- 论文日记一:AlexNet
1.导读 ALexNet在2012图像识别竞赛中ILSVRC大放异彩,直接将错误了降低了近10个百分点. 论文<ImageNet Classification with Deep Convolu ...
- 【NestJS系列】从Nest CLI开始入门
初识Nest JS Nest 是一个渐进的 Node.js 框架,它可以在 TypeScript 和 JavaScript (ES6.ES7.ES8)之上构建高效.可伸缩的企业级服务器端应用程序. N ...
- 备份Ubunut已安装的软件包并在新的Ubuntu 系统上恢复
0.查看已安装列表 dpkg -L xxxx.deb 1.备份 安装apt-clone: $sudo apt-get install apt-clone 提供一个保存备份文件的位置.我们在 /back ...
- 伸展树(Splay)详解
引入 在一条链中,二叉查找树的时间复杂度就会退化成 \(O(n)\),这时我们就需要平衡树来解决这个问题. \(Splay\)(伸展树)是平衡树的一种,它的每一步插入.查找和删除的平摊时间都是 \(O ...
- Spring的依赖注入方式(set及constructor)
Bean的依赖注入方式: set方法注入 P命名空间注入本质也是set方法注入,但比起上面的set方法进行注入更加方便,主要体现在配置文件中,如下: 首先,引入P命名空间: xmlns:p=" ...
- 模拟ArrayList(顺序表)的底层实现
模拟ArrayLIst的底层实现 package com.tedu.api04.list; import java.util.Objects; /** * @author LIGENSEN * Dat ...