• 题目链接:

    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. TCP主动打开 之 第一次握手-发送SYN

    tcp客户端与服务器端建立连接需要经过三次握手过程,本文主要分析客户端主动打开中的第一次握手部分,即客户端发送syn段到服务器端: tcp_v4_connect为发起连接主流程,首先对必要参数进行检查 ...

  2. smarty逻辑运算符

    smarty逻辑运算符 eq        equal : 相等 neq       not equal:不等于 gt        greater than:大于 lt        less th ...

  3. 解决Vue在IE中报错出现不支持=>等ES6语法和“Promise”未定义等问题

    在做VUE项目中大家可能会发现除了IE内核浏览器之外项目都能正常显示,但是到IE就萎了,这主要是IE不支持ES6的原因. 要解决这个我们要先引入browser.js,这样你可以使用ES2015(jav ...

  4. Why are C# structs immutable?

    Compiler Error CS1612 Cannot modify the return value of 'expression' because it is not a variable cl ...

  5. redux异步

    在一个项目中 redux 是必不可少的,redux 中没有提供异步的操作,但是异步又是项目开发中重要的一部分,所以我们的 redux 对此有进行了拓展: 所以我们需要 redux-thunk 的插件, ...

  6. koa 项目实战(四)注册接口和调试工具(postman)

    1.安装模块 npm install koa-bodyparser --save npm install bcryptjs --save 2.引入模块 根目录/app.js const bodyPar ...

  7. 计算机组成原理 — CPU 中央处理器

    目录 文章目录 目录 前文列表 逻辑电路部件 组合逻辑电路 时序逻辑电路 阵列逻辑电路 中央处理器(CPU) 控制单元(控制器) 运算单元(运算器) 存储单元(寄存器组和片内缓存) CPU 的工作原理 ...

  8. 手动部署 OpenStack Rocky 双节点

    目录 文章目录 目录 前言 OpenStack 架构 Conceptual architecture Logical architecture 网络选型 Networking Option 1: Pr ...

  9. PHP进阶之路 -- 01 PHP基础语法

    PHP进阶之路 --  PHP基础语法 windows环境下php环境 php定界符  php变量  php数据类型 数据类型转换 检测数据类型 php中三种输出方式 php字符集设置 php常量 p ...

  10. react navigation goBack()返回到任意页面(不集成redux) 一

    方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...