Nordic Collegiate Programming Contest 2016
A Artwork
输入:
n,m表示原图为n*m个白色方格,输入x1,y1,x2,y2表示将x1,y1,x2,y2涂为黑色。
输出:
对于每个x1,y1,x2,y2输入当前图案白色联通块的数目。
思路:
先维护得到最后图案的形状,包括每个黑色方块的厚度。
对于每个x1,y1,x2,y2倒序访问,将其对应位置的黑色还原为白色。通过上下左右的联通关系,更新并查集得到每组的答案。
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<bits/stdc++.h> using namespace std; struct sc {int a,b,c,d; } edg[10010]; int p[1100100],g[1010][1010],ans[10010]; int dx[]= {0,1,-1,0}; int dy[]= {1,0,0,-1}; int n,m,q,cnt=0,k=0; int f(int x) {return x==p[x]?x:p[x]=f(p[x]); } void u(int a,int b) {int x=f(a),y=f(b);p[x]=y; } int id(int x,int y) {return x*(m+2)+y+1; } int main() {scanf("%d %d %d",&n,&m,&q);memset(g,0,sizeof g);for(int i=0; i<=n+1; i++)for(int j=0; j<=m+1; j++){p[id(i,j)]=id(i,j);if(!i||!j|i>n||j>m)g[i][j]=1;}for(int i=0; i<q; i++){int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);for(int k=a; k<=c; k++)for(int j=b; j<=d; j++)g[k][j]++;edg[i]= {a,b,c,d};}for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)if(!g[i][j])for(int l=0; l<4; l++)if(!g[i+dx[l]][j+dy[l]])u(id(i+dx[l],j+dy[l]),id(i,j));for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)if(id(i,j)==f(id(i,j))&&!g[i][j])cnt++;while(q--){int a=edg[q].a,b=edg[q].b,c=edg[q].c,d=edg[q].d;ans[k++]=cnt;for(int i=a; i<=c; i++)for(int j=b; j<=d; j++){g[i][j]--;if(!g[i][j]){cnt++;for(int l=0; l<4; l++){int x=i+dx[l],y=j+dy[l];if(!g[x][y]&&f(id(x,y))!=f(id(i,j))){u(id(i,j),id(x,y));cnt--;}}}}}for(int i=k-1; i>=0; i--)printf("%d\n",ans[i]); }
View Code
反思:
场上心里闪过并查集的念头,但是只想到了对于黑色进行并查集,没有从一个角度看问题,比如反过来看,看答案的对应面,比如补集,或者倒着获得答案。
数组开小了, 应该算清楚每个数组的范围。
B Bless You Autocorrect!
输入:
n,m表示下面有n,m个串,n表示手机里的字典词按照出现的顺序表示优先级,m表示你想输入的单词。
输出:
对于每个你想输入的单词,输出最小打出它需要的按键次数。
思路:
用字典树来存储单词,字典树(树上的每一个串的子串都会有一个id),通过这些id和每个串每打一个按键可以得到的另外一个串建立双向边。
跑一遍bfs即可获得每个串可以打出需要的最小按键数量。
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<bits/stdc++.h> using namespace std; const int maxn=1e6; char s[maxn]; int tot=0,tree[30][maxn],edg=0,head[maxn],dp[maxn],cnt[maxn],vis[maxn]; struct sc {int to,nxt; }p[6*maxn]; void add(int a,int b) {p[edg]={b,head[a]},head[a]=edg++; } void inser() {int l=strlen(s),nxt=0;for(int i=0;i<l;i++){int id=s[i]-'a';if(!tree[id][nxt])tree[id][nxt]=++tot;add(nxt,tree[id][nxt]);add(tree[id][nxt],nxt);nxt=tree[id][nxt];cnt[nxt]++;}int en=nxt;nxt=0;for(int i=0;i<l-1;i++){int id=s[i]-'a';if(cnt[tree[id][nxt]]==1)add(tree[id][nxt],en);nxt=tree[id][nxt];} } void bfs() {memset(dp,0x3f,sizeof dp);dp[0]=0;vis[0]=1;queue<int>q;for(q.push(0);!q.empty();q.pop()){int v=q.front();for(int i=head[v];~i;i=p[i].nxt){int u=p[i].to;if(!vis[u]){vis[u]++;dp[u]=dp[v]+1;q.push(u);}}} } int ans() {int l=strlen(s),mi=l,nxt=0,u;for(int i=0;i<l;i++){int id=s[i]-'a';if(tree[id][nxt])mi=min(dp[tree[id][nxt]]+l-1-i,mi);else break;nxt=tree[id][nxt];}return mi; } int main() {//freopen("i.txt","r",stdin);//freopen("o.txt","w",stdin);memset(tree,0,sizeof tree);memset(head,-1,sizeof head);int n,m;scanf("%d %d",&n,&m);for(int i=0;i<n;i++){scanf("%s",s);inser();}bfs();for(int i=0;i<m;i++){scanf("%s",s);printf("%d\n",ans());} }
View Code
反思:
这道题对于每个状态的互相转移关系,可以看作类似最短路,需要一点点思维吧(是不是可以用map映射id来做这道题呢)。
C Card Hand Sorting
输入:
扑克牌的花色和点数。
输出:
相同花色放在一起且牌成递增或者递减,最小需要的操作数。
思路:
扑克牌最后形成的结果只有1<<4*4的全排列中,枚举之
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<bits/stdc++.h> using namespace std; pair<int,int>s[200]; int spoke[5][20],cnt[5],vis[5],p[5],n,lis[60],ans=0x3f3f3f3f; map<char,int>m; map<pair<int,int>,int>mm; void init() {m['s']=0,m['h']=1,m['d']=2,m['c']=3;m['T']=10,m['J']=11,m['Q']=12,m['K']=13,m['A']=14;memset(spoke,0,sizeof spoke);memset(cnt,0,sizeof cnt);memset(vis,0,sizeof vis);for(int i=2; i<=9; i++)m['0'+i]=i; } bool cmp(int a,int b) {return a>b; } void dfs(int inde) {if(inde==4){for(int i=0;i<16;i++){for(int j=0;j<4;j++)sort(spoke[j],spoke[j]+cnt[j]);for(int j=0;j<4;j++)if((1<<j)&i)sort(spoke[j],spoke[j]+cnt[j],cmp);mm.clear();int k=0,ll=0,haha=0;for(int j=0;j<4;j++){int tem=p[j];for(int l=0;l<cnt[tem];l++)mm[{spoke[tem][l],tem}]=k++;}memset(lis,0x3f,sizeof lis);for(int j=0;j<n;j++){ll=lower_bound(lis,lis+haha,mm[s[j]])-lis;haha=max(ll+1,haha);lis[ll]=mm[s[j]];}ans=min(n-haha,ans);}}for(int i=0;i<4;i++){if(!vis[i]){vis[i]++;p[inde]=i;dfs(inde+1);vis[i]=0;}} } int main() {init();scanf("%d ",&n);for(int i=0; i<n; i++){char a,b;scanf("%c%c ",&a,&b);int inde=m[b];s[i]={m[a],inde};spoke[inde][cnt[inde]++]=m[a];}dfs(0);cout<<ans<<endl; }
View Code
反思:
场上的时候一直在想怎么直接的贪心思路,对于答案情况很少的题可以直接枚举之。
D Daydreaming Stockbroker
思维,水题
E Exponial
数学,没补
F Fleecing the Raffle
推公式,水题
G Game Rank
模拟,水题
H Highest Tower
输入:
n个矩形的长宽
输出:
严格递减落成塔形,塔的最高高度
思路:
建树,出为底,入为高,出读最多的为1,(deg-1)是他最为高出现的次数,(deg-1)*h为他对于答案的贡献,如果图案是一个树,那么可以选择一个最大的点作为根节点,得到的答案最大,如果图案是一个图,那么形成的关系是唯一的直接计算即可。
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<bits/stdc++.h> using namespace std; const int axn=550000+10; struct sc {int to,nxt; } p[2*axn]; int head[2*axn],edg=0,id=1,deg[axn],fm[axn],vis[axn],maxn; long long ans=0,degg; map<int,int>m; void add(int a,int b) {deg[a]++,deg[b]++;p[edg]= {b,head[a]},head[a]=edg++;p[edg]= {a,head[b]},head[b]=edg++; } void dfs(int u) {if(vis[u])return ;vis[u]=1;degg+=deg[u]-2;maxn=max(maxn,fm[u]);ans+=(long long)(deg[u]-1)*fm[u];for(int i=head[u];~i;i=p[i].nxt)dfs(p[i].to); } int main() {memset(vis,0,sizeof vis);memset(head,-1,sizeof head);//freopen("i.txt","r",stdin);//freopen("o.txt","w",stdout);int n,x,y;scanf("%d",&n);for(int i=0; i<n; i++){scanf("%d %d",&x,&y);if(!m[x])m[x]=id,fm[id++]=x;if(!m[y])m[y]=id,fm[id++]=y;add(m[x],m[y]);}for(int i=1;i<id;i++){maxn=0,degg=0;dfs(i);if(degg<0)ans+=maxn;}cout<<ans<<endl; }
View Code
反思:
对于涉及矩形长宽的题,思考能否把边看成点建图解决。
I Interception
没补
J Jumbled Compass
思维,水题。
K Keeping the Dogs Apart
蓝书有板子,还没研究。
转载于:https://www.cnblogs.com/ncc62497/p/9809962.html
Nordic Collegiate Programming Contest 2016相关推荐
- 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解
2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016) A - Artwork 题目描述: 给定N*M的网格,给出Q次 ...
- Nordic Collegiate Programming Contest 2017 题解
前几天打了一场外国人的比赛,感觉那边的题目质量还是很好的,区分度很鲜明,题目没有国内的难,坑点比较少,比较注重思维,基础算法. B题: Best Relay Team Picture by Ferna ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...
- Nordic Collegiate Programming Contest (NCPC) 2016
A Artwork B Bless You Autocorrect! C Card Hand Sorting D Daydreaming Stockbroker 贪心,低买高卖,不要爆int. #in ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做.就没看. 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意: ...
- 2016 China Collegiate Programming Contest Final
2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...
- 2015 HIAST Collegiate Programming Contest J
Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...
- (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...
- 2018 German Collegiate Programming Contest (GCPC 18)
2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...
最新文章
- 号召一下,看有多少人能响应!
- 完美日记的微服务实践和优化思路
- oracle 32位和64位的问题
- 易语言单窗口单ip软件源码_游戏工作室如何防封?游戏账号和IP被封的解决方法...
- 如何在 Outlook 中使用外出时的助理程序
- 浅谈微信小程序对于房地产行业的影响
- android studio 库工程,Android Studio 添加已有工程方法
- Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索
- ubuntu 17.10.1 安装 virtual box 增强工具
- 国二考试c语言考场能炒么,国2考试题_计算机国二office高级应用考试的题目是从题库20套里抽其中一套还是别的题目_淘题吧...
- 博图如何上载wincc程序_博图导入触摸屏程序 如何通过博图下载触摸屏程序
- 5大输入法突然下架!得知真相的网友懵了:我都用了10年了……
- 网页嵌入媒体播放器代码 选择自 murky 的 Blog
- 如何用计算机播放高保真音乐,Marantz(马兰士)NA8005数字音乐流媒体播放机 各种音乐播放与操作方法详解...
- 二、H5全景图-朋友圈全景图-720°全景-VR ---- 项目简单分析
- 瑞克斯平台国际时事汇总
- 只有自我负责,才能真正增长自己的力量
- IE6中float元素双倍margin问题
- python数字组合_将数字组合在一起形成多个数字的编号
- 如何清理占用计算机内存,电脑内存不足怎么清理
热门文章
- NGINX api网关(mark 有空填坑)
- java - rest-assured 接口测试
- Spring boot中如何获取profiles环境
- 升级的Electric Cloud平台增添了大型机和微服务功能
- [NOI2015Day1]解题报告
- 设计模式(五)学习----装饰模式
- 【实验】简单实时300点采样逻辑
- Q80:平坦着色(Flat Shading)和平滑着色(Smooth Shading)——“Q79:怎么用三角形网格(Triangle Mesh)细分曲面”(补充)
- error: 'NULL' was not declared in this scope
- php+求二分查找递归算法,PHP二分查找(递归和循环)