1. 程式人生 > >陣列上的詢問【字首和】

陣列上的詢問【字首和】

Description

給出一個有N個元素的陣列A,元素的值要麼是1,要麼是-1。

給出M次詢問,每次詢問的格式為:L, R,表示求S = A[L] + A[L+1] + ... + A[R]的值。若S 的值為0,輸出"YES",否則輸出"NO"。


Input 第1行:兩個整數N和M(1<=N, M <=100000)
        第2行:N個空格分開的整數,表示陣列的各個元素,保證只含1和-1
        接下來M行,每行兩個整數L,R(1 <=L <= R <=N),表示每個詢問的左右端點
Output 共M行,對每個詢問,若和為0,輸出"YES",否則輸出"NO" Sample Input
5 5
-1 1 -1 1 -1 1 1 2 3 3 5 2 5 1 5
Sample Output
NO
YES
NO
YES
NO

分析:第一眼看到了l,r,還以為是二分,然後仔細讀完題目,覺得好簡單,果斷開始模擬,交上去之後才發現

然後開始想怎麼節省時間,不可能再模擬了,此時我想到的居然是記憶化遞迴,扶額...好吧,我確實沒想到其他東西了,又不是搜尋,深搜超時改廣搜,於是去問老師,然後得解。

其實就是再另外找一個數組存和,舉個例子

陣列a來儲存那個陣列,s來存和,可以:

s[1]=a[1];

s[2]=s[1]+a[2];(前2數之和)

s[3]=s[2]+a[3];(前3數之和)

s[4]=s[3]+a[4];(前4數之和)

我們如果要求2~5,只用將s[5]-s[2-1]即可,s[5]-s[1]=a[1]+a[2]+a[3]+a[4]+a[5]-a[1]=a[2]+a[3]+a[4]+a[5]

是不是很神奇?所以只要學了知識,就能完成許多神奇的事情,知識改變命運          我是說了些什麼心靈雞湯麼

如果還沒有看懂的話,我們再舉個例子

我們如果要求3~6,只用將s[6]-s[3-1]即可,s[6]-s[2]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]-a[1]-a[2]=a[2]+a[3]+a[4]+a[5]+a[6]

那麼,程式碼奉上:(就不寫註釋啦,前面的看懂之後應該分分鐘秒殺啦 //分分鐘還秒殺?

#include<cstdio> 
#include<cmath> 
int n,m,num[100005],s[100005],l,r;
int main()    
{    
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    for(int i=1;i<=n;i++)
        s[i]=s[i-1]+num[i];
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&l,&r);
        if(s[r]-s[l-1]) printf("NO\n");
            else printf("YES\n");
    }
}  


相關推薦

陣列詢問字首

Description給出一個有N個元素的陣列A,元素的值要麼是1,要麼是-1。 給出M次詢問,每次詢問的格式為:L, R,表示求S = A[L] + A[L+1] + ... + A[R]的值。若S 的值為0,輸出"YES",否則輸出"NO"。 Input 第1行:兩

區間偶數異或好題離線樹狀陣列字首前驅思想

【連結】 http://hznu.club/OJ/problem.php?cid=1227&pid=2 【題意】 求區間出現偶數次的數的異或和 【思路】 首先,沒有修改,可以離線查詢,減少複雜度。 其次,我們容易知道的是:區間出現奇數次的數的異或和,即為區間異或和。

Luogu P3941 入陣曲字首By cellur925

題目傳送門 題目大意:給你一個\(n\)*\(m\)的矩陣,每個位置都有一個數,求有多少不同的子矩陣使得矩陣內所有數的和是\(k\)的倍數。 資料範圍給的非常友好233,期望得到的暴力分:75分。前12個點可以用\(O(n^4)\)演算法水過,對於\(<=400\)的有特殊性質2的資料,我們還可

HDU6345子串查詢字首線段樹

題目大意: 題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6345 求給定串 l l

nssl1186-字串數量字首

正題 題目大意 長度為n的字串,有q個詢問,求[l∼r][l\sim r][l∼r]這個區間的最小子串出現次數。 解題思路 這個就是一道坑題 我們可以發現如果有一個長度為2的子串,那麼這個子串前面那

11.2校內測試狀壓矩陣字首樹狀陣列逆序對(題意轉換)

Solution 簽到水題,直接狀壓列舉所有情況算出答案即可。 Code #include<bits/stdc++.h> #define LL long long using namespace std; inline LL read() { LL x =

Karen and Coffee CodeForces - 816B字首思想

題目連結   很好的一道題,剛看到這道題的時候,我們看法各不一,敲了線段樹、還有敲了個狀壓DP的,但是最後T在第9發,然後想到了其他的做法,真的很有意思的字首思想。   看看程式碼吧,會很驚喜的: #include <iostream> #incl

51nod 1065貪心+字首最小正子段最小正子串

思路: 可以參見夾克老爺的回覆的那個帖子:http://bbs.csdn.net/topics/370106383。 對於這類連續序列的問題可以先求出字首和,對於每個位置求某個位置到當前位置和大於1

字首 && 子矩陣的中位數Gym

Step1 Problem: 有一個 n * m 的矩陣,每個位置都有一個值 a[i][j]. 有 q 個詢問。 對於每個詢問給你一個子矩陣: 子矩陣的 左上角(x1, y1),右下角(x2, y2),求該子矩陣的中位數。 中位數:所有

Code Forces 320E三分+字首Weakness and Poorness 最大的區間的絕對值儘可能小

【題意】 給你一個整數數列a1~an 找到一個實數x,使得a1-x,a2-x,…,an-x的weakness儘可能小 一個數列的weakness,是這個數列所有區間poorness的最大值 一個區間的poorness,是這個區間內所有元素和的絕對值

離散+二維字首Gym - 101991D - Dull Chocolates

題目連結<https://cn.vjudge.net/problem/2049045/origin> 題意: 在一個N*M的棋盤中,有K個白子,其他的都是黑子。問有多少個字首和矩陣包含奇數個白子,多少個包含偶數個白子。 (1≤N,M≤1e9,1≤K≤1e3).

高維字首SPOJ(TLE)[Time Limit Exceeded]題解

題目概述 題目名稱要不要這麼奇葩而且和題面沒有半毛錢關係啊,我上交題目都以為自己TLE了。 給出 nn 個數 cici ,現在需要構造 aiai 使得: aimodci>0aimodci&

Java實現排序的方法--List,陣列排序。自定義繼承ComparableComparator

(一)list和陣列①List預設排序程式碼:public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("阿a裡 "

3781. 小B的詢問莫隊

turn 其中 包含 output sigma 共有m個 pre stream tdi Description 小B有一個序列,包含N個1~K之間的整數。他一共有M個詢問,每個詢問給定一個區間[L..R],求Sigma(c(i)^2)的值,其中i的值從1到K,其中c(

洛谷 P2709 小B的詢問 莫隊

加油 ide close turn sample getch pac ID sed 洛谷 P2709 小B的詢問 題目描述 小B有一個序列,包含N個1~K之間的整數。他一共有M個詢問,每個詢問給定一個區間[L..R],求Sigma(c(i)^2)的值,其中i的值從1到

題解 P2068 統計

這是一道單點修改,區間查詢的線段樹。 需要實現的操作有三個:建樹,更新與查詢。 首先,線段樹用結構體維護,如下: 1 struct node { 2 int l, r; 3 int val; 4 } tree[maxn * 4];   其中l, r表示節點所表示區

elementui 傳圖片到七牛雲上面去,可以多張簡單/有效

目的:elementui 上傳多張圖片到七牛雲上面去  第一步:效果說明 七牛雲顯示: 第二步:程式碼 2-1、這裡會用到兩個小東西,一個是 後臺獲取 token,一個是獲取一個隨機不重複字串(uuid用來做上傳檔案的名稱) token 獲取:https

App端待現場核查的申請設計項列表介面經營者資訊按鈕調經營者設計項的編輯介面,並且能夠檢視選中的待現場核查的申請對應的經營者資訊

//前端的程式碼 function(button, e) //App端【經營者資訊】設計項編輯介面上的上的【經營者資訊】按鈕調【法人負責人情況】的編輯介面,並且能夠檢視選中的經營者的申請對應的法人負責人情況   { try{ var m

題解 luogu P2068 統計

小水題 話說rayment大佬噓寒問暖兩天,差點教會我怎麼用splay求區間和。這題我差點就下狠手使用splay了。 線段樹1的退化版,change區間變成了change一個數,延遲標記?不存在! 所以我們只需要簡單建一棵線段樹,然後輕鬆模擬就好了。建樹其實只需要將樹的區間搞出來