首页 > 其他分享 >20241016下午

20241016下午

时间:2024-10-17 20:00:46浏览次数:1  
标签:20241016 颜色 int 创建 下午 long last now

P1040 启发式图染色问题(color)

我们可以先想一棵树的情况,如下图所示

image

但是显然这个节点数量是 \(2 ^ k\),我们可以考虑二分图,然后你推着推着就会发现一个建图方案

image

具体来说,我们可以现在左边创建一个颜色为 \(1\) 的结点,然后我们想让颜色数量尽量多,我们直接在右边创建一个颜色为 \(2\) 的结点,并让 \(1\) 连向 \(2\) ,我们又可以在左边创建一个颜色为 \(3\) 的结点, 但是以当前点的颜色数量而言的话,还不足以创建一个颜色为 \(3\) 的点,所以我们可以在右边创建一个颜色为 \(1\) 的点,那么就可以维持了,然后让 \(2, 1\) 向 \(3\) 连边,我们考虑在左边创建一个颜色为 \(4\) 的点,但是还需要在右边创建一个颜色为三的点,而在右边创建一个颜色为 \(3\) 的点又需要在左边创建一个颜色为 \(2\) 的点,以此类推,但是如果我们在右边创建一个颜色为 \(4\) 的点,就只需要在左边创建一个颜色为 \(2\) 的点,所以我们可以果断在右边创建一个颜色为 \(4\) 的点,在左边创建一个颜色为 \(2\) 的点,那么按照这个规律向下推,我们便可以构造出一个颜色为 \(2 \times (k + 2)\) 的图

#include <bits/stdc++.h>

using namespace std;

using Pii = pair<int, int>;

#define int long long

int k, n;

vector<Pii> e;

signed main() {
  freopen("color.in", "r", stdin);
  freopen("color.out", "w", stdout);
  cin >> k;
  n = (2 + k) * 2;
  for (int i = 3; i <= n; i++) {
    for (int j = 1; j < i / 2 * 2; j++) {
      if ((j & 1) ^ (i & 1)) {
        e.push_back({i, j});
      }
    }
  }
  cout << n << " " << e.size() << " 2\n";
  for (int i = 1; i <= n; i++) {
    if (i == n) {
      cout << !(i % 2) + 1;
    }
    else cout << !(i % 2) + 1 << " ";
  }
  cout << "\n";
  for (auto [x, y] : e) {
    cout << x << " " << y << "\n";
  }
  return 0;
}

是的,代码就这么短

自由组队(teamup)

我们可以考虑直接暴搜每个队伍的长度,但是我们要保证长度是非严格递增的,我测试了一下, \(n = 60\) 大概只有 \(1e6\) 种,我们就可以放心大胆的暴搜,每次我们对于每个队伍选人,由于长度是严格递增的我们肯定是先选满足可以加入这个队伍中的 \(r_i\) 小的,所以暴搜加贪心即可

#include<bits/stdc++.h>

using namespace std;

using Pii = pair<long long, int>;

const int N = 100 + 5;

const long long INF = 1e18;

struct node {
  int l, r;
}a[N];

int t, n;

long long w[N], ans;

vector<int> v[N];

map<Pii, long long> dp;

void dfs(long long now, int cnt, int last, long long val) {
  if (dp.count({now, last}) && dp[{now, last}] > val) {
    return ;
  }
  dp[{now, last}] = val;
  if (!now) {
    ans = max(ans, val);
  }
  for (int i = last; i <= n - cnt + 1; i++) {
    long long tmp = now;
    int tot = 0;
    for (auto cur : v[i]) {
      if (tmp & (1ll << (cur - 1))) {
        tmp ^= (1ll << (cur - 1));
        tot++;
      }
      if (tot == i) {
        break;
      }
    }
    if (tot == i) {
      dfs(tmp, cnt + i, i, val + w[i]);
    }
  }
}

bool cmp(node _x, node _y) {
  return _x.l < _y.l;
}

void Solve() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].l >> a[i].r;
  }
  for (int i = 1; i <= n; i++) {
    cin >> w[i];
  }
  sort(a + 1, a + n + 1, cmp);
  for (int i = 1; i <= n; i++) {
    vector<Pii> tmp;
    for (int j = 1; j <= n; j++) {
      if (a[j].l <= i && a[j].r >= i) {
        tmp.push_back({a[j].r, j});
      }
    }
    sort(tmp.begin(), tmp.end());
    for (auto cur : tmp) {
      v[i].push_back(cur.second);
    }
  }
  ans = -INF;
  dfs((1ll << n) - 1, 1, 1, 0);
  if (ans <= -1e17) {
    cout << "impossible\n";
  }
  else cout << ans << "\n";
  for (int i = 1; i <= n; i++) {
    v[i].clear();
  }
  dp.clear();
}

int main(){
  ios::sync_with_stdio(0);
  cin.tie(0);
  freopen("teamup.in", "r", stdin);
  freopen("teamup.out", "w", stdout);
  cin >> t;
  while (t--) {
    Solve();
  }
  return 0;
}
/*
1
3
2 3
1 2
2 2
4 5 100
*/

标签:20241016,颜色,int,创建,下午,long,last,now
From: https://www.cnblogs.com/libohan/p/18472961

相关文章

  • 20241016
    intarr[3]={10,20,30};int*parr=arr;1.*parr、*arr分别代表什么   *(parr+0)==*(arr+0)==10==》取首素值=========================================================================      2.*(parr+1)、*(arr+1)、*parr+1、*arr+1分别......
  • 20241016每日一题洛谷P1115
    普及-洛谷P1115最大子段和读题可知需要在一段一维数组中寻找一段唯一的区间,使区间内的数和最大,即寻找和最大区间可以想到前缀和的算法假设输入数组a[n]则前缀和数组b[n]=b[n-1]+a[n]那么从什么时候开始的一段区间才能使区间内的数和最大?从前缀和数组逐步来判断这一条......
  • 20241016 模板清理
    区间DP-回文字串记\(f[i][j]\)表示把\(s[i\simj]\)变成回文,最少补几个,从\(f[i][j-1],f[i+1][j],f[i+1][j-1]\)三种情况转移过来即可。感性理解一下这样的状态定义是有最优子结构的。区间DP-合唱队肯定可以区间\(dp\),再注意到状态的转移和上一步有关,所......
  • [20241016]Oracle C functions annotations补充.txt
    [20241016]OracleCfunctionsannotations补充.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/Frits......
  • 20241016 模拟赛总结
    期望得分:100+100+55(?)+0=255实际得分:100+100+0+0=200迷迷糊糊睡了好一会才起来打……感觉打的还行,除了T3时间太紧了,有的错误没检查出来挂分了。。T1简单线性DP。\(f_i\)表示前i个数的答案,\(g_i\)有点抽象,先假设当前在\(p\),\(a_p=i\),\(g_i\)表示的是如果\(p\)......
  • 0基础学java之Day06(下午完整版)
       需求1:打印以下图形      ****      ****      ****      for(inti=0;i<3;i++){//控制行数         for(intj=0;j<4;j++){//控制列数            System.out.print("*");//打印一个一个的星号(......
  • 0基础学Java之Day02(下午完整版)
    五、Java的体系划分JavaSE--J2SE--核心版本JavaEE--J2EE--企业版本(做服务器)JavaME--J2ME--微型版本(做移动端--已弃用)学习路线:后端程序员:JavaSE、JavaEE移动端程序员:JavaSE、JavaME-------(已弃用)Android移动端程序员:JavaSE、AndroidSDKIOS移动端程序......
  • Java开发八月七号下午笔试 面试
    SpringBoot有两种配置方式,properties和yml,两种配置方式只是格式上不同,功能是一致的,比如properties:server.port=8080对应的yml:server:port:8080就实际开发而言,yml更简洁一些,但是properties出错率更低一些。2、SpringBoot怎么修改启动时的端口号?(1)、在配置文件中修改端口号:......
  • 2024.9.16下午校测
    T1题目描述有\(n\)个人站成一行,每个人有一个魅力值,相同魅力值的人会形成一个团伙,你出于对于社会和谐发展的考虑,定义一个团伙正常当且仅当团伙人数为\(2\),现在你的任务就是回答\(M\)个询问,每次询问一个区间\([L,R]\),你需要回答这个区间中所有人各自结成团伙后,处于不正常团......
  • 2024.9.16 下午 总结(考 DS)
    T1做法1:莫队。(考虑一个数的出现次数变化时的影响。)应该可以直接做,似乎也可以正难则反(见做法2)。做法2:[扫描线](?)。按询问右端点排序。记一下每个位置前面最近的和它权值相同的位置。一种是直接做,分讨。一种是正难则反:算前缀和;算出现次数为\(2\)的数的贡献之和,减去这部分贡献。......