CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)

https://codeforces.com/contest/1896

D. Ones and Twos

题意

给定一个数组 aa,只含有 1,21,2。每次询问有两种类型:

  • “1 s” 查询是否有一个子数组的和为 ss
  • “2 i v” 将 aia_i 改为 vv

数据范围:1n,q1051\leq n,q\leq 10^5

题解

注意到对于原数组,一定可以凑出所有不超过它且与它奇偶性相同的数:若两端有 22,则不选一个 22,否则两个 11 都不选,就由 sumsum 得到了 sum2sum-2

所以每次询问的 ss 如果和 sumsum 奇偶性一致,只需要判断 ss 是否不超过 sumsum。否则需要删去最靠近头或者尾的一个 11,再判断 ss 是否不超过剩下的部分。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;cin>>t;
while(t--)
{
int n,q;cin>>n>>q;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
set<int> s;
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(a[i]==1) s.insert(i);
}
while(q--)
{
int op;cin>>op;
if(op==1)
{
int x;cin>>x;
if(sum%2==x%2) cout<<(x<=sum?"YES":"NO")<<'\n';
else
{
if(s.empty()) cout<<"NO"<<'\n';
else
{
auto it1=s.begin(),it2=s.end();
it2--;
cout<<(x<=sum-1-2*min(*it1-1,n-*it2)?"YES":"NO")<<'\n';
}
}
}
else
{
int i,v;cin>>i>>v;
sum=sum-a[i]+v;
if(a[i]==1) s.erase(i);
a[i]=v;
if(v==1) s.insert(i);
}
}
}
return 0;
}

E. Permutation Sorting

题解

问题可以归结为:区间(x,y)表示 x 需要到达 y,循环 y-x 次,那么 x 的答案为 y - x -(x,y)中包含的区间个数。

这可以用树状数组实现。


CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)
https://je3ter.github.io/2023/11/29/ACM/CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)/
作者
Je3ter
发布于
2023年11月29日
许可协议