首页 > 其他分享 >Codeforces Round 791 (Div. 2)

Codeforces Round 791 (Div. 2)

时间:2024-02-25 22:34:52浏览次数:28  
标签:791 int tr Codeforces cin build tr1 Div tr2

 

C - Rooks Defenders

线段树模板,维护:1)v:个数 , 2)sum:v的个数是否大于0.

// #include"bits/stdc++.h"
#include"iostream"
using namespace std;
const int N = 2e5;
struct Node{
    int l, r, v, sum;
}tr1[N*4], tr2[N*4];
int n, q;


void build(Node tr[], int u, int l, int r){
    // cout<<"||| build :"<<u << ' '<<l<<" "<<r<<endl;
    // tr[u] = {l, r, 0, 0};
    tr[u].l = l;  tr[u].r = r;
    if (l == r)return ;
    int mid = l+r>>1;
    build(tr, u*2, l, mid);
    build(tr, u*2+1, mid+1, r);
}

void modify(Node tr[], int u, int x, int v){
    // cout<<u <<' '<<   << endl;
    if (tr[u].l == tr[u].r){
        tr[u].v += v;
        tr[u].sum = (tr[u].v > 0);
        return ;
    }
    int mid = (tr[u].l + tr[u].r) >> 1;
    if (x<=mid)
        modify(tr, u*2, x, v);
    else 
        modify(tr, u*2+1, x, v);

    //  pushup
    tr[u].sum = tr[u*2].sum + tr[u*2+1].sum;
}

int query(Node tr[], int u, int l, int r){
    // cout<<u<<' '<<tr[u].l<<' '<<tr[u].r<<endl;
    if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
    int mid = (tr[u].l + tr[u].r)/2;
    int sum = 0;
    if (l <= mid)
        sum += query(tr, u*2, l, r);
    if (r > mid)
        sum += query(tr, u*2+1, l, r);
    return sum;
}

int main(){   
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    cin >> n >> q;
    build(tr1, 1, 1, n), build(tr2, 1, 1, n);
    while(q--){
        int op; 
        cin>>op;
        if (op == 1){
            int x, y;
            cin>>x>>y;
            modify(tr1, 1, x, 1);
            modify(tr2, 1, y, 1);
        }
        else if(op == 2){
            int x, y;
            cin>>x>>y;
            modify(tr1, 1, x, -1);
            modify(tr2, 1, y, -1);

        }
        else{
            int x0, y0, x1, y1;
            cin >> x0 >> y0 >> x1 >> y1;
            if (query(tr1, 1, x0, x1) == x1 - x0 + 1 || query(tr2, 1, y0, y1) == y1 - y0 + 1)
                cout << "Yes" << '\n';
            else cout << "No" << '\n';
        }
    }

    return 0;
}

 

标签:791,int,tr,Codeforces,cin,build,tr1,Div,tr2
From: https://www.cnblogs.com/zhangbuang/p/18033243

相关文章

  • Part3: Dive into DDPM
    背景整个系列有相对完整的公式推导,若正文中有涉及到的省略部分,皆额外整理在Part4,并会在正文中会指明具体位置。在Part2基于\(\text{VariationalInference}\),找到原目标函数\(-\ln{p_\theta(x_0)}\)的上界\(L\),定义如下:\[\begin{aligned}L:=&\mathbb{E}_q\left[-\log\frac......
  • Codeforces 587D Duff in Beach
    不难发现可以按长度为\(n\)分为段。考虑到\(l\)其实并没什么大用,只是说对于选出来的\(b_{1\simx}\)可以都整体移任意段,只需要保证在范围内就行了。进一步的,发现只需要看最后一个数的取值得到其最大可以在的段数即为\(d\),那么移动的方案数就为\(d-x+1\)。还有的一......
  • Codeforces Round 926 (Div. 2)
    A.升序排列再求和#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn;cin>>n;vector<int>a(n+1);for(inti=1;i<=n;i++)cin>>a[i];sort(a.b......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    EducationalCodeforcesRound162(RatedforDiv.2)A-MovingChips解题思路:模拟一下,不难发现是\(1\)之间\(0\)的个数。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusin......
  • Codeforces 1025F Disjoint Triangles
    结论:如果两个三角形不相交,那么一定存在两条内公切线。于是可以考虑枚举这条内公切线的端点\(x,y\)。那么一个三角形的两个端点就会在\(x\toy\)这条线的同一侧,另外一个三角形的两个端点会在这条线的另一侧。同时这条线的一侧与其配对的端点可能是\(x\)也可能是\(y\)。......
  • Codeforces 486E LIS of Sequence
    考虑一个暴力的做法:建立一个超级起点\(a_0=0\)超级终点\(a_{n+1}=\inf\)。求出\(f_i\)代表\(1\simi\)且以\(i\)结尾的\(\text{LIS}\)长度。考虑\(f_i=\max\{f_j+1\}(j<i\landa_j<a_i)\)这个转移的式子,如果\(f_i=f_j+1(j<i\landa_j<a_i......
  • codeforces 1575M Managing Telephone Poles
    假设固定了\((x,y)\),考虑其和\((x',y')\)的距离\((x-x')^2+(y-y')^2=x^2-2xx'+x'^2+y^2-2yy'+y'^2=(x^2+y^2)+(-2xx'+x'^2)+(-2yy'+y'^2)\)。第一个括号内的式子是个定值,不用管;第二三个式子都是一次函数的形式......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    不会F的场。A答案是最左的\(1\)和最右的\(1\)之间的\(0\)的个数。Code#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ intn; cin>>n......
  • Educational Codeforces Round 162 [Rated for Div. 2]
    第二次,三道题,剩下的回学校再补,总结:还是需要多练习A:让数列里所有的1都挨在一起,可以看出,相邻1之间有多少个0就需要操作几次,特判:当只有一个1或者原本全是1就输出0;voidsolve(){cin>>n;inttop1=0,top2=0,cnt=0;memset(a,0,sizeof(a));memset(b,0,siz......
  • [AGC009C] Division into Two
    先假定\(A\leB\),然后先判断无解,如果\(a_{i+2}-a_i<B\),无论怎么分配都是不合法的,直接判掉。然后考虑dp,\(f_i\)表示选了前\(i\)个数,其中第\(i\)个数是归为\(A\)集合的方案数。其中不难发现可转移的状态是一段区间,状态\(f_j\)可以转移仅当\(a_i-a_j\geA\)且\(a_......