【SCOI2016】Day1 模拟
2018.8.16 8:00~11:06
先看t1,成功读错题。。。
以为是一个字符串的所有后缀都得在计划表里,否则权值就得是$n^2$
然后花了一个小时多一点写了一个错误的做法
然后没有分 才发现看错了题意
不过只要稍微改一改就行了
在近两个小时的时候过掉了第一题
然后看t2,显然的线性基+树剖,复杂度$O(n \log n \times 60 + q \log ^2 n \times 60)$
看了一下不知道能拿多少分 但是想不到更好的做法 于是就写了
获得了90分 真是不可思议
t3花了10分钟敲了一个30分暴力
总分:100+90+30
总结
感觉这一场打的没什么问题了吧
难得啊
题解
T1「SCOI2016」背单词
题面:
题解:
首先把所有字符串倒过来,把后缀变成前缀
然后建立trie树
显然的有一个性质:对于trie树上的一个结点来说,他在最终排列中的位置一定在他的所有祖先之后,所有儿子之前
因为如果不这样,出现了祖先->儿子->自己的情况,我们把儿子和自己调换位置,答案变优
然后考虑一个结点的子树
不难发现子树内部的结点一定靠在一起
因为如果不靠在一起,比如说儿子1->儿子2->儿子1的儿子1->儿子2的儿子1
我们把儿子2和儿子1的儿子1调换位置,儿子1的儿子1和儿子2的儿子1代价都减小
所以一个子树内部的结点靠在一起
最后我们确定子树之间的顺序
现在子树唯一有用的就是他的size
我们把子树设为$1~x$
最后的顺序设为$p_1~p_x$
cost就是$(1)+(1+size_{p_1})+(1+size_{p_1}+size_{p_2})+...+(1+size_{p_1}+size_{p_2}+...+size_{p_{x-1}})$
这样我们看出 应该将size按照升序排列最优
所以我们的做法就是:建立trie树,然后dfs一遍把无效结点去掉(就是那些不是终止结点的点),然后建立一个新的树(压缩之后的trie),dfs找到size,并通过size计算出每个结点的cost值(树形dp),最后dp[1]就是答案
Code:
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<long long,long long> pll;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define rep(i,j,k) for(register int i=(int)(j);i<=(int)(k);i++)
#define rrep(i,j,k) for(register int i=(int)(j);i>=(int)(k);i--) ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n;
string s[]; struct TRIE{
int cnt;
int pos[][];
int tag[];
vector<int> adj[];
ll dp[],sz[]; TRIE(){
cnt=;
} void ins(string t,int ind){
int pp=;
for(int i=;i<t.size();i++){
int nw=t[i]-'a';
if(pos[pp][nw]) pp=pos[pp][nw];
else{
cnt++;
pos[pp][nw]=cnt;
pp=cnt;
}
}
tag[pp]=ind;
} void dfs(int u,int fa=){
if(tag[u] && u!=fa) adj[fa].pb(u);
for(int i=;i<;i++){
int nw=pos[u][i];
if(nw==) continue;
if(tag[u]) dfs(nw,u);
else dfs(nw,fa);
}
} void work(int u){
vector<int> nw;
sz[u]=;
for(int i=;i<adj[u].size();i++){
int v=adj[u][i];
work(v);
nw.pb(sz[v]);
sz[u]+=sz[v];
dp[u]+=dp[v];
}
sort(nw.begin(),nw.end());
ll sum=;
for(int i=;i<nw.size();i++){
dp[u]+=sum;
sum+=nw[i];
// cout<<nw[i]<<' ';
}
//cout<<endl;
} void calc(){
work();
cout<<dp[]<<endl;
}
} trie; int main(){
// freopen("out","w",stdout);
n=read();
rep(i,,n){
cin>>s[i];
reverse(s[i].begin(),s[i].end());
trie.ins(s[i],i);
} trie.dfs();
trie.calc(); return ;
}
【SCOI2016】Day1 模拟的更多相关文章
- SCOI2016 Day1 简要题解
目录 「SCOI2016」背单词 题意 题解 代码 「SCOI2016」幸运数字 题意 题解 总结 代码 「SCOI2016」萌萌哒 题意 题解 总结 代码 「SCOI2016」背单词 题意 这出题人 ...
- 2017 五一 清北学堂 Day1模拟考试结题报告
预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...
- HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)
前缀数组其实就是有序的,那么答案显然是 我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知 令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...
- Day1 模拟赛 题解
T1:首先你要发现,对于任意一个奇数i,i xor (i-1)=1; 那么我们可以将答案转化为统计有多少个1相互异或起来: 所以答案就那么几种: 如果你用的数位DP,只能说明你太高估day1T1了: ...
- 纪中2018暑假培训day1提高b组改题记录
收到意见,认为每天的程序和随笔放在一起写的博客太长了,于是分开整理 day1 模拟赛,看了看提高a组t1的样例就不太想写,于是转而写b组 t1: Description 给定一个n个点m条边的有向图, ...
- 中山纪念中学培训DAY1
哇啊啊啊啊啊啊$……$ 并不像说环境怎么样. $Day1$模拟赛 稳重一点选了提高$B$ 然后$5min$后: $t1$装压$DP$最短路 $t2$裸地贪心 $t3……$哇$t3$怎么做啊啊啊啊. $ ...
- 11.2 morning
noip模拟题day1——棋盘上的问题 day1模拟题 By FancyCoder总览(Overview)注意事项:共3道题目,时间2.5小时.Pascal选手允许使用math库和ansistring ...
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.
洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...
- 幸运数字(luckly)
幸运数字(luckly) 题目描述 A国共有 nn 座城市,这些城市由 TeX parse error: Misplaced & 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有 ...
随机推荐
- JAVA WEB学习笔记(二):Tomcat服务器的安装及配置
一.Tomcat的下载及安装. 前往Tomcat官网下载安装包或者免安装压缩包.链接http://tomcat.apache.org/ 这里,我选择的是Tomcat8.0,而不是最新的Tomcat9. ...
- error C2065: 'CArchiveStream' : undeclared identifier
release:模式下 问题: 在导入JPEG文件时要使用到 CArchiveStream类 但是编译的时候会出现 'CArchiveStream' : undeclared ide ...
- python day - 19 抽象类 接口类 多态 封装
一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...
- Java的编程逻辑--15章 并发基础
1.run()和start()的区别 2.线程的基本属性和方法 id:一个递增的整数,每创建一个线程就加一 name 优先级:从1到10,默认为5,会映射到系统中的优先级.数字越大,要优先级越高 状态 ...
- archlinux yaourt安装 以及出错细节 database file for "archlinuxfr" does not exist.
archlinux yaourt安装 但一直报错如下: :: Synchronizing package databases... core is up to date extra is u ...
- feed流,图片在左还是右的区别是
feed流设计:那些谋杀你时间APP | 人人都是产品经理 http://www.woshipm.com/pd/773523.html
- Sublime Text web开发神器
开发工具介绍 开发工具一般分为两种类型:文本编辑器和集成开发环境(IDE) 常用的文本编辑器:Sublime Text.Notepad++.EditPlus等 常用的IDE:WebStorm.Inte ...
- 关于 SWT 的UI线程和非UI线程
要理解UI线程,先要了解一下“消息循环”这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作都转化成为对应的消息,加入消息队列.然后把消息转发给对应的应用程序(一般来说,就是活动 ...
- Android零碎知识点,之后会一直更新的哦!
view的getCompoundDrawables()方法,调用这个方法返回的是控件的左上右下四个位置的Drawable,并且返回的类型是数据 setBounds(x,y,width,height); ...
- fastText(三):微博短文本下fastText的应用(二)
上一篇讲到,fastText在训练数据中过拟合的问题.接下来将介绍一些提高fastText泛化能力的尝试. 模型泛化使用过fastText的人,往往会被它的很多特性征服,例如训练速度.兼具word e ...