【第四场省赛组队赛训练补题】ZOJ
来源:互联网 发布:打击乐器软件 编辑:程序博客网 时间:2024/06/08 20:12
题意:
每个人有S,B两个值,如果第i和第j个人满足 Si <= Sj && Bi >= Bj 或者 Si >= Sj && Bi <= Bj 则这两个人互相讨厌。
即Si < Sj && Bi < Bj时两人不存在互相讨厌的关系,求可以不互相讨厌的人的最大个数,并输出他们的编号。
比赛时想到是最长单调递增子序列的二分写法,当时就想着按S排下序,在找满足Si < Sj && Bi < Bj的最长序列,当时不知道怎么打印路径,调试了很久,测了几组样例过了就交了结果wa,后来就去看另一个过的比较多的题了。赛后发现就是求最长单调递增子序列。已经按S来排序了 就不用管左边S了,只用求B的最长单调递增子序列。排序时如果S相同B从大到小排 (例如 1 2和1 1 从大到小才可以保证是严格Si < Sj && Bi < Bj的关系),用数组记录下到每个位置的最长单增子序列的最长长度,最后倒着打印路径。
CODE:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct aa{ int s,b,id;}a[100005];int cmp(aa x,aa y ){ return x.s<y.s||(x.s==y.s&&x.b>y.b);}int dp[100005],ans[100005];//ans记录前i个数的最长递增子序列的长度int main(){ int n,T,t=0; scanf("%d",&T); while(~scanf("%d",&n)) { if(t++) printf("\n"); memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].s,&a[i].b); a[i].id=i; } sort(a+1,a+n+1,cmp); int len=0; dp[++len]=a[1].b; ans[1]=len; //二分方法求最长递增子序列 for(int i=2;i<=n;i++) { if(dp[len]<a[i].b) { dp[++len]=a[i].b; ans[i]=len; } else { int pos=lower_bound(dp+1,dp+len+1,a[i].b)-dp; dp[pos]=a[i].b; ans[i]=pos; } } printf("%d\n",len); int k=0; for(int i=n;i>=1;i--) { if(ans[i]==len)//根据长度输出最长路径 { if(k) printf(" "); printf("%d",a[i].id); len--; k++; } } printf("\n"); }}
0 0
- 【第四场省赛组队赛训练补题】ZOJ
- 2017组队训练 ZOJ
- 2013第一次组队训练赛
- 2017组队训练赛11
- 130804组队练习赛ZOJ校赛
- 2014.4.16 第二次组队训练赛
- 5.24 省赛组队训练(1)
- 2016省赛第一次组队训练总结
- 2017省组队训练 zoj 3385Hanami Party (贪心+栈优化)
- OUC_2014 Spring Training 省赛组队训练赛 #1总结
- 第三周组队训练赛-长沙现场赛解题报告
- 2013-8-14大一大二暑期组队训练赛
- nefu《2015综合训练9组队赛》解题报告
- nefu2015综合训练9组队赛解题报告
- 2017、5、13日省赛前组队训练赛。
- SDUT 2017 春夏组队训练赛3
- Is Derek lying?-2017 暑期组队训练赛1-HDU-
- 2017年暑假组队训练赛-No.2 F
- Servlet_12th_Application
- 退出清空session
- (转)趋势因子:利用投资期内所有信息的获利方法
- 地图功能的简易实现
- C Sharp入门——值类型
- 【第四场省赛组队赛训练补题】ZOJ
- Docker的安装配置及使用详解
- 用 WebBroker 做一个类似 PHP 的Web脚本解释器
- 如何搭建自己的Shadow socks服务器。
- 悼念512汶川大地震遇难同胞
- 第九届河南省省赛题目部分题解
- 文章标题
- 范式分解
- Xcode常用目录