• 题目链接:

    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. IP输出 之 ip_output、ip_finish_output、ip_finish_output2

    概述 ip_output-设置输出设备和协议,然后经过POST_ROUTING钩子点,最后调用ip_finish_output: ip_finish_output-对skb进行分片判断,需要分片,则分 ...

  2. 关于wordpress文章分类显示404错误的解决办法。

    闲来无事,在虚拟主机上装了一个wordpress尝试自己搭一个博客玩一下,发现文章分类一直显示404错误,网上查了好久,终于找到解决方法,其实很简单,只要将分类的别名改成英文的就解决了,分类中不能包含 ...

  3. 在Ubuntu 16.04配置VNC Server (灰屏问题解决)

      使用命令安装 sudo apt install xfce4 xfce4-goodies tightvncserver 编辑vnc启动文件,安全期间最好备份一下 mv ~/.vnc/xstartup ...

  4. 微信小程序之阻止冒泡事件

    众所周知,在微信小程序给标签绑定点击方法大家都会想到 "bindtap" 但是在页面中会遇到 点击 会冒泡而触发其他元素的时间发生 那么怎么办呢 就把引发冒泡事件的始作俑者的 bi ...

  5. RzPageControl(pagecontrol)实现多标签的动态添加,切换,关闭

    https://blog.csdn.net/pdw2009/article/details/76157651 使用RzPageControl来实现多标签页使用菜单来打开标签页,通过标签页的captio ...

  6. 安卓之Android.mk编写

    题记:编译环境可以参考https://www.cnblogs.com/ywjfx/p/9960817.html 不管是写C还是java,我想所有的程序员都经历过HelloWorld程序的编写,现在让我 ...

  7. c# httphelper (苏飞老师)

    /// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...

  8. java高级之Io流

    1.1,什么是io流? 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 ...

  9. MySQL随机字符串函数批量插入数据

      简单举个例子: drop table if exists demo1 create table demo1 ( id int primary key auto_increment, name ) ...

  10. 14 count(*)

    14 count(*) count(*)实现方式 首先要声明,在不同的mysql引擎中,count(*)有不同的实现方式. --myisam引擎把一个表的总行数存在了磁盘,因此执行count(*)的时 ...