首页 > 其他分享 >2023牛客多校(9)

2023牛客多校(9)

时间:2023-08-14 20:58:13浏览次数:39  
标签:cnt 5005 int 2023 bh 多校 牛客 ans nw

D

首先考虑枚举一个左端点

然后我们就会发现,对于一个位置来说,会影响它的只有前缀和后缀比它小的数

于是让每个数字不合法的都是一个区间

可以预处理$[L,i]$这个范围内有几个比它小的数,设为$x$

然后就能知道第一个让它不合法的位置($i - L - x$)个比它小的数的位置

而让它重新合法只需要再有一个比它小的数即可

于是我们就定义$f[i][j]$表示$i$后第$j$个比$a_i$小的数的位置,预处理这个即可。

最后就是一个线段覆盖问题,扫描线瞎跑一下

$O(n^2)$

#include <bits/stdc++.h>
using namespace std;
int a[5005][5005];
int T;
const int mx = 5000;
int pp[5005];
int Tree[5005];
int aa[5005];
int Sum[5005][5005];
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while (T--){
        int N;
        cin >> N;
        for (int i = 1 ; i <= N ; i ++)
            cin >> aa[i];
        for (int i = 1 ; i <= N ; i ++)
            for (int j = 1 ; j <= N ; j ++)
                a[i][j] = 0;
        for (int i = 1 ; i <= N ; i ++){
            int cnt = 0;
            a[i][0] = i;
            for (int j = i + 1 ; j <= N ; j ++){
                if (aa[j] < aa[i]){
                    cnt ++;
                    a[i][cnt] = j;
                }
            }
        }
        for (int i = 1 ; i <= N ; i ++){
            for (int j = 1 ; j <= i ; j ++){
                if (aa[j] < aa[i]) Sum[i][j] = Sum[i][j-1] + 1;
                else Sum[i][j] = Sum[i][j-1];
            }
        }
        int ans = 0;
        for (int i = 1 ; i <= N ; i ++){
            for (int j = i ; j <= N ; j ++)
                pp[j] = 0;
            for (int j = i ; j <= N ; j ++){
                int x = Sum[j][j] - Sum[j][i-1];
                int Len = j-i+1;
                int y = Len - x-1;
                int y1 = Len - x;
                int x1 = a[j][y];
                int x2 = a[j][y1];
                if (x1 == 0) x1 = N+1;
                if (x2 == 0) x2 = N+1;
                //cout << i << " " << j << " " << x1 << " " << x2 << endl;
                pp[x1] ++;
                pp[x2]--;
            }
            int cnt = 0;
            for (int j = i ; j <= N ; j ++){
                cnt = cnt + pp[j];
                if (cnt == 0) ans ++;
            }
        }
        cout << ans << endl;
    }
    return 0;
} 

E

辗转相除一定能构造一个合法方案。

#include <bits/stdc++.h>

#define LL long long
#define ULL unsigned long long
#define x first
#define y second
#define endl "\n"

using namespace std;

typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;

const int INF = 0x3f3f3f3f;

vector<array<int, 3>> ans;

void dfs(int x, int y, int n, int m)
{
    if (n == 0 || m == 0)
        return;
    if (n > m)
    {
        int t = n / m;
        int d = n % m;
        for (int i = 0; i < t; i++)
        {
            ans.push_back({x + m * i, y, m});
        }
        dfs(x + m * t, y, d, m);
    }
    else
    {
        int t = m / n;
        int d = m % n;
        for (int i = 0; i < t; i++)
        {
            ans.push_back({x, y + n * i, n});
        }
        dfs(x, y + n * t, n, d);
    }
}

void solve()
{
    int n, m;
    cin >> n >> m;

    ans.clear();

    cout << "YES" << endl;
    dfs(0, 0, n, m);

    cout << ans.size() << endl;
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i][0] << ' ' << ans[i][1] << ' ' << ans[i][2] << endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int t;
    cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}

I

有点不好解释的一个题

首先考虑把所有线段端点都压到数轴上

然后每条线段的覆盖情况无非三个情况:

1、无线段覆盖

2、有一条

3、有两条

分开统计一下这三种情况,并且记录当前枚举的点被几个线段覆盖

然后我们就只需要在每个线段离开的时候去统计它的贡献。如果当前离开的时候第$i$组是两条,并且有$n$覆盖的话,那么答案就加上$2^{cnt_2 -1}$

如果是$1$条,就加上$2^{cnt_2}$

因为我们贪心的想,每个线段一定是尽可能覆盖,直到不能再覆盖了才去统计答案。这样能保证不重不漏

然后扫描线扫一下就好啦(

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 1e9+7;
struct Node{
    int x,y,Type;
};
int temp(Node a,Node b){
    if (a.x == b.x && a.Type == b.Type){
        return a.y < b.y;
    }
    if (a.x == b.x){
        return a.Type < b.Type;
    }
    return a.x<b.x;
}
int Pow(int x,int y){
    int ans = 1;
    for (;y;y>>=1){
        if (y & 1) ans = 1ll * ans * x%MOD;
        x = 1ll * x * x%MOD;
    }
    return ans;
}
int cnt[500005];
vector<Node> nw;
signed main(){
    int N;
    cin >> N;
    for (int i = 1 ; i <= N ; i ++){
        int l,r;
        cin >> l >> r;
        nw.push_back({l,i,1});
        nw.push_back({r+1,i,-1});
        cin >> l >> r;
        nw.push_back({l,i,1});
        nw.push_back({r+1,i,-1});
    }
    sort(nw.begin(),nw.end() ,temp);
    int cnt1 = 0,ans = 0 ,ans1 = 0,cnt2 = 0;
    for (auto v : nw){
        int pos = v.x,bh = v.y,tp = v.Type;
        if (tp == 1){
            if (cnt[bh] == 0) {
                cnt1 ++;
                cnt[bh] ++;
            }else
            if (cnt[bh] == 1){
                cnt[bh] ++;
                cnt2 ++;
            }
        }else{
            if (cnt[bh] == 1){
                if (cnt1 == N) ans = (ans + Pow(2,cnt2))%MOD;
                cnt[bh]--;
                cnt1--;
            } else {
                cnt[bh]--;
                if (cnt1 == N) (ans += Pow(2,cnt2-1))%=MOD;
                cnt2--;
            }
        }
    }
    cout << ans%MOD << endl;
    return 0;
}

G线代水平不行,没想出来

B数论水平不行,推慢了。

令人感慨(

标签:cnt,5005,int,2023,bh,多校,牛客,ans,nw
From: https://www.cnblogs.com/si--nian/p/17629698.html

相关文章

  • 2023牛客多校第九场 D Non-Puzzle: Error Permutation
    题意给定一个长度为n的序列,计算有多少个子区间满足子区间第K小的数不在子区间第K位。 找出所有不满足条件的区间。枚举所有的ai和左端点al,找出满足ai是区间[l,r]中第r-l+1小的右端点r,则右端点r一定是一段区间。例如   342165         l i ......
  • hdctf2023
    MISC0x00hardMisc直接记事本打开会出现乱码,用winhex打开复制16进制值,然后ASCII转16进制,base64解码SERDVEZ7d0UxYzB3M18xMF9IRGN0Zl9NMTVjfQ==HDCTF{wE1c0w3_10_HDctf_M15c}0x01MasterMisc所有的文件组成一个大的压缩包,用010爆破出密码,分离出音频文件音频隐写只有前部分,再......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串......
  • 20230814日记
    20230814博客园美化借wqx的手机号搭建博客园,之前一直失败的博客园美化终于成功了一次,用的是这一套美化模板,好评,必须安利!美化过程中还发现了一个免注册图床,同样安利。博客园的后期规划主要是写一点,题解,总结,日记之类的。破碎的美家里的闹钟有种破碎的美,美不美不知道,反正肯定是......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串str2......
  • 2023.08.12 codeforces round 892 div2
    年轻人的第三场div2(已完成:ABCDE)rank:1265solved:4ratingchange:+276newrating:1323A.UnitedWeStand题意:给定一个数列a,问是否能分成两个非空的数列b和c,使得c中任意一个数不是b中任意一个数的因子;若x是y的因子则有x<=y;因此不妨将数列的最大值放入c,把剩下的数放入b;注意数列中......
  • 23牛客多校9 I Non-Puzzle: Segment Pair
    也许更好的阅读体验\(\mathcal{Description}\)给\(n\)对区间,要求每对区间恰好选一个使得选出来的\(n\)个区间有交集,问有多少方案数\(1\len,l_i,r_i\le5×10^5\)\(\mathcal{Solution}\)注意到区间的值域也是\(5×10^5\),考虑从值域入手,也就是枚举每个点看有多少种方案使最后......
  • 牛客周赛 Round 7
    牛客周赛Round7A-游游的you矩阵_牛客周赛Round7(nowcoder.com)把四种字符凑一起看看有没有\(y,o,u\)就行#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,m......
  • 云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14
    推荐一个GitHub仓库:Fast-Kubernetes。Fast-Kubernetes是一个涵盖了Kubernetes的实验室(LABs)的仓库。它提供了关于Kubernetes的各种主题和组件的详细内容,包括Kubectl、Pod、Deployment、Service、ConfigMap、Volume、PV、PVC、Daemonset、Secret、Affinity、Taint-Tolerati......
  • 【专题】2023年Z世代新母婴人群消费洞察报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33430原文出处:拓端数据部落公众号我国出生人口数量在2022年为956万人,比去年减少了10%。多种因素影响了这一趋势,包括育龄人口减少、生育观念改变以及婚育年龄推迟。然而,与此同时,由于母婴人群消费水平不断提高,以及精细化喂养逐渐成为育儿的主流方式,......