首页 > 其他分享 >P3087 [USACO13NOV]Farmer John has no Large Brown Cow S

P3087 [USACO13NOV]Farmer John has no Large Brown Cow S

时间:2023-06-04 19:13:03浏览次数:42  
标签:tmp Brown Cow no int long 形容词 key include

正解像是康托展开之类的?但是蒟蒻不会,所以用了一堆 STL。


对于每一列的字符串,按照字典序给它们编号。这样每一行的形容词串就变成了一堆数字。

设共有 \(s\) 列,第 \(i\) 列共有 \(b_i\) 个不同的形容词,那么实际上每一行就是一个“第 \(i\) 位是 \(b_i\) 进制”的数。设第 \(j\) 行的第 \(k\) 个形容词再该列的排名为 \(a_{j,k}\),然后这一行的形容词就可以用数字 \(\sum\limits_{k=1}^{s}(a_{j,k} \times \prod\limits_{p=k+1}^{s}b_p)\) 表示。

例如样例,large brown noisy转化为0 0 0small white silent转化为1 2 1。然后按照进制转化的方法,前者转化为 \(0\),后者转化为 \(1 \times 6 + 2 \times 2 + 1 \times 1 = 11\)。

然后对于每一行的形容词都可以转化为一个数字,我们将这些数字称为“关键数字”。将关键数字排序后得到数组 \(key\)。我们要求的其实是第 \(k\) 个"非关键数字",而“非关键数字”个数是 \(O(\prod b_i)\) 级别的,直接枚举妥妥的 T 飞。而“关键数字”只有 100 个,所以考虑计算答案在哪两个“关键数字”之间。

这个是简单的。从小到大找区间 \((key_i , key_{i+1})\),若 \(k \leq key_{i+1} - key_i\) 说明答案为 \(ans = key_i + k - 1\),直接输出 \(ans\) 对应的形容词串即可。否则 \(k \gets k-(key_{i+1}-key_i)\),然后进入下一个区间。


具体的复杂度懒得算了。这题的数据范围极小,\(n \leq 100\),形容词个数 \(\leq 30\),所以不论怎么玩 STL 都炸不了。事实上最大点仅 4ms。

我的代码里面使用了大量的 STL,而且还是修修补补才写出来的。做这种毒瘤前还是先思考完整再写,不然不知道写出来一坨什么玩意(

#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

int n,k,sz;
map<string,int>adj[110];	// 每一列形容词的编号
map<int,string>rev[110];	// adj[rev[S]] = S
set<string>qwq[110];		// 每一列形容词
vector<string>awa[110];		// 每一行形容词
long long bit[110];			// 每一列进率
vector<long long>key;		// 关键数字 

long long encode(vector<string>v){
	long long ret=0;
	for(int i=0;i<sz;i++) ret=ret*bit[i+1]+(adj[i+1][v[i]]-1);
	return ret;
}
vector<string>decode(long long v){
	vector<string>ret;
	for(int i=sz;i>=1;i--)
		ret.push_back(rev[i][v%bit[i]]),v/=bit[i];
	reverse(ret.begin(),ret.end());
	return ret;
}

int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		string tmp;
		cin>>tmp; cin>>tmp; cin>>tmp; cin>>tmp;
	//   Farmer     John       has       no
		for(int j=1;;j++){
			cin>>tmp;
			if(tmp=="cow.") break;
			qwq[j].insert(tmp),sz=j;
			awa[i].push_back(tmp);
		}
	}
	
	long long R=1;
	bit[0]=1;
	for(int i=1;i<=sz;i++){
		int cnt=0;
		auto it=qwq[i].begin();
		for(;it!=qwq[i].end();it++) adj[i][*it]=++cnt,rev[i][cnt-1]=*it;
		R*=cnt,bit[i]=cnt;
	}
	
	for(int i=1;i<=n;i++) key.push_back(encode(awa[i]));
	sort(key.begin(),key.end()),key.push_back(R);
	
	long long cur=0,res=k;
	for(auto it=key.begin();it!=key.end();it++){
		long long now=*it;
		if(res<=now-cur){
			vector<string>ans=decode(res+cur-1);
			for(auto it0=ans.begin();it0!=ans.end();it0++) cout<<*it0<<' ';
			break;
		}else
			res-=(now-cur),cur=now+1;
	}
	return 0;
}

标签:tmp,Brown,Cow,no,int,long,形容词,key,include
From: https://www.cnblogs.com/zzxLLL/p/17456122.html

相关文章

  • node版本问题:Error: error:0308010C:digital envelope routines::unsupported
    前言出现这个错误是因为node.jsV17及以后版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.在node.jsV17以前一些可以正常运行的的应用程序,但是在V17及以后版本可能会抛出以下异常: 我重装系统前,用......
  • 高并发下的Node.js与负载均衡
     新兴的Node.js已经吸引了很多开发人员的眼光,它提供给我们一个快速构建高性能的网络应用的平台。我也开始逐步投入node.js的怀抱,在学习和使用的过程中,遇到了一些问题,也有一些经验,我觉得有必要写出来,作为总结,也用作分享。众所周知,node.js基于v8引擎,所以它本身并不支持多线程(有多线......
  • NOI / 1.9编程基础之顺序查找 05:最大值和最小值的差
    描述输出一个整数序列中最大的数和最小的数的差。输入第一行为M,表示整数个数,整数个数不会大于10000;第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。输出输出M个数中最大值和最小值的差。样例输入525742样例输出5题意输入M,表示整数个数,再输入M个整......
  • nodejs调试工具
    Node应用调试工具debugger文档 http://nodejs.org/api/debugger.html内置的调试工具,支持基本的断点功能NodeInspector主页 https://github.com/node-inspector/node-inspector通过BlinkDeveloperTools提供的网页版JS调试工具来调试Node程序.NodeEclipse主页 http:......
  • node.js安装及环境配置教程【Windows系统安装包方式】
    一、下载安装包:https://nodejs.org/zh-cn/download/注:根据自己电脑系统及位数选择,我的电脑是Windows系统、64位、想下载稳定版的.msi(LTS为长期稳定版)这里选择windows64位.msi格式安装包。.msi和.zip格式区别:.msi是Windowsinstaller开发出来的程序安装文件,它可以让你安装,修改,......
  • C++ chrono
    std::ratio表示一个单位时间。template<std::intmax_tNum,std::intmax_tDenom=1>classratio;Num是时间的分子,Denom是时间的分母。std::milli=std::ratio<1,1000>std::centi=std::<1,100>std::deci=std::<1,10>std::chrono::duration......
  • Failed to start docker.service: Unit docker.service not found.
    1、卸载docker 2、添加Docker官方的GPG密钥 3、更新源 4、导入证书 5、更新 6、安装docker 7、验证是否安装成功 8、安装dockercompose 9、验证是否安装成功 ......
  • 基于按annotation的hibernate主键生成策略
    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论。[color=darkblue][b]一、JPA通用策略生成器[/b][/color]通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法......
  • Knowledgeroot 开源知识管理系统简要介绍
    [url]http://blog.sina.com.cn/s/blog_701dfa430101hsyt.html[/url][color=red][b]Knowledgeroot[/b][/color]开源知识管理系统(KMS)官方网站:Knowledgeroot.org-当前版本:version:1.0.3Knowledgeroot可用于文档管理,知识库管理。1.基于php开发,支持lin......
  • Oracle统计信息之NO_INVALIDATE参数
    文档课题:Oracle统计信息之NO_INVALIDATE参数.1、理论知识Oracle统计信息对于CBO至关重要.RBO建立在数据结构的基础上,DDL结构、约束会将SQL语句分为不同的成本结构等级.而CBO是在数据结构的基础上加入数据表细粒度信息,将成本结构细化为成本cost值.相对于数据表的DDL结构,统计信息反......