学习笔记[AGC044C] Strange Dance

Posted 仰望星空的蚂蚁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记[AGC044C] Strange Dance相关的知识,希望对你有一定的参考价值。

题目挺绕的,中途甚至怀疑自己是不是读错了题。

瞪了半天一无所获,冷静了一下发现可能是哪个地方想错了,结果又产出了伪算法,根本没想到 trie \\texttrie trie树可做。。。

为什么我认为 trie \\texttrie trie树不可做?因为我觉得操作 1 1 1 trie \\texttrie trie树做不了。。。

完蛋了。

我们建立 3 3 3进制的 trie \\texttrie trie树, trie \\texttrie trie树上每个点到根节点的路径表示它的位置,同时 trie \\texttrie trie树上每个点记录了一个权值。然后操作 1 1 1相当于交换每个节点的 1 1 1号儿子和 2 2 2号儿子,当然我们不会老老实实对每个结点交换它的儿子,而是通过打懒标来解决。这也契合了我们只需要输出最终序列的目的。

真正令人头疼的是操作 2 2 2当时觉得进位太复杂了就没往那方面想 我们按从低到高位建立 trie \\texttrie trie树,首先对于根节点,我们应该把 1 1 1号儿子接到 2 2 2号儿子上面, 2 2 2号儿子接到 3 3 3号儿子上面,对于 3 3 3号儿子,我们又要把对应的子树拼接到 0 0 0号儿子对应的位置,我们只用把整颗子树搬过去而不用对子树内部进行额外的递归,因此每次只会递归一边。

复杂度 O ( ∣ T ∣ n + 3 n ) O(|T|n+3^n) O(Tn+3n)

最近似乎总是遇到以前的知识点,但是理解不深入又不会做的情况,看来还是太菜了

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second
using namespace std;
int n,f[13],res[1000005],tot=1;
string s;
struct trie
	int son[3];
	int val,lazy;
t[1000005];
int get(int x,int y)
	return x/f[y]%3;

void ins(int x)
	int it=1;
	for(int i=0;i<n;i++)
		int p=get(x,i);
		if(!t[it].son[p])t[it].son[p]=++tot;
		it=t[it].son[p];
	t[it].val=x;

void pushdown(int p)
	if(t[p].lazy)
		swap(t[p].son[1],t[p].son[2]);
		t[t[p].son[0]].lazy^=1,t[t[p].son[1]].lazy^=1,t[t[p].son[2]].lazy^=1;
		t[p].lazy=0;
	

void change(int p)
	if(!p)return;
	pushdown(p);
	int x=t[p].son[0],y=t[p].son[1],z=t[p].son[2];
	t[p].son[1]=x,t[p].son[2]=y,t[p].son[0]=z;
	change(z);

int qry(int x)
	int it=1;
	for(int i=0;i<n;i++)
		int p=get(x,i);
		pushdown(it),it=t[it].son[p];
	return t[it].val;

int main()
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>s;f[0]=1;for(int i=1;i<=12;i++)f[i]=f[i-1]*3;
	for(int i=0;i<f[n];i++)ins(i);
	for(int i=0;i<s.size();i++)
		if(s[i]=='S')
			t[1].lazy^=1;
		
		else
			change(1);
		
	for(int i=0;i<f[n];i++)res[qry(i)]=i;
	for(int i=0;i<f[n];i++)cout<<res[i]<<' ';
 

想了一下,发现我只会 O ( n 4 ) O(n^4) O(n4)的暴力做法。想了想剪枝,感觉过不了,似乎网格图也没啥性质。

然后就自闭了

这题看起来很像一个搜索题,然而又是一个算贡献的题目,那么我们考虑所有点的答案之和加起来,应该是 n 3 n^3 n3级别。

NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用

记者 | 周翔


AI科技大本营1月28日消息,《麻省理工科技评论》新兴科技峰会EmTech China在北京召开,营长也受邀参加,会上有多位人工智能领域的重磅大佬出没,Dan Roth 就是其中一位。



说起Dan Roth,他可是全球自然语言处理领域的顶级专家,宾夕法尼亚大学计算机和信息科学系的讲席教授。他致力于通过机器学习和推理的方法帮助机器理解自然语言。也是 AAAS、ACL、AAAI 和 ACM 的会士,曾在多个重要会议上担任程序主席一职。2017 年,他因“在自然语言理解、机器学习和推理领域中做出重大的概念和理论创新”而获得国际人工智能联合会议(IJCAI)颁发的约翰·麦卡锡奖。Dan Roth 在哈佛大学获得博士学位,并曾在伊利诺伊大学担任教授。他曾开发出 SNoW 等多种应用广泛的自然语言处理工具。


今天Dan Roth教授为我们带来了题为“利用非结构化数据——AI的崛起”的演讲,为我们讲解了自然语言处理领域近期的重要任务;为什么非结构化的数据处理很难以及应对措施;自然语言处理领域现阶段的主要应用及挑战等内容。


以下为Dan Roth教授演讲实录,AI 科技大本营做了不改变原意的整理。


NLP领域近期的重要任务


当我们连接wifi的时候,或者当你在下载的时候,会出现一个提示框询问你是否接受用户协议。这是一份很长的文本,那么你要接受吗?可能你会回答,对,我要接受,哪怕这个时候,你还没有读完这份长长的文本。


但是这个文本中会涉及很多问题,比如,它会如何利用我的个人信息?会不会侵害我的隐私?我们需要了解这些知识。这个文本能不能让用户清楚了解这些相关的保密内容呢?我们现在还没有一种稳定的方法可以去了解整个文本的内容,这就是我们现在遇到的问题。这个问题不仅是一个科学上的问题,这些文本关乎我们个人信息的安全性,这是每个人都要面对的问题。


我们接触到的绝大多数数据是非结构性的。从科学领域,再到医学、教育、商业、互联网等等,包括我们的邮件都是非结构性数据。这背后的挑战就是,我们如何去了解这些数据的结构,从而建立一个系统,可以去分析、利用它们,了解其背后的意义。这就是自然语言处理领域近期,尤其是近几年的一个重要任务。


为什么非结构化的数据处理很难?


今天,我来给大家解释一下,为什么非结构性的数据处理这么难?以及我们要采取什么样的措施?


我们从一个简单的故事开始。这是美国二年级学生的一道阅读测试题。有三个名字:Kris  Robin、Kiris和Ms.  Robin,大家觉得他们是同一个人的名字吗?我想大多数人都觉得不是。为什么不是呢?因为通过阅读理解,大家会觉得其中有一个可能是父亲。虽然这篇文章中没有明确指出这一点,但是大家可以推断出来。这样一道题,有人做对,有人做错,有人可能做的很快,有人则可能会慢一点。那么我们如何帮助计算机快速地做出选择呢?


其实,这个故事中是有很多陷阱的,有的人会被误导。文章中往往有很多的逻辑词,有很多时间节点,比如说三年前五年前,还有一些定性和定量的词语,让我们可以分析和梳理人物之间的关系。哪怕是一个很简单的问题,我们也需要通过逻辑来梳理。


对计算机而言,这是一个比较复杂的问题。为什么呢?因为这背后有两层逻辑。表层语言层和底层意义层。语言层具有模糊性,因此可能会产生歧义,所以我们需要去了解它的背景,推测它的言外之意来消除这样的歧义。除此之外,语言层还具有多样性。我们想要表达的每一点,都可以通过不同的方式表达出来。这两个特点就使得语意理解非常困难。      


再给大家举一个例子,这里有三篇文本,都提到了芝加哥。


“我来自芝加哥。”


我这么说,它可能没有别的意思。但如果我提到芝加哥乐队,或者芝加哥的足球队,或者提到与它相关的专辑。有的文本中甚至不会直接出现芝加哥,但是这些不同的意义点都可以帮我们表达出芝加哥。


传统的编程能力暂时没办法帮助我们解决语言的模糊性问题。所以我们就要利用最新的机器学习去减少文本中的模糊性,去连接语言中的逻辑,去解读背景知识,去识别不同的词汇,以最终地消解这种模糊性。


机器学习是解决语言中模糊性和多样性一个必要的工具。在过去几年我们也看到了这个领域的发展,我们有不同分类方法来解决文本分类问题,他们依据不同的规则,使用不同的方法。比如我们会通过打上一个标签对文本进行标记,在标记的过程中对文件进行分类。比如可以通过病例来判断一个患者是否可以复诊,这是一种宏观的分类方法。


人工智能能够帮助我们进行分类,在过去的几年它也取得了长足的发展。这其中不仅有机器学习发展的功劳,还有其他的技术,包括计算能力的发展和储存成本的下降,还有新的分类方法的诞生,都促进了机器学习领域的发展。


大家如果关注这个领域,就会发现现在机器学习分类还不是非常的有效。如果把这些方法比喻成一个魔盒的话,我们要了解这个魔盒中需要什么样的工具和内容。我想强调的就是,我们不仅需要找到方法,更应该了解推理的方法,包括了解原因、假设结果和测试方法。因为推理应该是分类之上的逻辑,让同样的类别在一起进行集成。我们要清楚,一个节点是否能推到下一个节点,这样才能更好的解决问题、回答问题和进行优化。


自然语言处理的应用


自然语言处理现在有很多应用。比如,一个律所需要获得所有人的名字,这些人名都包含在邮件中,有不同的分析邮件的方法,我们该如何确定这些人的名单呢?再比如,一个政界人士要研究气候变化方面的问题,他也找到了很多相关的文本,但是该如何全面的梳理,得到大事件的时间表呢?包括教学系统,是否能够帮助我们初中学生更好的解决几何和数学问题?再比如比传统病历包含更多信息的电子病历,我们又该如何利用呢?


我们还没有真正完全解决这些问题,还有许多其他挑战,包括推理,适应性训练,因为现在的模型大多不具有通用性。


以及最大的挑战是——监督


那什么是监督?或者说神经网络的监督?我们赋予神经网络一个任务,去模拟它,然后收集数据,设置一个模型。但现在我们发现我们的数据不够,没有办法去适配所有的模型。那这种方法就无法升级和进行通用性的应用,它更大程度上是只是一种偶然性的训练。


我们也发现很多的零散信号,我们如何收集这些零散的信号,进行训练模型?传统的文本分类,需要用很多标志性文件去训练一个经典的模型。所以,我们一般要收集一些关键的数据进行标记、进行分类。现在我们考虑的是如何不利用标记的数据,就可以进行快速地分类。但是现在我们不再需要标记数据了,因为我们有对标签的最直接的了解。我们可以直接利用话题、文本进行标记性的重现,以实现对话题的理解。


我还有一个例子,我很喜欢喝咖啡,我想告诉一个机器人这个信息,我就要和它沟通。我要告诉它,我需要什么样的咖啡,让它去了解我的喜好。标准的机器学习的方法,就是为此提供一个有隐喻的文本和很多意义的标记,这样做的成本非常地高昂。换句话说我们要像一个老师一样,通过深入的沟通,为机器人提供信息。这种方法是不可以进行复制的。


现在我们在想为它提供一些非直接性的信号,去训练这个机器人。把这样的信息传递出去,再看一下机器人能做什么事情。如果它按照我的方法和指示做这个咖啡,说明我们的信息传递是非常清晰的,相反的话说明我们的信息传递的不太成功。


因此我们现在的挑战就是能不能依赖于这种描述语言,实现信息的传达。我不会告诉你们怎么做,但是我觉得这样一种方式,能够帮助我们进行下一级的技术革命,而且能够完成一些复杂的任务。


总结来看,今天的自然语言处理依然是一个具有挑战性的领域。机器学习和推理等都是科学工程以及商业进展的核心。尽管还有许多的问题有待解决,但是现在这个领域的现状已经能够帮助我们取得一定的商业成功了。


谢谢!


招聘

新一年,AI科技大本营的目标更加明确,有更多的想法需要落地,不过目前对于营长来说是“现实跟不上灵魂的脚步”,因为缺人~~


所以,AI科技大本营要壮大队伍了,现招聘AI记者和资深编译,有意者请将简历投至:gulei@csdn.net,期待你的加入!


如果你暂时不能加入营长的队伍,也欢迎与营长分享你的精彩文章,投稿邮箱:suiling@csdn.net


如果以上两者你都参与不了,那就加入AI科技大本营的读者群,成为营长的真爱粉儿吧!后台回复:读者群,加入营长的大家庭,添加营长请备注自己的姓名,研究方向,营长邀请你入群。


热文精选



☟☟☟点击 | 阅读原文 | 查看更多精彩内容

以上是关于学习笔记[AGC044C] Strange Dance的主要内容,如果未能解决你的问题,请参考以下文章

[AGC014F]Strange Sorting

Android Audio回声消除学习笔记

AGC增长服务3-App Linking示例

HarmonyOS应用集成AGC应用内消息与远程配置

AtCoder Prefix Median(AGC012)

NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用