首页 > 其他分享 >11.20

11.20

时间:2024-11-20 22:46:44浏览次数:1  
标签:ch int 11.20 tr && hd define

\(100+100+30+45=275\)
开场 \(10\) 分钟,开始码 A,码了一个小时无果删码跑路。
十几分钟把 B 切了开始单挑 C,失败。
写完 D 暴力后剩 30min,极限写完 A。

A: 小 H 的积木

把最上方和最下方的都加入线段树,如果有一个数加入了 \(2\) 次,就把它放入待选答案里面,每次选择最小的同时放入与他相邻的数。

点击查看代码
#include <bits/stdc++.h>
#define fr first
#define se second
#define Un unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define LD long double
#define VE vector<LL>
#define DB double
#define Ve vector<int>
 
using namespace std;
 
inline LL read()
{
    LL x = 0,f = 1;char ch = getchar();
    while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
    while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
    return x*f;
}
 
const int N = 2e5+5,INF = 2e9;
vector < pii > pos[N];
Ve a[N],L,R;
unordered_map < int,bool > hd[N],tl[N],in[N];
bool vis[N];
 
struct tree{int l,r,cnt;pii mn;}tr[N<<2];
 
void build(int l,int r,int i)
{
    tr[i] = {l,r,0,{INF,0}};
    if (l == r) return ;
    int mid = (l+r)>>1;
    build(l,mid,i<<1),build(mid+1,r,i<<1|1);
}
 
void M(int p,int k,int i)
{
    if (tr[i].l == tr[i].r)
    {
        tr[i].cnt += k;
        if (tr[i].cnt >= 2)
        {
            auto [a,b] = pos[tr[i].l][0];
            auto [c,d] = pos[tr[i].l][1];
            if ((hd[a][b] && tl[c][d]) || (tl[a][b] && hd[c][d]))
            {
                if (hd[a][b])
                {
                    if (tl[c][d]) tr[i].mn = {a,tr[i].l};
                    else tr[i].mn = {c,tr[i].l};
                }
                else tr[i].mn = {c,tr[i].l};
            }
            else tr[i].mn = {INF,0};
        }
        else tr[i].mn = {INF,0};
        return ;
    }
    if (p <= tr[i<<1].r) M(p,k,i<<1);
    else M(p,k,i<<1|1);
    tr[i].mn = min(tr[i<<1].mn,tr[i<<1|1].mn);
}
 
int main()
{
    int n = read(),m = read();
    for (int i = 1,k;i <= m;i++)
    {
        k = read();
        for (int j = 0,x;j < k;j++) x = read(),a[i].pb(x),pos[x].pb({i,j});
    }
    for (int i = 1;i <= n;i++)
    {
        if (pos[i].size() != 2) return puts("-1"),0;
        sort(pos[i].begin(),pos[i].end());
    }
    build(1,n,1);
    for (int i = 1;i <= m;i++)
    {
        hd[i][0] = 1,tl[i][a[i].size()-1] = 1,M(a[i][0],1,1);
        if (a[i].size() > 1)
            M(a[i].back(),1,1);
    }
    for (int i = 1;i <= n;i++)
    {
        auto [x,y] = tr[1].mn;
        if (x == INF) return puts("-1"),0;
        auto [u,v] = pos[y][0];
        auto [e,f] = pos[y][1];
        M(y,-1e9,1),vis[y] = 1;
        L.pb(x);
        if (x == u)
        {
            R.pb(e);
            if (v+1 < a[u].size() && !vis[a[u][v+1]]) hd[u][v+1] = 1,M(a[u][v+1],1,1);
            if (f-1 >= 0 && !vis[a[e][f-1]])
            {
                tl[e][f-1] = 1,M(a[e][f-1],0,1);
                if (!hd[e][f-1]) M(a[e][f-1],1,1);
            }
        }
        else
        {
            R.pb(u);
            if (f+1 < a[e].size() && !vis[a[e][f+1]])
                hd[e][f+1] = 1,M(a[e][f+1],1,1);
            if (v-1 >= 0 && !vis[a[u][v-1]])
            {
                tl[u][v-1] = 1,M(a[u][v-1],0,1);
                if (!hd[u][v-1]) M(a[u][v-1],1,1);
            }
        }
    }
    for (int i : L) printf("%d ",i);
    reverse(R.begin(),R.end());
    for (int i : R) printf("%d ",i);
    return 0;
}

B: 小 H 的树

有两种方式,一种是断树边,另一种是把环断开,找出来环断环为链双指针搞一下即可。

点击查看代码
#include <bits/stdc++.h>
#define fr first
#define se second
#define Un unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define LD long double
#define VE vector<LL>
#define DB double
#define Ve vector<int>
 
using namespace std;
 
inline LL read()
{
    LL x = 0,f = 1;char ch = getchar();
    while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
    while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
    return x*f;
}
 
const int N = 2e5+5;
struct edge{int to,pre;}e[N<<1];
int a[N],las[N],cnt,pre[N],r[N<<1],ct;
bool in[N],flg,vis[N];
LL sum,s[N],ans = 1e18;
 
void add(int u,int v){e[++cnt] = {v,las[u]},las[u] = cnt;}
 
void D(int x)
{
    if (flg) return ;
    vis[x] = 1;
    for (int i = las[x],y;i && !flg;i = e[i].pre)
    {
        if ((y = e[i].to) != pre[x])
        {
            if (vis[y])
            {
                r[++ct] = y,in[y] = 1,flg = 1;
                while(x != y) r[++ct] = x,in[x] = 1,x = pre[x];
            }
            else pre[y] = x,D(y);
        }
    }
}
 
void D1(int x,int fa)
{
    s[x] = a[x];
    for (int i = las[x],y;i;i = e[i].pre)
        if ((y = e[i].to) != fa && !in[y]) D1(y,x),s[x] += s[y];
    if(!in[x]) ans = min(ans,llabs(sum-2*s[x]));
}
 
int main()
{
    int n = read();
    for (int i = 1;i <= n;i++) sum += (a[i] = read());
    for (int i = 1,u,v;i <= n;i++)
        u = read(),v = read(),add(u,v),add(v,u);
    D(1);
    for (int i = 1;i <= ct;i++) D1(r[i],0),r[i+ct] = r[i];
    LL res = 0;int j = 1;
    for (int i = 1;i <= ct;i++)
    {
        while(j < i+ct && res < sum/2) res += s[r[j++]];
        ans = min(ans,llabs(sum-2*res));
        res -= s[r[i]];
    }
    cout << ans;
    return 0;
}****

C: 小 H 的串

发现一种答案可能对应多种操作,赛时试图使用脑袋中仅剩的 \(\text{Trick}\) :把答案和操作间形成单射,对应同一答案的操作序列只在字典序最小时统计。但是根本进行不下去。

于是放弃对操作进行计数,我们对合法答案计数即可。
由于 \(t\) 很短,所以考虑状压。
设 \(f_{i, sta}\) 表示结果串长 \(i\),匹配状态为 \(sta\) 的结果串个数。

匹配状态 \(sta\):若 \(sta\) 第 \(j\) 为 \(1\),那么 存在一种用 \(s1_{1\ldots i - j}\) 和 \(s2_{1\ldots j}\) 拼出结果串的操作序列。

转移时枚举 \(i + 1\) 位填什么字符求下一个状态转移。
解析:

D: 小 H 的蛋糕F. Array Covering

wqs 二分大法好。

标签:ch,int,11.20,tr,&&,hd,define
From: https://www.cnblogs.com/ZepX-D/p/18559499

相关文章

  • 每日打卡 11.20
    includeinclude<string.h>include<windows.h>usingnamespacestd;intupdata_score(structstudent*p,intn,intnum,intcourse,intscore);structstudent{intnum;charname[10];intc,math,english;doubleaverage;};intmain(){intin......
  • 24.11.20
    我感觉我是一个挺奇怪的人就像是无时无刻不在找事情做,哪怕是在脑袋里和自己说话这种事,不知道为什么我很不喜欢什么事都不干,总感觉陷入这种状态就会很急迫很不安,总是喜欢找一些事来干也是一个很“幼稚”的人大概是经常喜欢在心里抱怨现实又从不说出来,最多就只能在网上撒撒气,喜欢......
  • 闲话 11.20
    10daysleft.不说闲话,捡重点说。P4113[HEOI2012]采花hh的项链加强版。首先考虑莫队,轻松写,轻松133pts,轻松过不了后两个hack,考虑优化。既然是加强版,那么就考虑沿用之前的思路。记录上次出现某个数的位置和上上次出现某个数的位置,离线之后将询问挂到右端点上,依然是树状数......
  • 11.20
    Constructor构造方法根据一个class类创建这个类的对象的过程称为构造创建对象的方法称为构造方法构造方法命名与类名一致,如classPerson的构造方法Person()所有类都有其默认的构造方法,你可以显式定义并修改构造方法定义时"无返回(但不是void)",不声明返回值,也不能用return,因为......
  • 11.20 模拟赛
    总结完啦A不会做。肯定是神秘贪心题。不太好模拟啊。算了猜个结论吧。\(m=1\)是经典问题,把这个稍微引申一下。得到了一个multiset维护的做法。然后猜对了。15min切掉。很快码了一个对拍然后一直拍到比赛结束。看B。感觉不难。尝试设计DP。发现我啥也不会,所以先写个暴......
  • 11.20闲话-存档
    存档参考使用没有存档的软件,就像吃饭不给容器一般。故存档必然是极为重要的。下面介绍Unity的几种存档方式。代码出处Part.1——PlayerPrefs应该是最简单的存档方式。但局限性也是显然的,只能存储int,float,string三种类型,就像在文件中存储了三个map<string,int/f......
  • 2024.11.20 NOIP模拟 - 模拟赛记录
    异或(xor)每次所加三角形的范围如图所示:这道题做法较多,我是通过两组差分与前缀和来做的。首先需要一个三角形差分,使每一次在差分数组中修改时,影响到的范围是一个三角形,比如这样(红色点为\((x,y)\),即\((r,c)\)):假设我们真正需要修改的三角形是橙色部分:那么联系到正常差分,很容......
  • 1-2模块电源电路(11.20)
    DCDC模块电源常用电路:变换器作用:进行电压转换、保证所需的相关输出电容恒流:C三角U=IT;电感恒压:L三角I=UT;V0/Vim=D(1-D);三种非隔离开关电源:降压、升压、升降压电路三种隔离开关电源:反激型变换器、正激型变换器、桥式变换器、反激型:实现多路输出、输出波形电流、控制输......
  • 2024.11.20总结
    本文于github博客同步更新。A:一个数可以被操作当且仅存在一列的顶部元素为它且存在一列的底部元素为它,初始扫一遍,将合法的元素以顶部所在列为关键字扔到小根堆里,每次找到最小的元素添加,然后检查将新露出来的元素是否存在匹配,若结束时未填完即为无解。B:要么在非环边上砍一刀,......
  • 11.20 CW 模拟赛 赛时记录
    看题前言:花了\(10\rm{min}\)把昨天的题调了一下,神经\(\rm{T1}\)艹,再一次缺失大样例神秘博弈放\(\rm{T1}\),大抵可做(主要原因是\(\rm{lhs}\)键盘敲得框框响)手玩几组数据大概能做,后面再认真看\(\rm{T2}\)看到树直接小命不保喵了个咪的,这我打鸡毛啊又......