bestcoder round 74 div2
随便看了一场以前的bestcoder,然后顺便写了一下,都不码的样子
有中文题面,这里就不写题目大意了
T1.
刚开始想复杂了,T1可能是4道题里面想的最久的
我们大概弄一下就可以发现,如果a[i]>0,并且a[i+1]满足条件,那么s[i]=s[i+1]
所以我们发现其实是一堆相同的弄在一起。
当然如果a[i]=0那么说明s[i]!=s[i-1],这样i就有25种选法,刚开始有26种选法
就是ans=26*25^(a[i]==0的个数)
我们考虑什么时候答案=0,显然a[i]!=0&&a[i]!=a[i+1]+1那么就不合法了
代码:
#include<bits/stdc++.h>
#define N 2000005
#define Mod 1000000007
using namespace std;
int n,T,ans,a[N];
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);n--;ans=26;
for (int i=1;i<=n;i++) scanf("%d",&a[i]);a[n+1]=0;
for (int i=1;i<=n;i++)
if (a[i]!=a[i+1]+1&&a[i]!=0) ans=0;
for (int i=1;i<=n;i++)
if (!a[i]) ans=1ll*ans*25%Mod;
printf("%d\n",ans);
}
return 0;
}
T2.
因为只有3条边,显然不会重复走,最短路一定是正常走+走加入的三条路
那么只要枚举一下3条路的排列,然后方向判断一下,dfs就ok了
代码:
#include<bits/stdc++.h>
#define N 500005
#define Mod 1000000007
using namespace std;
int T,n,m,a[N],b[N],s,t,ans,sum;bool use[5];
void dfs(int now,int tot){
if (tot+abs(now-t)<ans) ans=tot+abs(now-t);
for (int i=1;i<=3;i++){
if (use[i]) continue;
use[i]=1;
dfs(a[i],tot+1+abs(now-b[i]));
dfs(b[i],tot+1+abs(now-a[i]));
use[i]=0;
}
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
for (int i=1;i<=3;i++) scanf("%d%d",&a[i],&b[i]);
for (int i=1;i<=m;i++){
ans=1e9;scanf("%d%d",&s,&t);
dfs(s,0);
sum=(sum+1ll*i*ans%Mod)%Mod;
}
printf("%d\n",sum);sum=0;
}
return 0;
}
T3.
对于第一个操作,其实等价于xor一个2^x
其实原问题等价于求0-->S^T的最少操作次数
我们发现n<=15,所以我们对于a[i]暴力dfs求出用这些数组成的数的最小次数
dp[i]表示构成i的最小次数
然后考虑操作1
因为都是xor一个2的次方数,所以每一位都是相互独立的
如果x^3是最优的,那么x^1一定是最优的,然后x^1^2也随之一定是最优的
所以我们把x从0到15枚举一下
然后再枚举i的值,更新一下dp值即可
一般的位运算的题,都是先枚举次方再枚举i的
代码:
#include<bits/stdc++.h>
#define N 1000005
#define Mod 1000000007
using namespace std;
int T,n,m,s,t,ans,a[N],mp[N];
void dfs(int u,int dep,int sum){
if (mp[sum]>dep) mp[sum]=dep;
if (u==n+1) return;
dfs(u+1,dep+1,sum^a[u]);
dfs(u+1,dep,sum);
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
memset(mp,127,sizeof(mp));
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,0,0);
for (int j=0;j<=17;j++)
for (int i=0;i<=(1<<18);i++)
if (mp[i^(1<<j)]>mp[i]+1) mp[i^(1<<j)]=mp[i]+1;
for (int i=1;i<=m;i++){
scanf("%d%d",&s,&t);
//cerr<<mp[s^t]<<endl;
ans=(ans+1ll*mp[s^t]*i%Mod)%Mod;
}
printf("%d\n",ans);ans=0;
}
return 0;
}
T4.
感觉T2-T4都没啥难度,还是T1最难(┭┮﹏┭┮)<----弱
显然的贪心,如果当前剩下的点中最小的点能够通过删边来得到,那么就删那个条数
注意我们不用考虑删的是哪些边
因为这个点拓扑了,那么意味着从它出发的边都要删除,所以不用知道具体哪些,只要知道这个点是不是要删即可
然后用一个堆来维护一下点的大小值即可
代码:
#include<bits/stdc++.h>
#define N 2000005
#define Mod 1000000007
using namespace std;
int n,m,k,T,x,y,kk,head[N],ru[N];bool use[N],flag[N];
struct Edge{int nxt,to;}e[N];
priority_queue<int,vector<int>,greater<int> > Q;
inline void link(int x,int y){e[++kk].nxt=head[x];e[kk].to=y;head[x]=kk;}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d%d%d",&n,&m,&k);
memset(ru,0,sizeof(ru));
kk=0;memset(head,0,sizeof(head));
while (!Q.empty()) Q.pop();
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
link(x,y);ru[y]++;
}
for (int i=1;i<=n;i++){
if (ru[i]<=k) Q.push(i),flag[i]=0;
else flag[i]=1;
}
long long ans=0,tot=0;
while (!Q.empty()){
while (ru[Q.top()]>k){flag[Q.top()]=1;Q.pop();}
int x=Q.top();int y=ru[x];
//printf("WTF%d\n",x);
ru[x]=0;k-=y;
Q.pop();ans=(ans+1ll*(++tot)*x%Mod)%Mod;
for (int i=head[x];i;i=e[i].nxt){
int v=e[i].to;
if (ru[v]<=k+1&&ru[v]>0&&flag[v]){flag[v]=0;Q.push(v);}
ru[v]--;
}
}
printf("%lld\n",ans);
}
return 0;
}
bestcoder round 74 div2的更多相关文章
- hdu5635 BestCoder Round #74 (div.2)
LCP Array Accepts: 131 Submissions: 1352 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...
- hdu 5636 搜索 BestCoder Round #74 (div.2)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- BestCoder Round #74 (div.2)
组合 1001 LCP Array 第一题就小难,出题的好像是浙大的大牛? 找到一个规律:a[i] = x, s[i..i+x]都想同.a[i] = a[i+1] + 1 (a[i] > 0), ...
- BestCoder Round #74
身败名裂啊...... T1WA了半天,30min才A. T2又WA了一发,然后Hack刚2min就被别人叉了. T3做完后最后40min不知所措. 去叉别人,看到一个人写D题判m=0很奇怪,随手把他 ...
- hdu 5637 BestCoder Round #74 (div.2)
Transform Accepts: 7 Submissions: 49 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072 ...
- BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)
哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...
- HDU5638 / BestCoder Round #74 (div.1) 1003 Toposort 线段树+拓扑排序
Toposort 问题描述 给出nn个点mm条边的有向无环图. 要求删掉恰好kk条边使得字典序最小的拓扑序列尽可能小. 输入描述 输入包含多组数据. 第一行有一个整数TT, 表示测试数据组数. 对 ...
- Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- hdu5634 BestCoder Round #73 (div.1)
Rikka with Phi Accepts: 5 Submissions: 66 Time Limit: 16000/8000 MS (Java/Others) Memory Limit: ...
随机推荐
- log4xx/log4j异步日志配置示例
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...
- 在VS2012中实现Ext JS的智能提示太简单了
Visual Studio 2012太强大了,居然能自己会去提取Ext JS的类的属性和方法,从而实现只能提示.下面就来介绍一下实现这个功能. 在Visual Studio 2012中随便创建一个We ...
- 【57】android图片印刻,阳刻,素描图效果处理
介绍我参与开发的妙趣剪纸app使用的图片处理相关的技术 关于妙趣剪纸,各大android商店都可以下载,下面贴出小米商店的链接 妙趣剪纸下载 软件效果截图 如何实现上面的图片处理效果呢 1.初始化高斯 ...
- C语言之回文数算法
"回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...
- android 高仿京东
android 高仿京东源码,两年前的作品,最近发现一些老代码,发布出来给初学者学习,下面附上几张展示的效果,有需要的请到下面地址下载,记得stare哦 https://github.com/xian ...
- RecyclerView 实现gallery画廊效果
1.RecyclerView的基本用法 首先主Activity的布局文件: [html] view plaincopy <RelativeLayout xmlns:android="h ...
- C++开发基础
硬件配置: 586以上PC兼容机或品牌机,配有彩色显示器.鼠标.键盘,内存不小于20MB,硬 盘自由空间不少于60MB.推荐配置为内存32MB或64MB(或以上),硬盘自由空间500MB 以上. 软件 ...
- how tomcat works 总结 三
第七章 日志记录器 第 7 章包括日志,该组件是用来记录错误信息和其他信息的. 这一章比较简单,类图如下: 根据名字我想大家都能猜出来三个实现类都是做什么的,一个按常规输出到控制台,一个按错误模式输出 ...
- HBase 索引创建
本文参考了文"mysql索引背后的数据结构及算法原理",之所以还要摘录,主要是为了形成hbase索引研究的开篇,弄明白什么索引的本质,如有版权问题,请及时通知. 索引的本质 索引是 ...
- 在linux下制作静态库和动态链接库的方法
静态库 .o文件的集合 制作 ar -cr libxxx.a xxx1.o xxx2.o xxx3.o ... 编译 gcc main.c -l xxx [-L 库路径] (如果不加-L则在标准库路径 ...