首页 > 其他分享 >2.21闲话 & solution『 有没有/谁/能够代替我』

2.21闲话 & solution『 有没有/谁/能够代替我』

时间:2024-02-21 22:11:22浏览次数:22  
标签:2.21 const int 闲话 solution sgt tag right now

上午有唐氏模拟赛,100/0/0/20rk7/15,鉴定为最唐的一次

T1签到题,思路很简单

  • 题面

    ame 是一个可爱的女孩子,她想要你帮她排序。 给定\(4\times n\)个数,要求将其分为\(n\)组,使得对于每组四个数 ,所有组中 的\(|a\times b-c\times d|\)和最大,求最大和。

排序,对于前\(2n\)大的,尽量把大的和大的相乘,后\(2n\)的把大的和小的相乘,然后两者相减即可

赛时没删sleep的调试,但是我的sleep是用for循环代替的,而我开了O2侥幸通过此题

天依$\text{'s Code}$
int n,a[N],ans;
inline bool cmp(int x,int y){
	return x<y;
}
signed main() {
	FastI>>n;
	for(int i=1;i<=4*n;i++){
		FastI>>a[i];
	}
	sort(a+1,a+1+4*n,cmp);
	const int TianYi=n*2;
	for(int i=4*n;i>TianYi;i-=2){
		ans+=a[i]*a[i-1];
	}
	for(int i=TianYi,j=1;i>=j;i--,j++){
		ans-=a[i]*a[j];
	}
	FastO<<ans;
}

T2是二分+单调队列优化\(\text{dp}\)

image

看到题面直接就知道是二分了,再仔细看看\(dp\)也出来了,但是明显裸的\(dp\)过不去,考虑优化\(\text{dp}\)

观察\(\text{dp}\)的转移方程发现满足单调队列优化的形式,考虑单调队列优化\(\text{dp}\)

天依$\text{'s Code}$
int f[N][2],n,m,s,w[N];
pair<int,int>que[N];
int head=1,tail=0;
inline void clear(){
    head=1,tail=0;
}
inline void change(int x,int id){
    while(head<=tail&&que[tail].first<x) 
        tail--;
    que[++tail]=make_pair(x,id);
}
inline int Get(int l){
    while(head<=tail&&que[head].second<l)     
        head++;
    if(head>tail) 
        return 0;
    return que[head].first;
}
inline bool check(int sz){
    memset(f,0,sizeof(f)); 
    clear();
    for(int i=1;i<=n;i++){
        if(i>=sz) 
            change(max(f[i-sz][1],f[i-sz][0])+n-(i-sz),i-sz);
        f[i][0]=max(f[i-1][1],f[i-1][0]);
        f[i][1]=max(f[i][1],Get(i-w[i])+i-n);
    }
    if(max(f[n][0],f[n][1])<s) return 0;
    else return 1;
}
signed main(){
    FastI>>n;
    for(int i=1;i<=n;i++) FastI>>w[i];
    FastI>>s;s=ceil(n*1.0/100*s);
    int l=1,r=n;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)) l=mid+1;
        else r=mid-1;
    }
    FastO<<r;
}

T3赛时以为是树上组合数学,正解是树状dp

蒜头君有一棵 n 个节点的树(即 n个节点,n−1 条边的无向连通图)。树的每个节点上都有一个宝藏。蒜头君准备大动干戈,拿到这些保证。

但是在拿宝藏之前,蒜头君发现了一个问题,由于树的边的材质问题,若两个节点被一条边直接连接,为了确保安全,那么这两个节点上的宝藏最多可以拿一个。

好在同样擅长化学的巨佬--花椰妹给了蒜头君一条特殊材质的边。蒜头君可以选定一条边并将这条边的材质替换成特殊材质的边,于是为了确保安全,被这条选定的边直接相连的两个节点上的宝藏最少拿一个。

蒜头君想知道,对于每一条边,若选定这条边替换成花椰妹送给他的特殊材质的边,在确保安全的情况下,有多少种拿的方法是可行的。

查看错误题解

image

但是题解是错误的,因为裸的树形dp复杂度是\(O(n^2)\)无法通过此题

可以通过dfs预处理降低复杂度,详情看DZ博客

唔,代码没有诶

T4赛时打了暴力,然后去写题了

正解是二分+线段树+扫描线,官方题解依然是错误的

image

查看错误题解

image

这里是正确的题解

image

点击查看std
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int n, m;
int arr[MAXN];
int last[MAXN];
int nxt[MAXN];
long long answer[MAXN];

struct SegmentTree {
public:
    int min, num;
    long long sum;
    class LazyTag {
    public:
        int cover, tim;
        long long add;
        inline LazyTag() {
            cover = -1;
            add = 0;
            tim = 0;
        }
        inline LazyTag(const int cover): cover(cover) {
            if (cover == -1) {
                tim = 1;
            }
        }
    } tag;
} sgt[MAXN << 2];

inline void PushUp(const int now) {
    sgt[now].min = min(sgt[now << 1].min, sgt[now << 1 | 1].min);
}
void Build(const int now = 1, const int left = 0, const int right = m) {
    if (left == right) {
        sgt[now].num = sgt[now].min = last[left];
        return;
    }

    Build(now << 1, left, (left + right) >> 1);
    Build(now << 1 | 1, ((left + right) >> 1) + 1, right);
    PushUp(now);
}
inline void Down(const SegmentTree::LazyTag tag,
                 const int now, const int left, const int right) {
    sgt[now].sum += 1ll * sgt[now].num * tag.tim + tag.add;

    if (~tag.cover) {
        if (~sgt[now].tag.cover) {
            sgt[now].tag.add += 1ll * sgt[now].tag.cover * tag.tim + tag.add;
        } else {
            sgt[now].tag.tim += tag.tim;
            sgt[now].tag.add = tag.add;
        }

        sgt[now].num = sgt[now].min = tag.cover;
        sgt[now].tag.cover = tag.cover;
    } else {
        if (~sgt[now].tag.cover) {
            sgt[now].tag.add += 1ll * sgt[now].tag.cover * tag.tim;
        } else {
            sgt[now].tag.tim += tag.tim;
        }
    }
}
inline void PushDown(const int now, const int left, const int right) {
    Down(sgt[now].tag, now << 1, left, (left + right) >> 1);
    Down(sgt[now].tag, now << 1 | 1, ((left + right) >> 1) + 1, right);
    sgt[now].tag = SegmentTree::LazyTag();
}
void Updata(const int now_left, const int now_right,
            const int cover, const int now = 1,
            const int left = 0, const int right = m) {
    if (now_right < left || right < now_left) {
        return;
    }

    if (now_left <= left && right <= now_right) {
        Down(SegmentTree::LazyTag(cover), now, left, right);
        return;
    }

    PushDown(now, left, right);
    Updata(now_left, now_right, cover, now << 1, left, (left + right) >> 1);
    Updata(now_left, now_right, cover,
           now << 1 | 1, ((left + right) >> 1) + 1, right);
    PushUp(now);
}
inline void Time() {
    Down(SegmentTree::LazyTag(-1), 1, 1, m);
}
int Find(const int now_left, const int now_right,
         const int val, const int now = 1,
         const int left = 0, const int right = m) {
    if (now_right < left || right < now_left || val <= sgt[now].min) {
        return -1;
    }

    if (left == right && now_left <= left && right <= now_right) {
        return left;
    }

    int result(Find(now_left, now_right, val, now << 1 | 1,
                    ((left + right) >> 1) + 1, right));
    return ~result ? result : Find(now_left, now_right,
                                   val, now << 1, left, (left + right) >> 1);
}
void GetAnswer(const int now = 1, const int left = 0, const int right = m) {
    if (left == right) {
        answer[left] = sgt[now].sum;
        return;
    }

    PushDown(now, left, right);
    GetAnswer(now << 1, left, (left + right) >> 1);
    GetAnswer(now << 1 | 1, ((left + right) >> 1) + 1, right);
}

int main() {
    scanf("%d%d", &n, &m);
    int last0 = 0;
    long long answer0 = 0;

    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);

        if (arr[i] == 0) {
            answer0 += (i - last0 - 1ll) * (i - last0) >> 1;
            last0 = i;
        }
    }

    answer0 += (n - last0) * (n + 1ll - last0) >> 1;

    for (int i = 0; i <= m; i++) {
        last[i] = n + 1;
    }

    for (int i = n; i >= 1; i--) {
        nxt[i] = last[arr[i]];
        last[arr[i]] = i;
    }

    for (int i = 1; i <= m - 1; i++) {
        last[i] = max(last[i], last[i - 1]);
    }

    Build();

    for (int i = 1; i <= n; i++) {
        Time();
        int f = Find(arr[i], m, nxt[i]);

        if (~f) {
            Updata(arr[i], f, nxt[i]);
        }
    }

    GetAnswer();
    int l, r;
    scanf("%d%d", &l, &r);

    if (!l) {
        printf("%lld ", answer0);
        l = 1;
    }

    for (int i = l; i <= r; i++) {
        printf("%lld ", answer[i] - answer[i - 1]);
    }

    return 0;
}

image

标签:2.21,const,int,闲话,solution,sgt,tag,right,now
From: https://www.cnblogs.com/Vsinger-LuoTianYi/p/18026249

相关文章

  • Solution Set【2024.2.21】
    [ARC162C]MexGameonTree可以发现若Bob在某个节点填了值\(K\),那么会直接导致其根链上的所有节点均不可能满足要求。因此若某个节点的子树内有不小于两个空位,那么Alice一定无法使该子树满足要求。若某节点子树内有一个空位且可以通过填上这一空位使其合法,那么Alice可......
  • 闲话2.21
    摆摆摆......
  • 2.21
    md,快开学了,没有一套作业是自己写的下大雪了,外卖都废了,但是没有人能阻止我想吃肯德基的心,就是说,家人们,就是一整个直接出门简述过程:tmd,摔了一跤,溜冰场tmd都没有马路滑搞笑的是,回去的路上看到一只德牧四个爪子都在打滑分享我堆的雪人没奖竞猜表情用什么弄的答案可乐报......
  • 2024.2.21 LGJ Round
    A你在平面上有\(n\)个点,你每次可以从一个点跳到其右下或左上任意的点,|对每个点\(i\),求所有点到\(i\)至少跳多少次的和。点的坐标值域为\(M=2500\)。\(n\le2.5e5\).我们先考虑某个点,到所有点跳多少次。首先右下,左上都是跳一次即可。我们先考虑右上的点怎么办。我们一定......
  • 2024.2.20闲话——luogu5021随机选取边的正确性
    推歌:生きる(feat.可不)——水野あつ这首歌听完之后接着转去咖喱乌冬了,歌词甚至能接上,没绷住。刚刚写证明中间把wxy的杯子碰倒洒键盘上了,抢救键盘的过程中碰到缝就有水,有点涩。但是这个键盘里面怎么这么脏啊?下面来证luogu5021在菊花树中以任何顺序选取边并采取贪心策略的......
  • 【闲话】2024.2.20
    年前yspm让我写闲话,我说文笔不好且没啥可写的,今天确实有很多想写一下的,看int_R等人今天都写闲话了,比较蠢蠢欲动。昨天莫名放电影了,四机房自然是从自己找若干电影中公投一个下载,这次的选择范围是整个豆瓣TOP250!最终《看不见的客人》在《幸福终点站》《被解救的姜戈》《小丑......
  • 闲话2.20
    又是听不懂的一天......
  • 2024-02-20 闲话
    今天学习了\(\displaystyle\int_{-\infty}^{+\infty}\exp(-x^2)dx\)的做法。然后把昨天说的题做掉了,不过有一个性质是\(a<0\)否则\(\exp(ax^2+bx+c)\)不能是概率密度函数。上午的大学物理实在是太难了,量纲学不会一点。于是去知乎上找了一个RAG的文章看,然后吸取经验......
  • 2.19 闲话 & 学习笔记 『 望向这片懵懂的土地/嘈杂念想充斥着思绪 』
    昨天没发闲话,今天事情太乱来不及写学术内容放昨天的学术内容吧今天去面试,感觉说的跟个......
  • 闲话2.19
    颓。上午打了一场模拟赛......