首页 > 其他分享 >NOIP模拟<反思>(36~)

NOIP模拟<反思>(36~)

时间:2023-11-16 22:12:39浏览次数:34  
标签:fy NOIP int siz top 36 fx ans 模拟

NOIP2023模拟19联测40

异或连通

类似于线段树分治,但是可以在 \(trie\) 树上做。首先根据询问建一棵 \(trie\) 树,然后现在考虑将边插到树上。设插入的边权为 \(c_i\),因为 \(c_i^x<K\),所以我们压着上界走,考虑每一位 \(i\),如果 \(K\) 在第 \(i\) 位上位 \(1\),那么假如 \(c_i\) 在这位上位 \(1\),那么在 \(1\) 的儿子上可以压入这条边,而且这个点下面的值异或起来都不会大于 \(K\)。然后再用一个可撤销并查集就可以了。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,q,k;
struct asd{
    int x,y,c;
}a[N];
int Q[N];
int tr[N*100][2],idx=0;
unordered_map<int,int> rk;
void insert(int x,int p){
    int u=0;
    for(int i=32;i>=0;i--){
        int ch=((x>>i)&1);
        if(!tr[u][ch]) tr[u][ch]=++idx;
        u=tr[u][ch];
    }
    rk[p]=u;
}
vector<int> s[N*100];
void updata(int x){
    int w=a[x].c;
    int u=0;
    for(int i=32;i>=0;i--){
        int p=((k>>i)&1);
        int ch=(((k^w)>>i)&1);
        if(p==1 && tr[u][(w>>i)&1]) s[tr[u][(w>>i)&1]].push_back(x);
        u=tr[u][ch];
        if(!u) break;
    }
}
struct qwe{
    int x,fx,siz;
}b[N*10];
int top=0;
int fa[N],siz[N];
int get_fa(int x){
    if(fa[x]==x) return x;
    else return get_fa(fa[x]);
}
int ans=0;
unordered_map<int,int> anss;
void dfs(int x){
    int lim=top;
    for(int p=0;p<s[x].size();p++){
        int i=s[x][p];
        int fx=get_fa(a[i].x),fy=get_fa(a[i].y);
        if(fx==fy) continue;
        if(siz[fx]>siz[fy]){
            b[++top]={fy,fx,siz[fx]};
            ans=ans-(siz[fx]-1)*siz[fx]/2;
            ans=ans-(siz[fy]-1)*siz[fy]/2;
            fa[fy]=fx;
            siz[fx]+=siz[fy];
            ans=ans+(siz[fx]-1)*siz[fx]/2;
        }
        else{
            b[++top]={fx,fy,siz[fy]};
            ans=ans-(siz[fx]-1)*siz[fx]/2;
            ans=ans-(siz[fy]-1)*siz[fy]/2;
            fa[fx]=fy;
            siz[fy]+=siz[fx];
            ans=ans+(siz[fy]-1)*siz[fy]/2;
        }
    }
    anss[x]=ans;
    if(tr[x][0]) dfs(tr[x][0]);
    if(tr[x][1]) dfs(tr[x][1]);
    while(top>lim){
        fa[b[top].x]=b[top].x;
        ans-=(siz[b[top].fx]-1)*siz[b[top].fx]/2;
        siz[b[top].fx]=b[top].siz;
        ans+=(siz[b[top].fx]-1)*siz[b[top].fx]/2+(siz[b[top].x]-1)*siz[b[top].x]/2;
        top--;
    }
}
signed main(){
    // freopen("data.in","r",stdin);
    // freopen("cnt.out","w",stdout);
    freopen("xor.in","r",stdin);
    freopen("xor.out","w",stdout);
    scanf("%lld%lld%lld%lld",&n,&m,&q,&k);
    for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].c);
    for(int i=1;i<=q;i++){
        scanf("%lld",&Q[i]);
        insert(Q[i],i);
    }
    for(int i=1;i<=m;i++){
        if(a[i].x==a[i].y) continue;
        updata(i);
    }
    for(int i=1;i<=n;i++){
        fa[i]=i,siz[i]=1;
    }
    dfs(1);
    for(int i=1;i<=q;i++){
        printf("%lld\n",anss[rk[i]]);
    }
}

民主投票

设 \(dp_{i,u}\) 表示当前子树为 \(i\),且子树内每个点票数不大于 \(u\),此时这个子树需要向祖先贡献的票数,显然当 \(dp_{1,u}=0\) 时,\(u\) 是成立的。

那么我们可以二分一个 \(u\),然后找到一个最小的 \(u\),然后进行讨论。

如果一个点的子树(排除自己)大小大于 \(u\),那么这个点可以获胜,如果一个点子树大小小于 \(u\),那么这个点不可能获胜,因为需要严格大于,所以思考等于的情况。

我们可以求一个 \(u-1\) 时的 \(dp\) 状态,然后考虑一个子树为 \(u\) 的点 \(x\),那么这个点 \(dp\) 肯定为 \(0/1\),现在我们要让这个点票数为 \(u\),相当于贡献减少 \(1\),然后要通过一系列操作让 \(dp_1\) 边为 \(0\)。那么肯定 \(dp_x=0\) 肯定无解,那么考虑向上传递,没会会让到根路径上的点 \(dp\) 减一,然后发现如果为 \(0\),那么就传递不动,也就无法影响根,所以无解。还要保证根的 \(dp\) 为 \(1\),因为只能减少 \(1\) 的贡献使之变为 \(0\)。

标签:fy,NOIP,int,siz,top,36,fx,ans,模拟
From: https://www.cnblogs.com/jinjiaqioi/p/17837396.html

相关文章

  • 【游记】NOIP2023
    CSP-S没写游记,因为考得不咋地且内容都记在日记了。11.16出发前一天。上午考了模拟赛,题目难度一般,暴力基本写满有\(100+100+45+60\),T4最后好像想到Hall定理考虑一些东西了。下午改题。这次住闲庭四艺。感觉好像没啥非常不熟的板子,晚上看了看动态DP。......
  • 区块链技术的 ABAP 模拟实现
    思路本文这段ABAP代码是一个简单的区块链(Blockchain)模拟实现,主要用于演示和理解区块链的基本概念。下面将逐行解释该代码的主要功能和实现逻辑。报表声明:REPORTzblockchain.这是ABAP报表的声明,用于创建一个独立的ABAP报表程序。参数声明:PARAMETERS:diffleTYPEchar5......
  • NOIP 考前小复习
    考前整理一些可能用得到的东西。壹:命令行部分一、编译-std=c++14。-Wall,-Wextra。会提醒一些可能写错了的地方,或者一些比较明显的UB。比如for(___)a=___;b=___;,会告诉你循环可能漏掉了末尾;比如++x+x++,会告诉你未定义。有可能一些习惯,比如压行,会触发警告。这就需要视......
  • 蓝桥杯之模拟与枚举day1
    Question1卡片(C/C++A组第一题)这个是一道简单的模拟枚举题目,只要把对应每次的i的各个位都提取出来,然后对应的卡片数目减去1即可。属于打卡题目。注意for循环的特殊使用即可#include<iostream>usingnamespacestd;boolsolve(inta[],intn){//模拟枚举while(n!=0)......
  • EtherCAT转Modbus网关用Modbus Slave模拟从站配置案例
    兴达易控EtherCAT转Modbus网关可以用作Modbus从站的配置。EtherCAT转Modbus网关允许Modbus协议转换为EtherCAT,实现不同通信系统之间的互操作性。通过配置从站到网关的Modbus,您可以访问和控制Modbus设备。同时,网关还可以扩展Modbus网络的范围,使更多的设备可以连接到网络上。  ......
  • 【2023.11.16】NOIP2023模拟试题-35
    《信心赛》《很简单》T1\(O(n\logn)\)居然卡不过去(愤怒)所以我们需要研发\(O(n)\)的算法:单调队列。维护两个指针\(l,r\)从最左边开始扫,只要极差小于\(k\)就把\(r\)一直往右边挪,只要极差大于\(k\)就把\(l\)往右边挪,这样能确保永远是能取最大的一段区间。查......
  • 「比赛游记」NOIP 2023 游记
    「比赛游记」NOIP2023游记点击查看索引这是Index.百度百科扒的,有没有人给我来一张更好的.11.14(day998244350)模拟赛,稳定打挂.高二的明天信息学考,晚上看他们做题感觉很有趣味.但是初中有无聊的信息中考......
  • NOIP2023 考前9场 总结
    RoundT1T2T3T4估分实分R11001001070280280R2100101000210210R31001002540265265R44010000180140R560100500250210R6100500130105R71001001000300300R81001005030295280R90957502751......
  • 54. 替换数字(卡码网 第八期模拟笔试)
    2023-11-16题目页面(kamacoder.com)思路:        如果是c++,字符串可以改变,考虑双指针        但是Java的字符串不可变,所以就是按照题目的意思完成就行importjava.util.Scanner;classMain{publicstaticvoidmain(String[]args){/......
  • sc3336 接到pico上就疯狂重启吗? 断开就没事, 使用原厂镜像也有问题
    SC3336接到PICO上出现频繁重启的问题可能涉及多个方面,包括驱动程序、硬件兼容性、系统设置等。以下是一些建议和可能的解决方案:驱动程序问题:确保你使用的SC3336驱动程序与PICO设备和操作系统兼容。从官方网站或设备制造商处下载并安装最新的驱动程序。硬件兼容性:检查SC33......