A.Price List

Sol

求和查询

Code

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std; typedef long long LL;
const int N = 100005; //LL v[N]; inline LL in(LL x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
int main(){
int T,n,m;LL tmp;
for(T=in();T--;){
n=in(),m=in(),tmp=0;
for(int i=1;i<=n;i++) tmp+=in();
// for(int i=1;i<=n;i++) v[i]=in();
for(int i=1;i<=m;i++){
if(in()>tmp) putchar('1');
else putchar('0');
}putchar('\n');
}return 0;
}

B.NanoApe Loves Sequence

Sol

统计出来前面最大的绝对值,后面最大的绝对值,然后枚举中间位置就可以了.

Code

#include<cstdio>
#include<iostream>
using namespace std; const int N = 100005; int T,n,a[N],p[N],q[N];
long long ans; //inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
// while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
inline int abs(int x){ return x<0?-x:x; }
int main(){
for(cin>>T;T--;){
// n=in();for(int i=1;i<=n;i++) a[i]=in();
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=2;i<=n;i++) p[i]=max(p[i-1],abs(a[i]-a[i-1]));
for(int i=n-1;i;i--) q[i]=max(q[i+1],abs(a[i]-a[i+1])); // for(int i=1;i<=n;i++) cout<<p[i]<<" ";cout<<endl;
// for(int i=1;i<=n;i++) cout<<q[i]<<" ";cout<<endl; ans=q[2]+p[n-1];
for(int i=2;i<n;i++) ans+=max(abs(a[i-1]-a[i+1]),max(p[i-1],q[i+1]));
cout<<ans<<endl;
}
return 0;
}

  


C.NanoApe Loves Sequence Ⅱ

Sol

枚举左端点,做尺取法就可以了.

Code

#include<cstdio>
#include<iostream>
using namespace std;
int p[200005];
int n,m,k;
int T,x;
long long ans;
int main(){
int i,j;
scanf("%d",&T);
while(T--){
ans=0;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++){
scanf("%d",&x);
if(x>=m) p[i]=1+p[i-1];
else p[i]=p[i-1];
}
for(i=1,j=1;i<=n;i++){
for(;p[j]-p[i-1]<k&&j<=n;j++);
ans+=n-j+1;
}cout<<ans<<endl;
}return 0;
}

  


D.Keep In Touch

Sol

DAG上的DP.

注意输入的时候 \(u<v\) 这就保证了是一个有向无环图,我当时没注意,一直在想有环怎么做.

\(f[i][j][k]\) 表示第1个人第2个人第3个人的位置分别为 \(i\) , \(j\) ,\(k\) 的方案数.

然后直接DP是 \(O(n^6)\) ,加一维表示当前考虑到了第 \(p\) 个人.

注意转移的时候只需要判断第1个人是否合法就可以了,因为第2.3个人还没有走到相应的位置.

Code

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std; typedef long long LL;
const int N = 55;
const LL Mo = 998244353; int T,n,m,K,q;
int w[N];
LL f[N][N][N][4];
vector<int> g[N]; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
inline int abs(int x){ return x<0?-x:x; }
inline int check(int a,int b,int c){
if(abs(w[a]-w[b])>K||abs(w[a]-w[c])>K||abs(w[b]-w[c])>K) return 0;
return 1;
}
int main(){
// freopen("in.in","r",stdin);
for(T=in();T--;){
memset(f,0,sizeof(f));for(int i=0;i<N;i++) g[i].clear();
n=in(),m=in(),K=in(),q=in();
for(int i=1;i<=n;i++) w[i]=in(); for(int i=1,u,v;i<=m;i++) u=in(),v=in(),g[u].push_back(v); for(int i=n;i;i--) for(int j=n;j;j--) for(int k=n;k;k--){
f[i][j][k][1]=1;
for(int p=0;p<g[i].size();p++) f[i][j][k][1]=(f[i][j][k][1]+f[g[i][p]][j][k][3])%Mo;
for(int p=0;p<g[j].size();p++) f[i][j][k][2]=(f[i][j][k][2]+f[i][g[j][p]][k][1])%Mo;
for(int p=0;p<g[k].size();p++) f[i][j][k][3]=(f[i][j][k][3]+f[i][j][g[k][p]][2])%Mo;
if(!check(i,j,k)) f[i][j][k][1]=0;
} // for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++)
// cout<<i<<" "<<j<<" "<<k<<"-->"<<f[i][j][k][1]<<" "<<f[i][j][k][2]<<" "<<f[i][j][k][3]<<endl; for(int i=1,x,y,z;i<=q;i++){
x=in(),y=in(),z=in();
printf("%I64d\n",f[x][y][z][1]);
}
}return 0;
}

  


E.Price List Strike Back

Sol

考虑对序列的分治,

\(Solve(l,r,L,R)\) 表示处理左右端点在 \([l,r]\) 中的问题 \([L,R]\) .

分三种情况 \(r_i<=mid\) \(l_i>mid\) \(l_i<=mid<r_i\)

对于前两种情况我们扔到 \(Solve(l,mid)\) 和 \(Solve(mid+1,r)\) 中处理.

跨过中间点 \(mid\) 的方案数可以用背包在 \(O(100(r-l+1))\) 的时间内处理出来.

\(f[i][j]\) 表示从 \(i\) 到 \(mid\) 得到 \(j\) 的最长的最短距离.

\(g[i][j]\) 表示从 \(mid+1\) 到 \(i\) 得到 \(j\) 的最长的最短距离.

然后统计就是

\(c_i=min(c_i,max(f[l_i][j],g[r_i][s_i-j]))\)

复杂度 \(O(nlogn+m)\)

PS:数组开小 T掉了...

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std; const int N = 20005;
const int QM = 100005;
const int M = 105;
const int INF = 0x7f7f7f7f;
#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (o<<1|1)
#define debug(a) cout<<#a<<"="<<a<<" " int T,n,m;
int w[N],d[N];
struct Q{ int l,r,s,c,id; }q[QM],tmp[QM];
bool operator < (const Q &a,const Q &b){ return a.id<b.id; }
int f[N][M],g[N][M];
int ans[QM]; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
void Solve(int l,int r,int L,int R){
if(L>R) return;
if(l==r){
if(L<=R) for(int i=L;i<=R;i++) ans[q[i].id]=(w[l]!=q[i].s||d[l]>q[i].c)?1:0;
return;
}
int h1=L;
for(int i=L;i<=R;i++) if(q[i].r<=mid) tmp[h1++]=q[i];
int h2=h1;
for(int i=L;i<=R;i++) if(q[i].l<=mid&&q[i].r>mid) tmp[h2++]=q[i];
int h3=h2;
for(int i=L;i<=R;i++) if(q[i].l>mid) tmp[h3++]=q[i]; for(int i=L;i<=R;i++) q[i]=tmp[i]; Solve(l,mid,L,h1-1),Solve(mid+1,r,h2,h3-1); if(h2-h1<=0) return;
memset(f[mid],0x7f,sizeof(f[mid]));f[mid][w[mid]]=d[mid],f[mid][0]=0;
for(int i=mid-1;i>=l;i--) for(int j=100;~j;j--){
f[i][j]=f[i+1][j];
if(j>=w[i]&&f[i+1][j-w[i]]<INF) f[i][j]=min(f[i][j],max(f[i+1][j-w[i]],d[i]));
} memset(g[mid+1],0x7f,sizeof(g[mid+1]));g[mid+1][w[mid+1]]=d[mid+1],g[mid+1][0]=0;
for(int i=mid+2;i<=r;i++) for(int j=100;~j;j--){
g[i][j]=g[i-1][j];
if(j>=w[i]&&g[i-1][j-w[i]]<INF) g[i][j]=min(g[i][j],max(g[i-1][j-w[i]],d[i]));
} for(int i=h1;i<h2;i++){
for(int j=0;j<=q[i].s;j++) ans[q[i].id]=min(ans[q[i].id],max(f[q[i].l][j],g[q[i].r][q[i].s-j]));
if(ans[q[i].id]>q[i].c) ans[q[i].id]=1;else ans[q[i].id]=0;
}
}
int main(){
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
for(T=in();T--;){
n=in(),m=in();
for(int i=1;i<=n;i++) w[i]=in();for(int i=1;i<=n;i++) d[i]=in();
for(int i=1;i<=m;i++) q[i].l=in(),q[i].r=in(),q[i].c=in(),q[i].s=in(),q[i].id=i,ans[i]=INF;
Solve(1,n,1,m);
for(int i=1;i<=m;i++) putchar(ans[i]+'0');putchar('\n');
}return 0;
}

  

BestCoder Round #86 解题报告的更多相关文章

  1. BestCoder Round #75 解题报告

    King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...

  2. BestCoder Round #76 解题报告

    DZY Loves Partition [思路] 贪心 [代码] #include <iostream> using namespace std; typedef long long ll ...

  3. BestCoder Round #40 解题报告

    这场是第一场没有米的BC... 大概也是想震一震那些一听说没米了就不打BC的人吧 这次的题目质量比以往高了许多 (然而我并没有打这一场BC 但是今天下午到现在做的过程中真的学到了不少知识呢 A题略水. ...

  4. BestCoder Round #39 解题报告

    现场只做出前三题w 不过不管怎样这既是第一次认真打BC 又是第一次体验用在线编译器调代码 订正最后一题花了今天一整个下午(呜呜 收获还是比较大的^_^ Delete wld有n个数(a1,a2,... ...

  5. [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)

    [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP) 题面 有三个人从一张N个点无重边的有向无环图上的三个点出发,每单位时间,他们分别选择当前 ...

  6. 浙江省队选拔 ZJOI2015 (Round 1) 解题报告

    最近莫名其妙地喜欢上了用这种格式写各省省选的全套题解= = 今年浙江省选的出题人是算法竞赛界传说级人物陈立杰,看样子他的出题风格很有特点……ABC三题难度是严格递减的,感觉如果在做第一题的时候被卡住的 ...

  7. Codeforces Round #300 解题报告

    呜呜周日的时候手感一直很好 代码一般都是一遍过编译一遍过样例 做CF的时候前三题也都是一遍过Pretest没想着去检查... 期间姐姐提醒说有Announcement也自信不去看 呜呜然后就FST了 ...

  8. BestCoder Round #86

    A题 Price List 巨水..........水的不敢相信. #include <cstdio> typedef long long LL; int main() { int T; ...

  9. Mango Weekly Training Round #6 解题报告

    比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41856#overview A.多种解法.可以dfs倒序染色,如mathlove ...

随机推荐

  1. ubuntu rhythmbox乱码解决方法

    因为安装的是双系统,所以音乐文件在win的盘下面,所以采用的方法是 1. 首先,需要有软件包mid3iconv.如果你的系统中没有安装它,可以通过如下代码自动安装:sudo apt-get insta ...

  2. Redis学习——链表源码分析

    0. 前言 Redis 中的链表是以通用链表的形式实现的,而对于链表的用途来说,主要的功能就是增删改查,所以对于查找来说,redis其提供了一个match函数指针,用户负责实现其具体的匹配操作,从而实 ...

  3. Ubuntu14.04 LTS更新源

    Ubuntu14.04 LTS更新源 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp ...

  4. TCSQL实时列表缓存数据库帮助文档

    [文章作者:张宴 本文版本:v1.1 最后修改:2010.09.03 转载请注明原文链接:http://blog.zyan.cc/tcsql/] 曾经有人提出,一般数据库缓存分为四种.第一种:单个对象 ...

  5. _SYS_LIB="-lm -lnsl -ldl"

    -lm  是指连接libm.so     意思是连接数学库, -lnsl  如果涉及RPC编程,必然需要libnsl.so,因此必须在编译选项里加入 -lnsl.      gcc 编译选项 -L是要 ...

  6. 从HTML原型到jsp页面完美转型攻略(教你即使不会写代码也能弄出漂亮的网页)

    大家都知道软件项目(web)开发之前都要先做原型设计,而我们使用的比较多的一款原型设计软件就是Axure rp了.在Axure rp上画原型不需要任何编码能力,而且生成的原型可以在浏览器上运行.除了没 ...

  7. editplus中使用emmet?

    要用emmet生成html类型, 格式是: html:???, 意思是 都是html大类型, 小类型用冒号. 如:html:5, 或者全部都是! 则生成html5的类型文档. emmet是zen co ...

  8. shell学习之路:流程控制(if)

    1.单分支if条件语句 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 注意事项: 1.if语句使用fi结尾,和一般语言使用大括号结尾不同 2.[ ...

  9. C#4.0 特性

    动态绑定 命名和可选参数 泛型的协变和逆变 互操作性 动态支持 Office 可编程性 类型等效性支持 协变和逆变 当类型为dynamic的视图模型遭遇匿名对象 https://msdn.micros ...

  10. QT连接Linux mysql注意

    windows: #define MYSQLDB "QMYSQL"#define MYSQLDB_HOSTNAME "192.168.228.168"#defi ...