首页 > 其他分享 >CF 记录

CF 记录

时间:2023-08-16 10:46:45浏览次数:44  
标签:记录 int CF read while MAXN isdigit getchar

CF1858B The Walkway

降智题,但是这种题放B着实有点恶心
考虑每两个相邻点对\(x\),\(y\)对于答案的贡献,显然是\(\frac{s_y-s_x-1}{d}\)
然后每次枚举删除的点\(i\),减去\((i-1,i)\),\((i+1,i)\)的贡献,再加上\((i-1,i+1)\)的贡献就是可能的答案
但是实现的时候细节很多,主要是两个端点不好处理,一种比较简单的实现方法是将\(1-d\)和\(n+1\)加入点集再特判即可

\(code\):

点击查看代码
#include<bits/stdc++.h>
 
using namespace std;
 
template <class T>
void read(T &x){
    x=0;char c=getchar();bool f=0;
    while(!isdigit(c)) f=c=='-',c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    x=f? (-x):x;
}
#define ll long long
 
const int MAXN=2e5+5;
 
int T,n,m,d,s[MAXN];
 
int calc(int x,int y){
    return (s[y]-s[x]-1)/d;
}
 
int main(){
    read(T);
    while(T--){
        read(n);read(m);read(d);
        for (int i=1;i<=m;i++) read(s[i]);
        s[++m]=1-d,s[++m]=n+1;
        sort(s+1,s+1+m);
        int ans=0;
        for (int i=2;i<=m;i++){
            ans+=(s[i]-s[i-1]-1)/d;
        }
        ans+=m-2;
        int mn=0x3f3f3f3f;
        int cnt=0;
        for (int i=2;i<m;i++){
            int cur=calc(i-1,i+1)-calc(i-1,i)-calc(i,i+1);
            if (cur<mn){
                mn=cur;
                cnt=1;
            }
            else if (cur==mn) cnt++;
        }
        printf("%d %d\n",ans+mn-1,cnt);
    }
}

CF1858 E1. Rollbacks (Easy Version)

赛后听神加哥讲完后还是感觉非常套路的。。。
对于这种带有回退的问题,考虑建出树形结构,每次加入一个点时直接新建节点往下走并预处理\(k\)级祖先,删除时直接往上跳\(k\)级祖先,回退时用之前加入和删除时栈中记录的在树中的位置回溯,询问直接挂在树上。最后一次\(dfs\)即是答案。

对于\(E2\)强制在线,发现对每个询问其实能产生贡献的只有它到根节点的一条链,直接维护这条链上的信息即可。但是懒得写了

点击查看代码
#include<bits/stdc++.h>

using namespace std;

template <class T>
void read(T &x){
    x=0;char c=getchar();bool f=0;
    while(!isdigit(c)) f=c=='-',c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    x=f? (-x):x;
}

const int MAXN=1e6+5;

int m,qcnt;
int ans[MAXN];
struct Query{
    char op;
    int x,id;
}q[MAXN];

vector <int> G[MAXN];
vector <int> Q[MAXN];

int tot,u,a[MAXN],fa[MAXN][24];

void init(int u,int f){
    fa[u][0]=f;
    for (int i=1;i<24;i++){
        fa[u][i]=fa[fa[u][i-1]][i-1];
    }
}

int kth(int u,int k){
    for (int i=0;i<24;i++){
        if (k&(1<<i)) u=fa[u][i];
    }
    return u;
}

int st[MAXN],top;

int bucket[MAXN],res;

void dfs(int u){
    for (const auto &x:Q[u]) ans[x]=res;
    for (const auto &v:G[u]){
        if (++bucket[a[v]]==1) res++;
        dfs(v);
        if (--bucket[a[v]]==0) res--;
    }
}

void solve(){
    u=1;tot=1;
    for (int i=1;i<=m;i++){
        if (q[i].op=='+'){
            st[++top]=u;
            ++tot;
            G[u].push_back(tot);
            a[tot]=q[i].x;
            init(tot,u);
            u=tot;
        }
        else if (q[i].op=='-'){
            st[++top]=u;
            u=kth(u,q[i].x);
        }
        else if (q[i].op=='!'){
            u=st[top--];
        }
        else Q[u].push_back(q[i].id);
    }
    dfs(1);
}

int main(){
    read(m);
    for (int i=1;i<=m;i++){
        char op[5];
        scanf("%s",(op+1));
        q[i].op=op[1];
        if (op[1]=='+'||op[1]=='-') read(q[i].x);
        if (op[1]=='?') ++qcnt,q[i].id=qcnt;       
    }
    solve();
    for (int i=1;i<=qcnt;i++) printf("%d\n",ans[i]);
}

标签:记录,int,CF,read,while,MAXN,isdigit,getchar
From: https://www.cnblogs.com/cqbzlzh/p/17633356.html

相关文章

  • 数据结构口胡记录
    数据结构口胡记录114514天没写博客了(悲)BearandBadPowersof42\(tag\):线段树,势能分析原问题不好直接做,考虑转化维护信息首先可以发现42的幂次并不多,所以每次操作3到停止的次数并不多,因此可以用线段树多次打区间加标记。问题转化为看一个区间内是否存在42的倍数,因为区间......
  • ARC 做题记录
    又来开新坑了建议改为ATC看题解记录[ARC103F]DistanceSums\(tag\):构造,树的性质sol\(remark\):构造题多考虑题目中隐式给出的已知量,如本题的重心,树的构造题中从儿子向上,由变化量得到父亲信息是很重要的思想。[ARC102F]RevengeofBBuBBBlesort!\(tag\):构造,逆序对,结论sol......
  • dp递推 口胡记录
    dp/递推口胡记录[SHOI2013]超级跳马\(tag\):矩阵乘法,前缀和暴力\(dp\)很显然,设\(f_{i,j}\)为从\((1,1)\)跳到\((i,j)\)的方案数,那么有$f_{i,j}=\sum\limits_{j-(2k+1)>0}f_{i/i+1/i-1,j-(2k+1)}$发现这个东西其实是一直由前面奇偶性相同的一段转移过来的,因此考虑前缀和......
  • 图论口胡记录
    图论口胡记录Xor-MST\(Borvuka\)算法版题\(Borvuka\)的流程是每次对于每个联通块中都找到一条向外部最小的边,然后再将边相连的两个连通块合并。可以发现每次连通块的个数都会减半,只会合并\(\log_n\)次,那么中间找最小边的过程中,对于没有显式建边的题目我们就可以用数据结构维护......
  • ThingsKit物联网平台告警中心之上下线记录
    设备上下线功能用于监控设备的连接状态,当设备离线或下线时,系统会及时发出通知,以便用户能够及时处理。处理和详情处理设备上下线记录和查看设备上下线记录详情。搜索记录多条件筛选查看设备上下线记录。删除单项或批量删除设备上下线记录。文章来源(首发地址):ThingsKit物联......
  • ThingsKit物联网平台消息记录管理
    短信发送和邮件发送记录用户配置消息模板和消息配置后所有发送的邮件和短信的汇总,可点击查看详细信息。:::info......
  • CF1858C Yet Another Permutation Problem 题解
    杂言赛时想到做法,结果调code把自己心态调炸了,所以来写一篇题解(恼)。另:此题与P9345夕阳西下几时回几乎相同,可以此练手。另另:本题多测,多测不清空,爆零两行泪。题意翻译\(a_1,a_2,\dots,a_n\)是\(1\)至\(n\)的一个排列,记\(d_i=\gcd(a_i,a_{i\bmodn+1})\)。构造一个......
  • [刺客伍六七&黑客] 魔刀千刃诞生与维护记录
    魔刀千刃的特写诞生之日:2023.7.29上传至pip源之日:2023.8.15此后会在此记录如何自己写一个自己的python库以及魔刀千刃的维护过程。魔刀千刃(evilblade)**只攻不防,天下无双**实战(和堆攻击帖子重合了,没关系)0x0bhitcontraining_heapcreator这是buu的pwn第二页最后一题......
  • samba--使用记录
    最近工作上参与的一个自动化项目的代码是放在一个linux上安装的git上的。在做自动化开发时,要么是远程连接到linux服务器上,然后在服务器上进行自动化开发,不过在linux操作系统上开发自动化,比较麻烦。本地电脑开发会更方便和高效一些。因此在linux装了samba.,这样可以方便本地开发自......
  • ABC314 E和CF892 Div2D-E
    ABC314EE-Roulettes(atcoder.jp)大致意思是给你n个轮盘,第i个轮盘等概率的p[i]个点数,玩一次c[i]价钱,问要达到m点的最小期望花费是多少,每次可以任意选一个。乍一看很像背包,偏了方向,所以当时没有做出来。也考虑过其它的DP,关键是0怎么处理没搞明白所以赛后看他人的代码和题解......