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」背单词

题面:

https://loj.ac/problem/2012

题解:

首先把所有字符串倒过来,把后缀变成前缀

然后建立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 模拟的更多相关文章

  1. SCOI2016 Day1 简要题解

    目录 「SCOI2016」背单词 题意 题解 代码 「SCOI2016」幸运数字 题意 题解 总结 代码 「SCOI2016」萌萌哒 题意 题解 总结 代码 「SCOI2016」背单词 题意 这出题人 ...

  2. 2017 五一 清北学堂 Day1模拟考试结题报告

    预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...

  3. HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)

    前缀数组其实就是有序的,那么答案显然是      我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知  令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...

  4. Day1 模拟赛 题解

    T1:首先你要发现,对于任意一个奇数i,i xor (i-1)=1; 那么我们可以将答案转化为统计有多少个1相互异或起来: 所以答案就那么几种: 如果你用的数位DP,只能说明你太高估day1T1了: ...

  5. 纪中2018暑假培训day1提高b组改题记录

    收到意见,认为每天的程序和随笔放在一起写的博客太长了,于是分开整理 day1 模拟赛,看了看提高a组t1的样例就不太想写,于是转而写b组 t1: Description 给定一个n个点m条边的有向图, ...

  6. 中山纪念中学培训DAY1

    哇啊啊啊啊啊啊$……$ 并不像说环境怎么样. $Day1$模拟赛 稳重一点选了提高$B$ 然后$5min$后: $t1$装压$DP$最短路 $t2$裸地贪心 $t3……$哇$t3$怎么做啊啊啊啊. $ ...

  7. 11.2 morning

    noip模拟题day1——棋盘上的问题 day1模拟题 By FancyCoder总览(Overview)注意事项:共3道题目,时间2.5小时.Pascal选手允许使用math库和ansistring ...

  8. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.

    洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...

  9. 幸运数字(luckly)

    幸运数字(luckly) 题目描述 A国共有 nn 座城市,这些城市由 TeX parse error: Misplaced & 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有 ...

随机推荐

  1. HashMap底层原理以及与ConCurrentHashMap区别

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bu ...

  2. 项目Alpha冲刺(团队8/10)

    项目Alpha冲刺(团队8/10) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标: 完成项目Alpha版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 ...

  3. 基于Ubuntu 14.04 LTS编译Android4.4.2源码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS ...

  4. (23) java web的struts2框架的使用-struts动态调用和通配符

    一,动态查找 1,配置允许动态调用 <!-- 允许动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocat ...

  5. C# List Find方法

    https://blog.csdn.net/knqiufan/article/details/77847143

  6. POJ3252 Round Numbers —— 数位DP

    题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Su ...

  7. HDU2609 How many —— 最小表示法

    题目链接:https://vjudge.net/problem/HDU-2609 How many Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  8. Swift(二)控制流

    要处理条件逻辑,使用 if 和 switch ,要处理循环逻辑,使用 for-in, for, while, 和 do-while .包着条件或者循环的括号可加可不加.处理逻辑体的花括弧是必须加的. ...

  9. 如何反编译silverlight

     @years(945060991)  15:10:28问一下  如何反编译silverlight观,一世沧桑如画♥(752816388)  15:10:46解压就行@years(945060991) ...

  10. WAS:Thread "server.startup : 1" (00000020) and may be hung异常

    有现场server启动时,启动不了,后台报错如下: [// ::: CST] ThreadMonitor W WSVR0605W: Thread ) has been active milliseco ...