2025-11-12 学习日记

发布于 2025-11-12 12:00 488 字 3 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. https://codeforces.com/problemset/problem/1857/E 关键词: 问题分析: 给出一个数组,代表一个线段上的点位,我们要选出这个 n 个点位为分割点,然后跟每个点进行链接,成 n 个线段,我们要求,对于每个点位的值,这个值定义为,每个点被线段覆盖的次数 核心思路:...

今日学习记录

1. https://codeforces.com/problemset/problem/1857/E

关键词:数学 问题分析: 给出一个数组,代表一个线段上的点位,我们要选出这个 n 个点位为分割点,然后跟每个点进行链接,成 n 个线段,我们要求,对于每个点位的值,这个值定义为,每个点被线段覆盖的次数

核心思路: 初步思路就是差分+前缀和,这样实现很简单,就是对区间的修改加求区间和,必超时 但是可以一步步分析距离和中的重复部分

数学+排序

其实还是利用了差分思维,我们从第一个元素开始,往右移,可以发现当前的元素离左边元素越远了,离右边元素越近了,右边的 n-i 个元素距离变短了arr[i]-arr[i-1],左边的 i 个元素增大了arr[i]-arr[i-1],所以总体减少了(n-2*i)*(arr[i]-arr[i-1]) 初始的时候,先算出最左端点离所有点的距离和+n,n 为每个点的单独值 处理时要先排序,同时要记录每个点的下标,这样在记录答案时知道原始位置

**最终代码:

#include <bits/stdc++.h>

using namespace std;

#define ve vector

using ll = long long;

using ull = unsigned long long;

using sr = string;

using db = double;

const int MOD=998244353;

const ll INF=1e18;

const int DIR[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};

int T;

void solve(){

    int n;cin>>n;

    ve<pair<int,int>> arr(n);

    for(int i = 0;i<n;i++){

        cin>>arr[i].first;

        arr[i].second = i;

    }

    ranges::sort(arr,[&](const auto &a,const auto &b){

        if(a.first==b.first) return a.second<b.second;

        else return a.first<b.first;

    });

    ll s = n;

    ve<ll> ans(n);

    for(auto [a,b]:arr){

        s += a - arr[0].first;

    }

    ans[arr[0].second] = s;

    for(int i = 1;i<n;i++){

        s -= 1LL*(n-i*2)*(arr[i].first-arr[i-1].first);

        ans[arr[i].second] = s;

    }

    for(auto x:ans) cout<<x<<" ";

    cout<<endl;

}

signed main() {

    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);

    cin>>T;

    while(T--) solve();

}

学到的点:

  1. 差分思想

执笔 手写

随机文章

加载中...