• 题目链接:

    http://poj.org/problem?id=1094

  • 题目大意(直接从谷歌翻译上复制下来的):

    • 描述

      不同值的递增排序顺序是其中使用某种形式的小于运算符来将元素从最小到最大排序的顺序。例如,排序后的序列A,B,C,D意味着A <B,B <C和C <D.在这个问题中,我们将给出一组形式A <B的关系并要求你确定是否已排序的订单已被指定。

    • 输入

      输入由多个问题实例组成。每个实例都以包含两个正整数n和m的行开始。第一个值表示要排序的对象数量,其中2 <= n <= 26.要排序的对象将是大写字母的前n个字符。第二个值m表示将在此问题实例中给出的形式A <B的关系数目。接下来是m行,每行包含一个由三个字符组成的关系:大写字母,字符“<”和第二个大写字母。没有字母会超出字母表前n个字母的范围。 n = m = 0的值表示输入结束。

    • 输出

      对于每个问题实例,输出由一行组成。这条线应该是以下三条中的一条:

      xxx关系后确定的排序顺序:yyy ... y。

      分类序列无法确定。

      xxx关系后发现不一致。

      其中xxx是在确定排序序列或发现不一致时的处理关系数,以先到者为准,yyy ... y是已排序的递增序列。

  • 分析:

    很明显一道传递丢包的变式,怎么处理这些恼人的输出呢?虽然《算法竞赛进阶指南》说用二分,但我个人认为用倍增更好。

    首先我们用\(f[x][y]\)表示\(x>y\)的关系,然后使用倍增。

    当\(check()==1\)时说明可以判断出关系,缩短倍增长度

    当\(check()==2\)时说明矛盾,同样缩短长度

    当\(check()==0\)时说明判断不了全部关系,增大长度

    首先如果\(check(m)==0\)说明Sorted sequence cannot be determined.

    然后按照常规思维写就好了

    如果不知道常规思维怎么写就看我另一篇关于传递丢包的博客吧

  • 吐槽:

    • 辣鸡Dev Cpp

      玄学原因一直过不了样例,最后在在线IDE上一遍就过了,害我调了那么久。

    • 最近文化课压力大,好久没做OI题,感觉手感思维都有些生疏,码风比较乱。数学圆锥曲线毁我青春,作业真难做

  • 代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cstring>
using namespace std;
const int maxn=29;
int f[maxn][maxn];
int ans[maxn];
int N,n,m;
struct Relation{
int x,y;
bool bigger;
}rel[19260817];
char tmp[15];
int check(int len){
memset(ans,0,sizeof(ans));
memset(f,0,sizeof(f));
for(register int i=1;i<=len;i++){
if(rel[i].bigger){
f[rel[i].x][rel[i].y]=1;
}
else{
f[rel[i].y][rel[i].x]=1;
}
}
/* for(register int i=0;i<n;i++){
for(register int j=0;j<n;j++)printf("%d",f[i][j]);
puts("");
}*/
for(register int k=0;k<n;k++){
for(register int i=0;i<n;i++){
for(register int j=0;j<n;j++){
if(i==j)continue;
f[i][j]|=f[i][k]&f[k][j];
}
}
}
int res=1;
for(register int i=0;i<n;i++){
int cnt=0;
for(register int j=0;j<n;j++){
if(i==j)continue;
if(f[i][j]&&!f[j][i]){
cnt++;
}
else if(f[i][j]&&f[j][i]){
res=2;//return 2;
}
else if(!f[i][j]&&!f[j][i]){
if(res!=2)res=0;//return 0;
}
}
if(res==2)return 2;
ans[cnt+1]=i;
}
return res;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF&&(n||m)){
for(register int i=1;i<=m;i++){
scanf("%s",tmp);
int x=tmp[0]-'A',y=tmp[2]-'A';
rel[i].x=x,rel[i].y=y;
if(tmp[1]=='>'){
rel[i].bigger=1;
}
else rel[i].bigger=0;
}
if(!check(m)){
puts("Sorted sequence cannot be determined.");
continue;
}
int k=0,p=1,flag;
while(p!=0){
flag=check(k+p);
if(!flag){
k+=p;
p=p<<1;
}
else{
p=p>>1;
}
while(k+p>m)p=p>>1;
}
k++;
if(flag==1){//
printf("Sorted sequence determined after %d relations: ",k);
for(register int i=1;i<=n;i++){printf("%c",ans[i]+'A');}
puts(".");
}
else if(flag==2){//mao dun
printf("Inconsistency found after %d relations.\n",k);
}
}
return 0;
}

POJ题解Sorting It All Out-传递丢包+倍增的更多相关文章

  1. luogu题解 P2419 【牛大赛Cow Contest】传递丢包

    题目链接: https://www.luogu.org/problemnew/show/P2419 分析: "在交际网络中,给定若干元素和若干对二元关系,且关系具有传递性. 通过传递性推导出 ...

  2. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

  3. 拓扑排序 POJ 1049 Sorting It All Out

    题目传送门 /* 拓扑排序裸题:有三种情况: 1. 输入时发现与之前的矛盾,Inconsistency 2. 拓扑排序后,没有n个点(先判断cnt,即使一些点没有边连通,也应该是n,此时错误是有环): ...

  4. Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

    本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID ...

  5. ethtool 解决网卡丢包严重和网卡原理【转】

    转自:https://blog.csdn.net/u011857683/article/details/83758869 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  6. ethtool 解决网卡丢包严重和网卡原理

      1 概述 最近业务上老有问题,查看发现overruns值不断增加,学习了一下相关的知识.发现数值也在不停的增加.发现这些 errors, dropped, overruns 表示的含义还不大一样. ...

  7. 针对UDP丢包问题,进行系统层面和程序层面调优

    转自:https://blog.csdn.net/xingzheouc/article/details/49946191 1. UDP概念 用户数据报协议(英语:User Datagram Proto ...

  8. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...

  9. MTU-TCP/IP协议栈-linux kernel-TCP丢包重传-UDP高性能-AI- ip数据报 tcp数据报

    1.IP协议首部 TCP报文段的首部  UDP分组结构   ip数据报 tcp数据报 UDP校验 w 报文长度该字段指定UDP报头和数据总共占用的长度.可能的最小长度是8字节,因为UDP报头已经占用了 ...

随机推荐

  1. kentico中page alias的使用

    这里设置的path or pattern,是针对于根目录而言的

  2. PHP冒泡排序原生代码

    //冒泡排序 $arr=array(23,5,26,4,9,85,10,2,55,44,21,39,11,16,55,88,421,226,588); $n =count($arr); //echo ...

  3. git add时遇到类似fatal: Path 'XXX' is in submodule 'XXX'错误提示如何解决?

    答:示例如下: fatal: Pathspec 'Vundle.vim/autoload/vundle.vim' is in submodule '.vim/bundle/Vundle.vim' 解决 ...

  4. Cookie实战案例代码

    import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.s ...

  5. git——sourceTree

    基本操作 修改密码怎么办? Tools → Options → Authentication 修改密码:或者删除账户,重新拉取需用户名.密码,重新输入即可

  6. 如何优雅的给TDatetimePicker控件赋值(Delphi)

    给DatetimePicker赋值时,可以通过界面设置赋值,也可以通过代码赋值. 通常,我们会给表示起始时间的dtp赋值为 00:00:00,给表示结束时间的dtp赋值为23:59:59. 代码如下: ...

  7. 【HANA系列】【第六篇】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第六篇]SAP HANA XS ...

  8. 【LeetCode】15、三数之和为0

    题目等级:3Sum(Medium) 题目描述: Given an array nums of n integers, are there elements a, b, c in nums such t ...

  9. 来吧,认识一下Bugcrowd社区的开源课程

    what Bugcrowd? 类似于360补天等众测平台. bugcrowd大学 类似于漏洞银行推出的开源教学资源. 使用指南(网页直接谷歌翻译) 研究员researchers:指的就是我们白帽子. ...

  10. nginx 反向代理是url带后缀

    1.后端:http://10.253.149.2/tdsqlpcloud/index.php 2.配置文件 danjan01deiMac:nginx danjan01$ cat /usr/local/ ...