首页 > 其他分享 >暑假训练第二周周报

暑假训练第二周周报

时间:2024-07-21 17:42:10浏览次数:6  
标签:vector int cin 暧昧关系 第二周 MAXN 暑假 周报 define

总体学习情况

这周时间大多花在写上周的堆栈的题单了,然后比赛又碰到了一些新的知识点,比如无权二分图的最大匹配,01背包的相似例题,但是感觉数据结构的基础还是得练,遇到一些题还是没办法写对。

知识点模块

1.无权二分图最大匹配
用通俗的话来讲,假如有几个男的和几个女的存在暧昧关系,其中有多个男的和多个女的存在暧昧关系也有多个 女的和多个男的存在暧昧关系,比如喜羊羊和美羊羊、红太狼存在暧昧关系,美羊羊和沸羊羊、喜羊羊存在暧昧关系,等等,让你找最多的配对数,也就是让你找最多的1v1的关系。

struct augment_path {
  vector<vector<int> > g;
  vector<int> pa;  // 匹配
  vector<int> pb;
  vector<int> vis;  // 访问
  int n, m;         // 两个点集中的顶点数量
  int dfn;          // 时间戳记
  int res;          // 匹配数

  augment_path(int _n, int _m) : n(_n), m(_m) {
    assert(0 <= n && 0 <= m);
    pa = vector<int>(n, -1);
    pb = vector<int>(m, -1);
    vis = vector<int>(n);
    g.resize(n);
    res = 0;
    dfn = 0;
  }

  void add(int from, int to) {
    assert(0 <= from && from < n && 0 <= to && to < m);
    g[from].push_back(to);
  }

  bool dfs(int v) {
    vis[v] = dfn;
    for (int u : g[v]) {
      if (pb[u] == -1) {
        pb[u] = v;
        pa[v] = u;
        return true;
      }
    }
    for (int u : g[v]) {
      if (vis[pb[u]] != dfn && dfs(pb[u])) {
        pa[v] = u;
        pb[u] = v;
        return true;
      }
    }
    return false;
  }

  int solve() {
    while (true) {
      dfn++;
      int cnt = 0;
      for (int i = 0; i < n; i++) {
        if (pa[i] == -1 && dfs(i)) {
          cnt++;
        }
      }
      if (cnt == 0) {
        break;
      }
      res += cnt;
    }
    return res;
  }
};

把点放进去具体实现需要以下几步

augment_path ans(n,n);//初始化这个
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
             ans.add(i,j);//根据题意去放点
        }
    }
    cout<<ans.solve()<<endl;

2.单调栈的使用
顾名思义,就是栈里存单调递增或单调递减的数。
具体的作用:可以用来找一个数左边第一个大于或第一个小于该数的数

while(st.size()&&st.top()<x)
	{
		st.pop();
	}
	st.push(x);

例题可以参考 区区区间间间

3.初步学习了01背包
模型大概就是,有一个容量为N的背包,有多个物品各自的体积为\(vi\),各自的价值为 \(wi\),然后要求你得出放入的总价值最大是多少。

#include<bits/stdc++.h>

using namespace std;

const int MAXN = 1005;
int v[MAXN];    // 体积
int w[MAXN];    // 价值 
int f[MAXN][MAXN];  // f[i][j], j体积下前i个物品的最大价值 

int main()
{
    int n,m; cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j<v[i]) f[i][j]=f[i-1][j];
            else{
                f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);    

            }
        }
    }
    cout<<f[n][m];
    
}

4.巧用multiset来做一些维护最大值或最小值的题
比如这一题就是用双指针和multiset来找字符串区间最小的字符
B - Reserve or Reverse

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
typedef pair<char,int>pci;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};


signed main()
{
     ios::sync_with_stdio(0),cin.tie(0);
    int n; cin>>n;
    string s; cin>>s;
    multiset<char>se;
    for(int i=0;i<n;i++) se.insert(s[i]);
    
    int l=0,r=n-1;
    while(l<r)
    {
        //先检查一下s【l】是不是l-r这段区间的最小字母
        //如果不是,找一个离r最近的并且最小的字母与之交换
        if(s[l]!=*se.begin())
        {
            while(s[r]!=*se.begin()){//如果不是就从set里删掉,维护区间最小字母
                se.erase(se.find(s[r]));//每一次移动都要记得更新区间,达到维护区间最小的目的
                r--;
            }
            swap(s[l],s[r]);
            se.erase(se.find(s[l]));
            l++;
            se.erase(se.find(s[r]));
            r--;
        }else{ 
            se.erase(se.find(s[l]));
            l++;
        }
    }
    cout<<s<<endl;
    
    
    return 0;
}

最后其实这周还有很多题没补完,因为题单总也是要刷完的,所以只能慢慢去补了。

标签:vector,int,cin,暧昧关系,第二周,MAXN,暑假,周报,define
From: https://www.cnblogs.com/swjswjswj/p/18314723

相关文章

  • 暑假集训CSP提高模拟4
    A.WhiteandBlack暴力的\(O(nq)\)做法比较显然,因为对于根节点来说,只有它自己可以改变自己的颜色,因此如果它是黑色则一定需要更改自己,同时把更改传下去(应该没有那种每次真的更改所有节点然后写\(O(nqn^{n})\)的吧),同理,假如根节点更改结束,次级节点就同理了,这是一个连锁的反应,因......
  • 大创项目个人周报(2024.7.15—2024.7.21)
    一、搭建开发环境1.下载AndroidStudio2.运行第一个程序二、入门Kotlin语言1.打印语句的操作,用println()函数funmain(){println("HelloWorld!")}2.变量的定义:在Kotlin中定义变量只有以如下两种方式定义var[变量名称]:[数据类型]val[变量名称]:[数据类型......
  • 暑假集训CSP提高模拟2 & 暑假集训CSP提高模拟3
    暑假集训CSP提高模拟2&暑假集训CSP提高模拟3暑假集训CSP提高模拟2纯纯科普场,打的还行。T1活动投票:摩尔投票板子。T2序列:考虑枚举端点没什么前途,考虑一个点能对多少区间产生贡献。考虑一个点的\(nxt\)和\(pre\)(表示下、上一个和他相同的点),当左端点在\(pre\simi......
  • 大创项目个人周报(24.7.15-24.7.21)
    本周主要利用B站学习Kotlin语言一、完成环境的配置和软件的下载1、开发环境配置安装Java8环境2、IDEA安装与使用熟悉IDEA软件3、熟悉简单代码vara:Int//println("KFCvivo50")二、变量与基本类型1、变量的声明与使用var[变量名称]:[数据类型]例:funmain(......
  • 24-暑假软件工程周报(3)
    本周,我继续深入学习Hadoop和HBase。在上次报告的基础上,我主要集中在HBase的配置和使用方面,并遇到了一些问题,通过查阅资料和调试成功解决了这些问题。1.我学习了HBase的基本概念和架构。HBase是一个基于HadoopHDFS的分布式数据库,专门用于处理大规模数据的随机读写。它通过Zookeep......
  • 第二周总结
    一、阅读第二周我阅读了《大道至简》第二章的内容,第二章主要讲了勤奋的人与懒惰的人在方法创新方面的差异,引用了《李冰凿山》的故事,通过“积薪烧之”的方式与第一章愚公“碎石击壤”形成对比,突出了本章的主题。愚公是典型的勤奋者的身份,但工作缺乏动脑,不创新,使得工作费时又费力。......
  • 2024 暑假友谊赛 2
    2024暑假友谊赛2A-......
  • 暑假集训csp提高模拟3
    赛时rank20,T10,T245,T320,T495T1粘了两遍(因为OJ卡第一次没有显示出来)CE了,挂了100,T4没卡常挂了5汤碗了!!!!!!!!!!!!!!!T1abc猜想对于任意整数\(c\)都有\[\left\lfloor\frac{a}{b}\right\rfloor+c=\left\lfloor\frac{a}{b}+c\right\rfloor=\left\lfloor\frac{a+bc}{b}\right\rf......
  • AI周报(7.14-7.20)
    AI应用-本届欧洲杯的AI技术应用    卢卡库在两场比赛中共有三次庆祝进球的情况,但遗憾的是这三次庆祝均未能转化为有效的进球。这种“吐饼王”的表现也让他成为了本届欧洲杯的一个另类焦点人物。虽然稍显悲情,但有了AI的深度应用,即使这样极端的情况也少了很多判罚不公的......
  • 暑假集训记录
    这里记一些从7.15开始做的NOI篇或者让人眼前一亮的题目/trick。(哦,前面的题可能忘了某些细节了。)P3452求补图连通块个数。P4555首先看到回文串,先上马拉车。然后发现马拉车双回文不好做,考虑拆成两部分。大概就是维护一个以\(i\)为左端点/右端点的最长回文串。然后......