专栏文章
[CF2157C] Meximum Array 2 题解
CF2157C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min1yen5
- 此快照首次捕获于
- 2025/12/01 19:14 3 个月前
- 此快照最后确认于
- 2025/12/01 19:14 3 个月前
翻译一下, 实际上就是 中不能有 内的数,且必须有 ; 实际上就是 中必须有 中所有数,且不能有 。对于 的数没有限制。
若只有 ,将 全部赋值为 即可满足。
若只有 ,注意到令 ,即循环填入 时可以满足任意情况。
接下来尝试从 的情况中加入 的做法,初始时 为一个全为 的数组。显然若一个点同时被一个 和一个 区间包裹,这个点只能 ,于是这些点直接赋值为 。然后提取出所有没有被任何 包裹的点,循环填入 ,这样可以使 尽可能被满足。
具体实现时,可以通过前缀和求出哪些点被 区间包裹,当然暴力找的复杂度也是正确的。
code
CPP#include<bits/stdc++.h>
#define pb emplace_back
#define pob pop_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ll maxn=100007,ee=1e18;
ll n,k,q,su[maxn],a[maxn];
vector<pair<ll,ll> > vec;
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
ll T=1; cin>>T;
for(;T--;){
cin>>n>>k>>q,vec.clear();
for(ll i=1;i<=n;i++) su[i]=0,a[i]=k;
for(ll i=1,c,l,r;i<=q;i++){
cin>>c>>l>>r;
if(c==1) su[l]++,su[r+1]--;
else vec.pb(l,r);
}
for(ll i=1;i<=n;i++) su[i]+=su[i-1];
for(ll i=1,cur=0;i<=n;i++)if(!su[i]) a[i]=cur,cur=(cur+1)%k;
for(auto x:vec){
for(ll i=x.first;i<=x.second;i++)if(su[i]) a[i]=1e9;
}
for(ll i=1;i<=n;i++) cout<<a[i]<<" "; cout<<"\n";
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...