Codeforces Round #791 (Div. 2) A-C

比赛链接

A

题解

知识点:数学,贪心。

考虑 \(n\%6\)\(n\%4\) 的余数情况。

时间复杂度 \(O(1)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>

using namespace std;

int main(){
    std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        long long n;
        cin>>n;
        if(n<4 || n&1) cout<<-1<<'\n';
        else{
            long long d = n/6,r = n%6;
            cout<<d + (r != 0)<<' ';
            cout<<n/4<<'\n';
        }
    }
    return 0;
}

B

题解

知识点:STL,模拟。

如果执行操作 \(2\) ,那么所有数都变成 \(x\) ,我们可以理解为把数组清空了,但 \(sum\) 的基础值是 \(n*x\) ,下次单点修改时只需要知道清空之后,这个元素有没有被修改过,即在数组中是否存在,分别做不同的处理。可以用 \(map\) 维护下标与值的映射。(也可以记录上次整体修改的访问时间,用一个数组保存每个位置在哪次整体修改之后修改的访问时间)

时间复杂度 \(O(n+q)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int main(){
    std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,q;
    cin>>n>>q;
    map<int,int> a;
    long long sum = 0;
    for(int i = 1;i<=n;i++) cin>>a[i],sum+=a[i];
    int pre = 0;
    while(q--){
        int t;
        cin>>t;
        if(t == 1){
            int i,x;
            cin>>i>>x;
            if(a.count(i)) sum += x-a[i];
            else sum = sum - pre + x;
            a[i] = x;
            cout<<sum<<'\n';
        }
        else if(t == 2){
            int x;
            cin>>x;
            sum = 1LL * n * x;
            pre = x;
            a.clear();
            cout<<sum<<'\n';
        }
    }
    return 0;
}

C

题解

知识点:树状数组,模拟。

如果一个区块被攻击,那么肯定对应的所有行或者所有列都存在棋子,分别计算存在棋子的行和列的数量,行或列有一个满足与区块行或列相等,那么区块所有格子都能被攻击到。用树状数组的单点修改和区间和维护行和列的棋子存在状态和计算,用数组维护各行和列的当前棋子数量辅助树状数组的修改。

用线段树也可以,常数比较大。

(qwq太菜惹,抄大佬的板子)

时间复杂度 \(O(qlogn)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

template <typename T>
struct Fenwick{
    const int n;
    vector<T> a;
    Fenwick(int n):n(n),a(n){}
    void add(int x,T v) {
        for (int i = x+1;i<=n;i += i&-i){
            a[i-1] += v;
        }
    }
    T sum(int x) {
        T ans = 0;
        for (int i = x;i>0;i -= i&-i){
            ans += a[i-1];
        }
        return ans;
    }
    T rangeSum(int l,int r){
        return sum(r) - sum(l);
    }
};

int row[100007],col[100007];

int main(){
    std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,q;
    cin>>n>>q;
    Fenwick<int> rowb(n+7),colb(n+7);
    while(q--){
        int t;
        cin>>t;
        if(t == 1){
            int x,y;
            cin>>x>>y;
            row[x]++;
            col[y]++;
            if(row[x] == 1) rowb.add(x,1);
            if(col[y] == 1) colb.add(y,1);
        }
        else if(t == 2){
            int x,y;
            cin>>x>>y;
            row[x]--;
            col[y]--;
            if(row[x] == 0) rowb.add(x,-1);
            if(col[y] == 0) colb.add(y,-1);
        }
        else if(t == 3){
            int x1,x2,y1,y2;
            cin>>x1>>y1>>x2>>y2;
            if(rowb.rangeSum(x1,x2+1) == x2-x1+1 || colb.rangeSum(y1,y2+1) == y2-y1+1) cout<<"Yes"<<'\n';
            else cout<<"No"<<'\n';
        }
    }
    return 0;
}
posted @ 2022-05-16 02:20  空白菌  阅读(25)  评论(0编辑  收藏  举报