• 题目链接:

    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. Python file 读写与操作

    # strip() 返回数据类型为字符串# strip()去除头和尾的指定字符:# 如果没有指定,默认去掉头和尾的空格 str_1 = " he llo " # he llopri ...

  2. 将一个SpringBoot工程打成jar包并在控制台执行起来

    JDK:1.8.0_212 IDE:STS4(Spring Tool Suit4 Version: 4.3.2.RELEASE) 工程下载:https://files.cnblogs.com/file ...

  3. [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)

    Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...

  4. TensorFlow 学习(1)——第一个程序:线性回归

    目前这个程序还有很多地方没有搞懂,先跑一跑例程看看效果如何.从结果来看,最终的训练成果能够接近于预设的数据

  5. Vue-2:官方教程学习

    1,先把下面这些内容都按照官方教程敲一遍,打好基础,类似于“前戏”,其作用我想爸爸就不必多说了吧(づ。◕‿‿◕。)づ. https://cn.vuejs.org/v2/guide/ 同时可以配合配套视 ...

  6. jenkins+git+gitlab+ansible实现持续集成自动化部署

    一.环境配置 192.168.42.8部署gitlab,节点一 192.168.42.9部署git,Jenkins,ansible服务器 192.168.42.10节点二 二.操作演示 ①gitlab ...

  7. 作业类型维护流程(CO)

    一.建立作业类型——kl01 目的: 藉由做作業類型執行生產報工 目錄路徑: 會計à成本控制à成本中心會計à主檔資料à作業類型à個別處理à KL01 - 建立 Transaction   Code: ...

  8. 图片和Base64字符串互转

    图片URL转成Base64字符串 /// <summary> /// 通过Url获取到Image格式的文件 /// </summary> /// <param name= ...

  9. docker命令大全与资源汇总

    容器生命周期管理 run  //创建一个新的容器并运行一个命令 start/stop/restart  //启动一个或多个已经被停止的容器:停止一个运行中的容器:重启容器 kill  //杀掉一个运行 ...

  10. office web apps安装部署,配置https,负载均衡(二)域控制器安装并配置域账号

    域控制器对服务器的要求不高,我们这里以windows server 2008R2为例 系统要求:windows server 2008R2 笔者也尝试使用了windows server 2012R2, ...