首页 > 其他分享 >loj#523. 「LibreOJ β Round #3」绯色 IOI(悬念)

loj#523. 「LibreOJ β Round #3」绯色 IOI(悬念)

时间:2024-05-15 11:41:20浏览次数:21  
标签:sed LibreOJ loj SGT int dfn ans Round oppo

由题述,\(X\) 满匹配,根据 Hall 定理,有对于任意一个有 \(k\) 个妹子的集合,她们能配对的男生的人数 \(\ge k\)。

把每个妹子看作她所连接的两个(可能是同一个)男生间的无向边,则每个连通块必然是树或基环树。

问题转化为给每条无向边定向,满足每个点的入度不超过 \(1\),求最大边权和。

对于树,其实就是确定一个根结点转化为外向树,所以对 dfn 建线段树,并对修改的边在对应根结点的子树内或外进行分讨即可,时间复杂度 \(\mathcal O(\log n)\)。

对于基环树,它一定是基环外向树,所以环外边 \(\mathcal O(1)\) 修改即可,环内边只有顺时针和逆时针两种方向,同样 \(\mathcal O(1)\) 修改搞定。

总时间复杂度 \(\mathcal O[(n + q) \log n]\),跑不满一点。

代码

#include <bits/stdc++.h>

#define eb emplace_back

using namespace std;

constexpr int N = 5e5 + 10;

int m, n, T, a[N], b[N], rt[N], w[N << 1], s[N][3], ans;
int cnt, dep[N], dfn[N], sed[N], pree[N];
bool mark[N];

vector<int> cir;

int tot, head[N], oppo[N << 1], dir[N << 1];
struct Edge{int to, nxt;} e[N << 1];
inline void add(int u, int v) {e[++tot] = Edge{v, head[u]}; head[u] = tot;}

namespace SGT {
    #define lson pos << 1
    #define rson pos << 1 | 1

    int mx[N << 2], lazy[N << 2];
    
    inline void pushdown(int pos) {
        if (!lazy[pos]) return;
        mx[lson] += lazy[pos], lazy[lson] += lazy[pos];
        mx[rson] += lazy[pos], lazy[rson] += lazy[pos];
        lazy[pos] = 0;
    }

    void upd(int pos, int l, int r, int x, int y, int c) {
        if (x <= l && r <= y) {mx[pos] += c, lazy[pos] += c; return;}
        pushdown(pos); int mid = (l + r) >> 1;
        if (x <= mid) upd(lson, l, mid, x, y, c);
        if (y > mid) upd(rson, mid + 1, r, x, y, c);
        mx[pos] = max(mx[lson], mx[rson]);
    }

    int query(int pos, int l, int r, int x, int y) {
        if (x <= l && r <= y) return mx[pos];
        pushdown(pos); int mid = (l + r) >> 1, res = 0;
        if (x <= mid) res = query(lson, l, mid, x, y);
        if (y > mid) res = max(res, query(rson, mid + 1, r, x, y));
        return res;
    }
}

void dfs(int u) {
    for (int i = head[u], v; v = e[i].to, i; i = e[i].nxt) {
        if (!dep[v]) dep[v] = dep[u] + 1, pree[v] = i, dfs(v);
        else if (dep[v] >= dep[u]) {
            int j = pree[v];
            while (j && e[j].to != u) cir.eb(j), j = pree[e[oppo[j]].to];
            cir.eb(oppo[i]);
        }
    }
}

void dfs2(int u, int r) {
    rt[u] = r, dfn[u] = ++cnt;
    for (int i = head[u], v; v = e[i].to, i; i = e[i].nxt) if (!dfn[v]) dfs2(v, r);
    sed[u] = cnt;
}

void modify(int x, int v) {
    int d = v - w[x], r = rt[e[x].to]; w[x] = v;
    if (mark[r]) {
        ans -= s[r][0] + max(s[r][1], s[r][2]);
        if (dir[x] || dfn[e[x].to] > dfn[e[oppo[x]].to]) s[r][dir[x]] += d;
        ans += s[r][0] + max(s[r][1], s[r][2]);
    } else {
        ans -= SGT::query(1, 1, n, dfn[r], sed[r]);
        if (dfn[e[x].to] > dfn[e[oppo[x]].to]) SGT::upd(1, 1, n, dfn[r], dfn[e[x].to] - 1, d), SGT::upd(1, 1, n, sed[e[x].to] + 1, sed[r], d);
        else SGT::upd(1, 1, n, dfn[e[oppo[x]].to], sed[e[oppo[x]].to], d);
        ans += SGT::query(1, 1, n, dfn[r], sed[r]);
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
    cin >> m >> n >> T;
    for (int i = 1; i <= m; i++) cin >> a[i];
    for (int i = 1; i <= m; i++) cin >> b[i];
    for (int i = 1; i <= m; i++) {
        int u = (a[i] + b[i]) % n + 1, v = (a[i] - b[i] + n) % n + 1;
        if (u < v) swap(u, v);
        add(u, v);
        if (u == v) oppo[tot] = tot;
        else oppo[tot] = tot + 1, add(v, u), oppo[tot] = tot - 1;
    }
    for (int i = 1; i <= n; i++) if (!rt[i]) {
        dep[i] = 1, cir.clear(), dfs(i); mark[i] = !cir.empty();
        if (mark[i]) {
            for (int j : cir) dir[j] = 1, dir[oppo[j]] = 2;
            dfs2(e[cir[0]].to, i);
        } else dfs2(i, i);
    }
    for (int i = 1, v; i <= tot; i++) cin >> v, modify(i, v);
    cout << ans << '\n';
    int q; cin >> q;
    while (q--) {
        int x, v; cin >> x >> v; x -= T * ans, v -= T * ans;
        modify(x, v); cout << ans << '\n';
    }
    return 0;
}

标签:sed,LibreOJ,loj,SGT,int,dfn,ans,Round,oppo
From: https://www.cnblogs.com/chy12321/p/18193552

相关文章

  • Codeforces Round 943 (Div. 3)
    CodeforcesRound943(Div.3)1968D-枚举思路:每个人走的位置最多会形成长度为n的环,所以直接枚举走到某个位置之后后面就不走了的所有情况的最大值,相互比较即可1968E-构造题意:设\(F(A_i,A_j)=|x_i-x_y|+|y_i-y_j|\),在\(N*N\)的矩阵中选n个点使所有不同的\(F(A_i,A_j)=|x_i-......
  • cfRounddiv3--CDEF题解
    C-AssemblyviaRemainders思路:因为xi最大只有500,而构造的ai最大可以到1e9,直接从501开始构造即可。voidsolve(){//C简单构造intn;cin>>n;vector<int>vct;vct.emplace_back(501);for(inti=2;i<=n;i++){intx;cin>>x;vc......
  • Week Round 30
    T1是无意义题,就不说了。这次周赛出得最差的题目就是T1。T2:ABC282E题目描述有\(n\)个数\(a_i\),你每次可以选出两个数\(a_i\)和\(a_j\),获得\((a_i^{a_j}+a_j^{a_i})\bmodM\)分,并选择这两个数中的一个数删掉,求最大得分。\(1\len\le500\)。题目思路我们把选出的......
  • Codeforces Round 944 (Div. 4) 补题
    A.MyFirstSortingProblemYouaregiventwointegersxandy.Outputtwointegers:theminimumofxandy,followedbythemaximumofxandy.题意:给你两个整数求出最小值和最大值Code:#include<bits/stdc++.h> usingnamespacestd;#definedebug(x)cer......
  • qgroundcontrol开发环境搭建源码编译
    qgroundcontrol是一款无人机地面站开源软件,C++/QT开发在https://github.com/mavlink/qgroundcontrol上就能找到,选择稳定版下载最新的是2.6下载https://github.com/mavlink/qgroundcontrol/archive/Stable_V2.6.zipQT的对应版本http://download.qt-project.org/official_releas......
  • Codeforces Round 942 (Div. 2) D2
    链接题目要求用数学一点的形式表达出来就是统计有多少a,b满足1.\(1\leqa\leqn,1\leqb\leqm\)2.\(\existsk\inN^*,使得b\timesgcd(a,b)=k\times(a+b)\)首先,把a和b改写,使得\(gcd(a,b)\)消失\(a=q*d,b=p*d\),则,\(gcd(a,b)=d\)条件二变为:\(p\timesd^2=k\times(q\t......
  • [Unit Testing - React] Use the Testing Playground to Help Decide Which Query to
    Queryingisdifficult!Evenifwefollowtheguidingprinciplesandalwaysstartfromthequeriesaccessibletoeveryone,weareboundtogetstucksometimes.Tohelpusout,theTestingPlaygroundwascreated.Inthislesson,wearegoingtoseehowtou......
  • Codeforces Round 941 (Div. 2) Div 1 cf941 A-D
     A感觉A比较复杂啊,相比较B简单明了。way1只要有相同的一个数,它的数目大于等于k,那么它就可以进行一次操作,接下来可以再摸k-1个数,那么对于无法凑成k个数的数字来说,无论现在它有多少个数(>=1),加上这k-1个数,都能凑成数目>=k。同时,这个操作可以无限循环下去。所以这道题的出题设......
  • 牛客周赛 Round 40
    A-小红进地下城a=input()b=input()ifa==b:print("Yes")else:print("No")B-小红打怪#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>m;vector<string>s(n);......
  • 试了下playground-续8
    第七阵,PHOTOMOSAICS,就是马赛克,代码还没仔细看,想想这个原理其实很简单,就是把固定方格区域的色块模糊化就可以了,当难不住浑水摸久了的我,事实是,大体上走流程可以,但一些小细节给困住了,甚至到了要寻求外助的窘境,就在一个小时前才排查出故障点所在,运气啊,能再坚持一下就解救是有前提的,那......