过了这么久才来写……

  BC的后两道题好难……(第二道题也不怎么简单……)

1001 Fxx and string

  正着倒着枚举一次就ok

  

#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 10005
char a[N];
int main() {
int T,len,ans;
scanf("%d",&T);
while(T--) {
scanf("%s",a+);
len = strlen(a+);
ans = ;
for(int i = ;i <= len;i++){
if(a[i] != 'y') continue;
for(int k = ;true;k++){
if(i*k*k > len) break;
if(a[i*k]=='r' && a[i*k*k]=='x') ans++;
}
}
for(int i = ;i <= len;i++){
if(a[i] != 'x') continue;
for(int k = ;true;k++){
if(i*k*k > len) break;
if(a[i*k]=='r' && a[i*k*k]=='y') ans++;
}
}
printf("%d\n",ans);
}
return ;
}

  这个题更新数据以后,爆搜肯定挂,比如(1000000,1,100000)

  所以要用dp,dp[x] = min(dp[x-i],dp[x/k]) ,1<=i<=t,容易想明白,但是暴力转移肯定挂,至于线段树,我帮你们写了,也挂……

  所以只能维护单调队列来优化这个dp

  维护[x-t,x-1]之间的单调队列,使其从队头到队尾是递增的,然后正常转移,更新单调队列就可以(单调队列在dp里的用处真的很大)

  单调队列代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<deque>
using namespace std;
const int INF = 1e9;
const int N = 1e6+;
int dp[N],n,k,t;
deque<int> dq; ///维护一个从队尾到队头 递减的队列
int main() {
int T,x;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d",&n,&k,&t);
dp[]=;
while(!dq.empty()) dq.pop_back();
dq.push_back();
for(int i=; i<=n; i++) {
dp[i]=INF;
if(i%k==) dp[i]=min(dp[i],dp[i/k]+);
while(!dq.empty()) {
x=dq.front();
if(x<i-t||x>i-) dq.pop_front();
else break;
}
if(!dq.empty()) dp[i]=min(dp[i],dp[x]+);
while(!dq.empty()) {
x=dq.back();
if(dp[x]>=dp[i]) {
dq.pop_back();
} else break;
}
dq.push_back(i);
}
printf("%d\n",dp[n]);
}
return ;
}

  挂了的线段树代码(笑哭)

#include<iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e6+;
#define lc 2*node
#define rc 2*node+1
#define MAX 1e9
int seg[N*+],dp[N];
void Build(int node,int l,int r){
if(l == r) seg[node] = MAX;
else {
int mid = (l+r)>>;
Build(lc,l,mid);
Build(rc,mid+,r);
seg[node] = min(seg[lc],seg[rc]);
}
}
void Update(int node,int l,int r,int k,int num){
if(l==r) {
seg[node] = num;
return;
}
int mid = (l+r)>>;
if(k <= mid) Update(lc,l,mid,k,num);
else Update(rc,mid+,r,k,num);
seg[node] = min(seg[lc],seg[rc]);
}
int query(int node,int l,int r,int ql,int qr){
int p1,p2;
if(ql > r || qr < l) return MAX;
if(l >= ql && r <= qr) return seg[node];
int mid = (l+r)>>;
p1 = query(lc,l,mid,ql,qr);
p2 = query(rc,mid+,r,ql,qr);
return min(p1,p2);
}
int main()
{
int T,x,k,t;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&x,&k,&t);
Build(,,x);
dp[] = ;
Update(,,x,,dp[]);
for(int i = ;i <= x;i++){
int q = query(,,x,i-t,i-);
dp[i] = q+;
if(i % k == ) dp[i] = min(dp[i],dp[i/k]+);
Update(,,x,i,dp[i]);
}
printf("%d\n",dp[x]);
}
return ;
}

BestCoder Round #89的更多相关文章

  1. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  2. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  3. HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP

    Fxx and game 问题描述   青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...

  4. BestCoder Round #89 Fxx and string

    问题描述 青年理论计算机科学家Fxx得到了一个只包含小写字母的字符串. 字符串的长度为\:nn,下标从1开始,第\:i\:i位的字母为\:s_is​i​​,现在Fxx想知道有多少三元组\:(i,j,k ...

  5. BestCoder Round #89 1002 Fxx and game

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5945 分析: 很容易想到用bfs,然而会超时,几乎是O(xt)了 这里用单调队列优化, 首先反着来,f ...

  6. BestCoder Round #89 1001 Fxx and string

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5944 分析: 竟然 i,j,k成等比数列,即i*k = j*j,还要满足 j|i or j|k. 不防 ...

  7. BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元

    BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy  Init函数 然后统计就ok B. 博弈 题  不懂  推了半天的SG.....  结果这 ...

  8. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  9. Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

随机推荐

  1. 【Zookeeper】源码之序列化

    一.前言 在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信.数据存储中都用到了序列化,下面开始分析. 二.序列化 序列化主要在zook ...

  2. C语言之变量与常量的介绍

    一 标示符 标识符:可以理解为是变量名.名字常量表示法的常量名,但是不仅限于这两个 命名规范: 1.起名要有意义,基本要做到一看名字就知道是用来干嘛的(要求你遵守,但不会报错,希望能够养成这样的好习惯 ...

  3. react入门——慕课网笔记

    一. jsx 1. 被称为语法糖:糖衣语法,计算机语言中添加的某种语法,对语言的功能没有影响,更方便程序员使用,增加程序的可读性,降低出错的可能性 类似的还有(coffeescript,typescr ...

  4. HTML5之Audio音频标签学习

    HTML5中的新元素标签 src:音频文件路径. autobuffer:设置是否在页面加载时自动缓冲音频. autoplay:设置音频是否自动播放. loop:设置音频是否要循环播放. control ...

  5. Codevs 4189 字典

    4189 字典 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n ...

  6. 《数学分析Analysis》の 学习笔记

    >> 皮亚诺(Peano)公理 定义自然数 公理2.1   0是一个自然数. 公理2.2   若n是自然数, 则n++也是自然数. 公理2.3   0不是任何自然数的后继, 即对于每个自然 ...

  7. C# 实验4 数据库

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. 最全js 放大镜效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 获取URL中的参数值

    //获取url中ID的值function getParamByName(name, url) { var match = RegExp('[?&]' + name + '=([^&]* ...

  10. usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)

    经过分析,他看似很多的开灯的方法其实合并起来就只有八个. 首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按). 当一个都不按的时候  当然就只有一种:不按. 当按一下的时候 ...