A. Abstract Picture

题意:一个n*n的网格图,每行每列各涂一次,每行每列均有26种涂法,输出涂色方案。

思路:比赛的时候一直想着如何建图,导致最后也没想出来。其实只需要观察到,最后涂的行或列,一定只有一个元素。因此开一个结构体记录每行每列,各个颜色的涂色情况,以及该行或列一共有几种不同的颜色。然后类似于跑拓扑排序,将只有一种颜色的行列加入队列,再依次撤销。将新的颜色数变为1的行列加入队列,即可完成本题。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x) cout << "x: " << x << endl;
#define LOG2(x,y) cout << "x: " << x << ", y: " << y << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 3000+100;int n;
char mp[N][N];
struct Node{int total;int num[30];
}t[2*N];
int ans[2*N][4],tot;
int vis[2*N];void solve()
{tot = 0;queue<int> q;while(q.size()) q.pop();rep(i,1,n*2) {if(t[i].total == 1) q.push(i);else if(t[i].total == 0) ans[++tot][1] = i, ans[tot][2] = 0, vis[i] = 1;}while(q.size()){int x = q.front();q.pop();if(vis[x]) continue;// printf("x:%d\n",x);t[x].total = 0;ans[++tot][1] = x;vis[x] = 1;rep(i,0,27)if(t[x].num[i] >= 1) ans[tot][2] = i;int pp = ans[tot][2];// printf("pp:%d\n",pp);if(x <= n){rep(i,n+1,n*2){if(mp[x][i-n]-'a' != pp) continue;t[i].num[pp]--;if(t[i].num[pp] == 0){t[i].total--;if(t[i].total == 1) q.push(i);} }}else{rep(i,1,n){if(mp[i][x-n]-'a' != pp) continue;t[i].num[pp]--;if(t[i].num[pp] == 0){t[i].total--;   if(t[i].total == 1) q.push(i);} }}}// printf("%d\n",tot);for(int i = 2*n; i >= 1; i--){int x = ans[i][1], y = ans[i][2];if(x <= n) printf("h %d ",x);else printf("v %d ",x-n);printf("%c\n",'a'+y);}
}int main()
{scanf("%d",&n);rep(i,1,n) scanf("%s",mp[i]+1);rep(i,1,n)rep(j,1,n){if(mp[i][j] == '?') continue;int x = mp[i][j]-'a';t[i].num[x]++;if(t[i].num[x] == 1) t[i].total++;t[j+n].num[x]++;if(t[j+n].num[x] == 1) t[j+n].total++;}solve();return 0;
}/*
4
bcmf
ecmf
ppmf
lllf
*/

H.Hierarchy

题意:一道模拟题,大致模拟公司中的人员流动,然后需要排序。

思路:用set维护一下整个公司以及各个部门的情况,就可以完成此题。此处需要回忆一下set的find、erase、insert等函数。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <set>
#include <map>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x) cout << "x: " << x << endl;
#define LOG2(x,y) cout << "x: " << x << ", y: " << y << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 1e5+1000;int n;
struct Person{int id,dd,mm,yy;  //depart中编号、出生年月int from;   //depart编号char s[20];bool operator < (Person xx) const{if(yy != xx.yy) return yy < xx.yy;else if(mm != xx.mm) return mm < xx.mm;else if(dd != xx.dd) return dd < xx.dd;else if(from != xx.from) return from < xx.from;else return id < xx.id;}bool operator == (Person xx) const{if(id == xx.id && dd == xx.dd && yy == xx.yy && mm == xx.mm && from == xx.from) return true;else return false;}
}P[N];
map<int,int> mp; //mp[x] = [y],编号为x的depart存在y数组中
map<pair<int,int>,int > mpp; //mpp[x][y], 编号为x的depart的第y个人
set<Person> st[N];    //st[i]表示第i个depart, 维护head
set<Person> total;    //存着整个office的所有人, 维护head
int numm[N];    //numm[x]表示编号为x的depart一共有几次arrivalint main()
{int tot = 0;  //维护公司序号int tot1 = 0;  //维护person序号scanf("%d",&n); int jud;mp.clear(); mpp.clear(); total.clear();rep(i,1,n) st[i].clear();rep(i,1,n){scanf("%d",&jud);if(jud == 1){tot1++;int pos1, dd, mm, yy, dpos;scanf("%d",&pos1);scanf("%s",P[tot1].s);scanf("%d:%d:%d",&dd,&mm,&yy);if(mp[pos1] == 0) mp[pos1] = ++tot, dpos = tot;else dpos = mp[pos1];P[tot1].dd = dd, P[tot1].mm = mm, P[tot1].yy= yy, P[tot1].from = dpos;numm[dpos]++;P[tot1].id = numm[dpos];// printf("dpos:%d, tot1:%d, id:%d\n",dpos,tot1,P[tot1].id);total.insert(P[tot1]);st[dpos].insert(P[tot1]);mpp[make_pair(dpos,P[tot1].id)] = tot1;if(total.size() == 0) printf("Vacant");else printf("%s",total.begin()->s);if(st[dpos].size() == 0) printf(" Vacant\n");else printf(" %s\n",st[dpos].begin()->s);}else{set<Person>::iterator iter;int D,K;scanf("%d%d",&D,&K);D = mp[D];int hp = mpp[make_pair(D,K)];// printf("hp:%d\n",hp);iter = st[D].find(P[hp]);st[D].erase(iter);iter = total.find(P[hp]);total.erase(iter);if(total.size() == 0) printf("Vacant");else printf("%s",total.begin()->s);if(st[D].size() == 0) printf(" Vacant\n");else printf(" %s\n",st[D].begin()->s);}}return 0;
}

J. Judgement

题意:一个比赛有 n 个裁判,每个裁判有一个权值 ai,并且给出通过或不通过。有一个判断值 p,若所有给出通过的裁判的权值和大于等于 p,那么整体就算通过。给出第二组裁判,权值为 bi,判断值为 q,判断所有 2^n 种判断下这两组给出的结果是否完全相同,如果不相同,给出一种不相同的情况。

思路:比赛的时候完全没思路,一个劲的贪心...赛后才知道这题其实是个dp,dp[i][j]表示前 i 个人,序列a中选的人的值到达 j 的所有情况中,序列b中对应人的权值之和的最大值。因此当dp[i][j] >= q,而 j < p时,即是错误的情况。然后再判断一遍b序列即可。此处还有一个地方,记错误方案时如果是用pre数组不断回溯的话,会T。正确做法是对于每个dp[j]记一个bitset的状态,检查出错误后,直接输出即可。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <bitset>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 200;
const int M = 1e6+1000;int n,a[N],b[N],dp[M],am,bm,tp[M],ans[N];
//dp[i]表示a组中,价值为i的所有组合中,b组最大价值的一组
bitset<110> base1[M],base2[M];void solve()
{rep(i,1,n) ans[i] = 0;rep(i,1,n){for(int j = am-1; j >= a[i]; j--){if(j == a[i]){if(dp[j] < b[i]) dp[j] = b[i], base1[j].reset(),base1[j].set(i);}if(dp[j] < dp[j-a[i]]+b[i] && dp[j-a[i]]!=0){dp[j] = dp[j-a[i]]+b[i];base1[j] = base1[j-a[i]];base1[j].set(i);}if(dp[j] >= bm){printf("NO\n");rep(i,1,n) printf("%d",(int)base1[j][i]);printf("\n");return;} }}rep(i,1,n){for(int j = bm-1; j >= 1; j--){if(j == b[i]){if(tp[j] < a[i]) tp[j] = a[i], base2[j].reset(),base2[j].set(i);} if(j < b[i]) continue;if(tp[j] < tp[j-b[i]]+a[i] && tp[j-b[i]]!=0){tp[j] = tp[j-b[i]]+a[i];base2[j] = base2[j-b[i]];base2[j].set(i);}if(tp[j] >= am){printf("NO\n");rep(i,1,n) printf("%d",(int)base2[j][i]);return;} }}printf("YES\n");
}int main()
{scanf("%d",&n);scanf("%d",&am);rep(i,1,n) scanf("%d",&a[i]);scanf("%d",&bm);rep(i,1,n) scanf("%d",&b[i]);solve();return 0;
}/*
1
15 13
20 19
*/

【 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2】题目总结相关推荐

  1. 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2

    地址 Rank Solved A B C D E F G H I J K L M 72/213 8/13 O . O O . O . O O O . O Ø O: 当场通过 Ø: 赛后通过 .: 尚未 ...

  2. XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...

  3. 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)

    题目链接 C. Brave Seekers of Unicorns 给出一个好数组的定义: 1.1.1. 长度不为空 2.2.2. a[i]⨁a[i−1]⨁a[i−2]≠0a[i] \bigoplus ...

  4. [XXII Open Cup, Grand Prix of Korea M]Yet Another Range Query Problem

    Yet Another Range Query Problem 题解 首先,看到这道题,我们应该是比较容易联想到扫描线加线段树的. 我们考虑维护每个点作为左端点到当前扫到的这个点作为右端点之间区间的信 ...

  5. G-Lexicographically Minimum Walk[CF-Gym-102391][2019-2020 XX Open Cup, Grand Prix of Korea]

    原题传送门 题面 Lexicographically Minimum Walk time limit per test2 secondsmemory limit per test1024 megaby ...

  6. [XXI Open Cup.Grand Prix of Korea]Advertisement Matching

    Advertisement Matching 题解 首先,题目的 a , b a,b a,b匹配显然是一个很常见的贪心. 有结论,设 a a a的集合为 A A A,如果 ∀ S ⊆ A , ∑ a ...

  7. 2020-2021 ACM-ICPC, Asia Nanjing Regional Contest (XXI Open Cup, Grand Prix of Nanjing)

    M. Monster Hunter 树形背包dp dp[i][j][k] 表示结点i的子树中有j个节点存活且当前节点i的状态为(0/1) 转移方程: dp[x][i+j][0]=min(dp[x][i ...

  8. [XXI Open Cup,Grand Prix of Tokyo]Ascending Matrix

    Ascending Matrix 题解 首先,这道题是要求所有的数列是从上往下,从左往右,都是递增的. 首先从左往右递增,我们可以去考虑它的差分序列,每个点的值就是它前面差分序列的点数嘛. 从上往下递 ...

  9. 五年级计算机学情分析,2015—2016学年小学五年级信息技术上册教学计划

    一.指导思想 以教育部<中小学信息技术课程指导纲要>为指导.培养学生对信息技术的兴趣和意识,让学生了解和掌握信息技术基本知识和技能,了解信息技术的发展及其应用对人类日常生活和科学技术的深刻 ...

  10. LSGO软件技术团队2015~2016学年第十七周(1221~1227)总结

    团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统:研究方向为大数据处理与机器学习.成立几年来为学校培养了一批 ...

最新文章

  1. perl 编程 - 判断系统进程是否活着的方法
  2. 管理类业务系统菜单部分美化经验分享,把所有好的东西拿过来拼凑并不容易能形成整体的效果...
  3. 网络爬虫---json编码和解码
  4. 【AutoML】强化学习如何用于模型蒸馏?
  5. Windows 系统中常见的 Shell 命令总结(不时补充)
  6. 从PRISM开始学WPF(九)交互Interaction?
  7. WGS84 坐标系转到J2000坐标系
  8. windows环境下使用bitvise搭建ssh server
  9. 请客必备:【转】100元以内南宁市有特色的餐馆
  10. JNCIS-SP学习指南卷1 第一章:协议无关的路由
  11. 如何在 HTML 中调整图像大小?
  12. win7开不了机按f8修复计算机没反应,win7开不了机按f8没用怎么办
  13. Eclipse4.6(neno)手动配置Tomcat插件
  14. MySQL不小心按到ctrl_凌晨两点,不小心按下了Ctrl键,结果这样了……
  15. chapter 2 古典密码技术
  16. CentOS8(8.2)安装mysql8
  17. win10 kms激活
  18. 深入Python进程间通信原理
  19. Wide-Bandgap宽禁带(WBG)器件(如GaN和SiC)市场将何去何从?
  20. 托业考试要准备什么资料【zhasite】

热门文章

  1. indexOf 和 lastIndexOf 使用
  2. 交出20分钟后就得到面试通知的一份答卷
  3. XP SP3多数功能借鉴Vista 安装将无需密码
  4. linux查看db2表空间大小,db2怎么列出当前数据库下全部表占用空间的大小
  5. java模板引擎哪个好_浅谈Java模板引擎性能对比
  6. plsql登录空白框_王者荣耀空白居中以及重复名的教程[含软件]
  7. 系统运维方案_传统运维 VS 互联网运维 框架体系大观
  8. OpenCV-特征提取与检测(04、亚像素级别角点检测)
  9. 服务器webpack构建性能,webpack构建和性能优化探索
  10. 求两个等长升序序列的中位数