codeforces 279C Ladder

题意:给你一个长n(1-1e5)数列,和m(1-1e5)个询问,问你l -  r 中是否出现下凹。

解题思路:一开始以为直接找下凹就行,后来发现数组元素相等时比较难处理,所以还是需要一个映射删掉相等的再处理比较好。

解题代码:

 1 // File Name: 279c.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月09日 星期一 08时19分05秒
 4
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25
26 using namespace std;
27 int n ,m ;
28 int a[100005];
29 int dp[100005];
30 int fa[100005];
31 int tmp[100005];
32 int main(){
33     scanf("%d %d",&n,&m);
34     for(int i = 1;i <= n;i ++)
35         scanf("%d",&tmp[i]);
36     int ok = 0 ;
37     int t = 1 ;
38     a[1] = tmp[1];
39     fa[1] = 1;
40     for(int i = 2;i <= n;i ++)
41     {
42         if(tmp[i] == a[t])
43         {
44           fa[i] = t;
45           continue;
46         }else{
47           t ++ ;
48           fa[i] = t;
49           a[t] = tmp[i];
50         }
51     }
52     for(int i = 2;i < t;i ++)
53     {
54           if(a[i] < a[i-1] && a[i] <a[i+1])
55         {
56            dp[i] = 1 ;
57         }
58     }
59     for(int i = 1;i <= t;i ++)
60     {
61       dp[i] = dp[i-1] +dp[i];
62       //printf("%d ",dp[i]);
63     }
64     //printf("\n");
65     int l, r;
66     for(int i = 1;i <= m;i ++)
67     {
68       scanf("%d %d",&l,&r);
69       if(dp[fa[r]-1] - dp[fa[l]] > 0 )
70           printf("No\n");
71       else printf("Yes\n");
72     }
73 return 0;
74 }

时间: 2024-10-10 17:40:53

codeforces 279C Ladder的相关文章

CodeForces 279C Ladder (RMQ + dp)

题意:给定一个序列,每次一个询问,问某个区间是不是先增再降的. 析:首先先取处理以 i 个数向左能延伸到哪个数,向右能到哪个数,然后每次用RQM来查找最大值,分别向两边延伸,是否是覆盖区间. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <c

codeforces 279C C. Ladder(rmq+预处理)

题目连接: codeforces 279C 题目大意: 给出一个序列,m次查询,每次给出一个子串,问这个子串是否满足,中间能够找到一个元素,让这个元素作为前后分别单调的分界. 题目分析: 首先对于每次查询,我们知道分界一定是最大的元素,所以我们可以用rmq预处理出区间最大. 然后为了判断这个区间是否能够通过最大的元素作为分界点而前后单调,我们可以通过预处理,正向和反向分别扫一遍,记录某一个点的为最大元素的能够向左和向右得到的最长的单调子串的长度,然后每次只需要O(1)的判断就可以,判断当前元素最

【Codeforces 279C】Ladder

[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设pre[i]表示i往前一直递增能递增多远 设aft[i]表示i往后一直递增能递增多远 如果aft[l]+pre[r]>=(r-l+1)那么就ok否则no [代码] import java.io.*; import java.util.*; public class Main { static InputReader in; static PrintWriter out; public static void main(String[]

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp