20190922 「HZOJ NOIP2019 Round #7」20190922模拟
综述
这次是USACO2019JAN Gold的题目。
\(\mathrm{Cow Poetry}\)
题解
因为每句诗的长度一定是\(k\),所以自然而然想到背包。
设\(opt[i][j]\)代表到第\(i\)位时,结尾为\(j\)的方案数。
背包,注意\(\mathrm{DP}\)顺序为先枚举\(i\),后枚举单词。(Debug了一小时就因为这个)
然后乘法原理统计答案即可。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
void read(int &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
void fr(int &x){
char ch=1;
while(!(ch>='A'&&ch<='Z')) ch=getchar();
x=ch-'A'+1;
}
const int mod=1000000007;
const int maxn=5003;
const int maxm=100100;
int n,m,k;
int s[maxn],c[maxn];
int e[maxn];
int opt[maxn][maxn],sum[maxm];
void Init(){
read(n);read(m);read(k);
for(int i=1;i<=n;i++){
read(s[i]);read(c[i]);
}
for(int i=1;i<=m;i++){
fr(e[i]);
}
}
void dp(){
sum[0]=1;
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
if(i<s[j]) continue;
opt[i][c[j]]=(opt[i][c[j]]+sum[i-s[j]])%mod;
sum[i]=(sum[i]+sum[i-s[j]])%mod;
}
}
}
int tot,cnt[27];
int ksm(long long x,int p){
long long ret=1;
while(p){
if(p&1) ret=ret*x%mod;p>>=1;
x=x*x%mod;
}
return ret;
}
void Work(){
dp();
long long ans=0,sum=1;
for(int i=1;i<=m;i++) ++cnt[e[i]];
for(int i=1;i<=26;i++){
if(!cnt[i]) continue;
ans=0;
for(int j=1;j<=n;j++){
if(!opt[k][j]) continue;
ans=(ans+ksm(opt[k][j],cnt[i]))%mod;
}
sum=sum*ans%mod;
}
printf("%lld\n",sum);
}
int main(){
freopen("poetry.in","r",stdin);freopen("poetry.out","w",stdout);
Init();Work();
fclose(stdin);fclose(stdout);
return 0;
}
\(\mathrm{Sleepy Cow Sorting}\)
题解
树状数组。
设\(c[i]\)代表\([1,i]\)中归位数。
显然最终的目的是将整个序列排序为一个上升序列,于是倒序枚举,先把最后有序的插入。
剩下来前面无序的就是要操作的,于是直接输出操作次数。
接下来方案很容易构造。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
void read(int &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=100000+7;
#define lowbit(pos) (pos&(-pos))
int c[maxn],n,a[maxn];
void change(int pos,int k){
while(pos<=n){
c[pos]+=k;pos+=lowbit(pos);
}
}
int query(int pos){
int ret=0;
while(pos){
ret+=c[pos];pos-=lowbit(pos);
}
return ret;
}
int ans,cnt;
int main(){
freopen("sleepy.in","r",stdin);freopen("sleepy.out","w",stdout);
read(n);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=n;i>=1;i--){
ans++;--cnt;change(a[i],1);
if(a[i-1]>a[i]) break;
}
cnt+=n;
printf("%d\n",cnt);
for(int i=1;i<=n-ans;i++){
--cnt;printf("%d ",query(a[i])+cnt);
change(a[i],1);
}
fclose(stdin);fclose(stdout);
return 0;
}
\(\mathrm{Shortcut}\)
题解
最短路树。
显然奶牛的路径就是从\(1\)走到各个草地,于是从\(1\)跑最短路,构建最短路树。
为了保证字典序,从\(1\)到\(n\)依次枚举每个结点,构建。
显然,用贪心的思想,这条边一定是从某个结点\(x\)联向\(1\)的。
然后深度遍历这棵最短路树,在每个结点处处理答案即可。
注意需要long long
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template<typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
#define int long long
const int maxn=10000+7;
const int maxm=100000+7;
const int INF=0x3f3f3f3f3f3f3f3fLL;
int n,m,t;
int cows[maxn];
int u[maxm],Head[maxn],Next[maxm],to[maxm],w[maxm],tot=1;
struct node{
int id,dis;
bool operator <(node a)const{
return dis>a.dis;
}
};
void add(int x,int y,int z){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z,u[tot]=x;
}
int Jead[maxn],Mext[maxm],of[maxm],fork=1;
void fafa(int x,int y){
of[++fork]=y,Mext[fork]=Jead[x],Jead[x]=fork;
}
int dis[maxn];
bool vis[maxn];
void dijkstra(){
for(int i=2;i<=n;i++) dis[i]=INF;
priority_queue<node>q;
q.push(node{1,0});dis[1]=0;
while(!q.empty()){
int x=q.top().id;q.pop();
if(vis[x]) continue;vis[x]=1;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
q.push((node){y,dis[y]});
}
}
}
}
bool exist[maxn];
void build(){
for(int x=1;x<=n;x++){
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(!exist[y]&&dis[y]==dis[x]+w[i]){
fafa(x,y);fafa(y,x);exist[y]=1;
}
}
}
}
bool ins[maxn];
int size[maxn],ans;
void dfs(int x){
ins[x]=1,size[x]=cows[x];
for(int i=Jead[x];i;i=Mext[i]){
int y=of[i];
if(!ins[y]){
dfs(y);size[x]+=size[y];
}
}
ans=max(ans,size[x]*(dis[x]-t));
}
void Init(){
read(n);read(m);read(t);
for(int i=1;i<=n;i++) read(cows[i]);
for(int i=1,x,y,z;i<=m;i++){
read(x);read(y);read(z);
add(x,y,z);add(y,x,z);
}
}
void Work(){
dijkstra();
build();
dfs(1);
printf("%lld\n",ans);
}
signed main(){
freopen("shortcut.in","r",stdin);freopen("shortcut.out","w",stdout);
Init();Work();
fclose(stdin);fclose(stdout);
return 0;
}
20190922 「HZOJ NOIP2019 Round #7」20190922模拟的更多相关文章
- 20191004 「HZOJ NOIP2019 Round #9」20191004模拟
综述 第一次 rk1 ,激动. 题目是 COCI 18/19 Round #1 的三至五题. 得分 \(100+100+20\) \(\mathrm{cipele}\) 问题描述 HZOJ1313 题 ...
- 20191102 「HZOJ NOIP2019 Round #12」20191102模拟
先开坑. md原题写挂我也真是... 100+20+10 白夜 打表大法吼 显然,不在环上的点对答案的贡献是 \((k-cycle)^{k-1}\) . 打表得到环上的递推式,矩阵一下乘起来就好了. ...
- 20191003 「HZOJ NOIP2019 Round #8」20191003模拟
综述 试题为常州集训2019SCDay2 得分\(100+30(0)+28\) 时之终结 问题描述 HZOJ1310 题解 构造题. 发现部分分有一档是 \(Y\) 是 \(2^x\) ,于是自然想到 ...
- 「LibreOJ NOI Round #2」不等关系
「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...
- LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿
二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...
- 「LibreOJ NOIP Round #1」旅游路线
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...
- 「LibreOJ NOI Round #1」验题
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...
- #509. 「LibreOJ NOI Round #1」动态几何问题
下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿 ...
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...
随机推荐
- 【2019.8.8 慈溪模拟赛 T1】开箱(chest)(暴力DP水过)
转化题意 这题目乍一看十分玄学,完全不可做. 但实际上,假设我们在原序列从小到大排序之后,选择开的宝箱编号是\(p_{1\sim Z}\),则最终答案就是: \[\sum_{i=1}^Za_{p_i} ...
- nuxtjs踩坑指南
1.nuxt引入问题:Can't resolve 'stylus-loader' 原因在于没有安装stylus,安装即可:npm install stylus stylus-loader --save ...
- 领域驱动设计(DDD)编码实践
写在前面 Martin Fowler在<企业应用架构模式>一书中写道: I found this(business logic) a curious term because there ...
- TCP的三次握手与四次挥手理解
本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后 ...
- spring AOP XML解析
<aop:config> 标签的解析: <bean id="loggingAspect" class="com.zhuguang.jack.aop.as ...
- oracle like模糊查询不能走索引?
这里要纠正一个网上很多教程说的模糊匹配不能走索引的说法,因为在看<收获,不止SQL优化>一书,里面举例说到了,并且自己也跟着例子实践了一下,确实like一些特殊情况也是可以走索引的 例子来 ...
- python threading ThreadPoolExecutor
线程池,为什么要使用线程池:1. 线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值2. 当一个线程完成的时候我们主线程能立即知道3. futures可以让多线程和多进程编码接口一致 获取 ...
- 图片服务器FastDFS的安装及使用
FastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS ...
- MySQL for OPS 06:备份恢复
写在前面的话 人在河边走,湿鞋是早晚是事情,操作服务器,数据库也一样.谁也不知道自己哪一天控制不住自己就手贱.这时候有两个东西能救我们,一是备份,二是 bin log,bin log 前面讲了,但是 ...
- Prometheus监控学习笔记之Prometheus如何热加载更新配置
0x00 概述 当 Prometheus 有配置文件修改,我们可以采用 Prometheus 提供的热更新方法实现在不停服务的情况下实现配置文件的重新加载. 0x01 热更新 热更新加载方法有两种: ...