【BZOJ 4170】 4170: 極光 (CDQ分治)

4170: 極光

Time Limit:?30 Sec??Memory Limit:?512 MB
Submit:?121??Solved:?64

Description

"若是萬一琪露諾(俗稱rhl)進行攻擊,什么都好,冷靜地回答她的問題來吸引她。對方表現出興趣的話,那就慢
慢地反問。在她考慮答案的時候,趁機逃吧。就算是很簡單的問題,她一定也答不上來。" ? ? ? ? ? ? ??
--《上古之魔書》
天空中出現了許多的北極光,這些北極光組成了一個長度為n的正整數數列a[i],遠古之魔書上記載到:2個位置的g
raze值為兩者位置差與數值差的和:
graze(x,y)=|x-y|+|a[x]-a[y]|。
要想破解天罰,就必須支持2種操作(k都是正整數):
Modify x k:將第x個數的值修改為k。
Query x k:詢問有幾個i滿足graze(x,i)<=k。
由于從前的天罰被圣王lmc破解了,所以rhl改進了她的法術,詢問不僅要考慮當前數列,還要考慮任意歷史版本,
即統計任意位置上出現過的任意數值與當前的a[x]的graze值<=k的對數。(某位置多次修改為同樣的數值,按多次
統計)

Input

第1行兩個整數n,q。分別表示數列長度和操作數。
第2行n個正整數,代表初始數列。
第3~q+2行每行一個操作。
N<=40000, 修改操作數<=40000, 詢問操作數<=10000, Max{a[i]}(含修改)<=80000

Output

對于每次詢問操作,輸出一個非負整數表示答案

Sample Input

3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1

Sample Output

2
3
3

HINT

Source

?

?

【分析】

  那個公式是曼哈頓距離的形式,把編號看成x,數值看成y,那就是在二維平面上不斷給你一些點,然后問你距離某個點曼哈頓距離小于等于k的有多少個。

  曼哈頓距離畫出來是一個菱形區域,把它旋轉,即(x,y)->(x-y,x+y),就是一個矩形區域,根據容斥分成4段求前綴。

  那么加一個時間維就是一個經典的CDQ模型啦,三維偏序嘛~

?

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 40010
 8 #define Maxm 50010
 9 
10 struct node {int a,b,c,id,f,ans;}t[Maxn*10];
11 int len=0;
12 int ans[Maxm*10],w[Maxn*10];
13 char s[10];
14 int n,q;
15 
16 void add(int a,int b,int c,int id,int f)
17 {
18     // printf("%d %d %d %d %d\n",a,b,c,id,f);
19     t[++len].a=a;t[len].b=b;t[len].c=c;t[len].id=id;t[len].f=f;
20     t[len].ans=0;
21 }
22 
23 bool cmp(node x,node y) 
24 {
25     if(x.a!=y.a) return x.a<y.a;
26     return (x.b==y.b)?(x.c<y.c):(x.b<y.b);
27 }
28 bool cmp2(int x,int y) {return (t[x].b==t[y].b)?(t[x].c<t[y].c):(t[x].b<t[y].b);}
29 
30 int cc[Maxm*10],nw[Maxm*10];
31 void ad(int x,int y) {for(int i=x;i<=q+1;i+=i&(-i)) cc[i]+=y;}
32 int query(int x) {int as=0;for(int i=x;i>=1;i-=i&(-i)) as+=cc[i];return as;}
33 
34 void ffind(int l,int r)
35 {
36     if(l==r) return;
37     int mid=(l+r)>>1;
38     nw[0]=0;for(int i=l;i<=r;i++) nw[++nw[0]]=i;
39     sort(nw+1,nw+1+nw[0],cmp2);
40     for(int i=1;i<=nw[0];i++)
41     {
42         if(nw[i]<=mid&&t[nw[i]].id==0)
43         {
44             ad(t[nw[i]].c,1);
45         }
46         else if(nw[i]>mid&&t[nw[i]].id!=0)
47         {
48             t[nw[i]].ans+=query(t[nw[i]].c);
49         }
50     }
51     for(int i=l;i<=r;i++) if(i<=mid&&t[i].id==0) ad(t[i].c,-1);
52     ffind(l,mid);ffind(mid+1,r);
53 }
54 
55 int main()
56 {
57     scanf("%d%d",&n,&q);
58     memset(ans,0,sizeof(ans));
59     for(int i=1;i<=n;i++)
60     {
61         int x;scanf("%d",&x);
62         w[i]=x;
63         add(i-x,i+x,1,0,0);
64     }ans[0]=0;
65     for(int i=1;i<=q;i++)
66     {
67         int x,y;
68         scanf("%s%d%d",s,&x,&y);
69         if(s[0]=='Q')
70         {
71             add(x-w[x]+y,x+w[x]+y,i+1,++ans[0],1);
72             add(x-w[x]-y-1,x+w[x]-y-1,i+1,ans[0],1);
73             add(x-w[x]-y-1,x+w[x]+y,i+1,ans[0],-1);
74             add(x-w[x]+y,x+w[x]-y-1,i+1,ans[0],-1);
75         }
76         else
77         {
78             add(x-y,x+y,i+1,0,0);
79             w[x]=y;
80         }
81     }
82     sort(t+1,t+1+len,cmp);
83     ffind(1,len);
84     for(int i=1;i<=ans[0];i++) ans[i]=0;
85     for(int i=1;i<=len;i++) if(t[i].id!=0) ans[t[i].id]+=t[i].f*t[i].ans;
86     // for(int i=1;i<len;i++) printf("%d %d %d %d %d %d\n",t[i].a,t[i].b,t[i].c,t[i].id,t[i].f,t[i].ans);
87     for(int i=1;i<=ans[0];i++) printf("%d\n",ans[i]);
88     return 0;
89 }
View Code

認真地開了數組大小很久還是RE,干脆全部乘10了。。。

?

2017-03-26?16:40:39

轉載于:https://www.cnblogs.com/Konjakmoyu/p/6623209.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動生成web服務器日志解析規則

2019獨角獸企業重金招聘Python工程師標準>>> 當前web服務器的多樣化使得訪問日志的數據清洗變得越來越復雜&#xff0c;企業需要投入專業的數據清洗人員編寫數據清洗規則&#xff08;解析規則或者解析正則&#xff09;&#xff0c;或者需要關心web服務器訪問日志的生…

mybatis一級緩存二級緩存

一級緩存 Mybatis對緩存提供支持&#xff0c;但是在沒有配置的默認情況下&#xff0c;它只開啟一級緩存&#xff0c;一級緩存只是相對于同一個SqlSession而言。所以在參數和SQL完全一樣的情況下&#xff0c;我們使用同一個SqlSession對象調用一個Mapper方法&#xff0c;往往只執…

CMOS Sensor的調試分享

目前&#xff0c;包括移動設備在內的很多多媒體設備上都使用了攝像頭&#xff0c;而且還在以很快的速度更新換代。目前使用的攝像頭分為兩種&#xff1a;CCD(Charge Couple Device電荷偶合器件)和 CMOS(Complementary Metal Oxide Semiconductor互補金屬氧化物半導體)。這兩種各…

利用反射修改final數據域

當final修飾一個數據域時&#xff0c;意義是聲明該數據域是最終的&#xff0c;不可修改的。常見的使用場景就是eclipse自動生成的serialVersionUID一般都是final的。 另外還可以構造線程安全&#xff08;thread safe&#xff09;的immutable類&#xff0c;比如String&#xff0…

mysql簡單創建數據庫權限(待修改備注)

CREATE DATABASE web DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;一、環境&#xff1a;CentOS 6.8mysql 5.6二、背景給外包的工作人員提供我司某臺服務器的 mysql 中某個數據庫的訪問權限。之所以要做限制&#xff0c;是防止他們對我司其他的數據庫非法進行操作。三、…

Centos 能ping通域名和公網ip但是網站不能夠打開,服務器拒絕了請求。打開80端口解決。...

博客搬遷&#xff0c;給你帶來的不便&#xff0c;敬請諒解&#xff01; http://www.suanliutudousi.com/2017/10/29/centos-%E8%83%BDping%E9%80%9A%E5%9F%9F%E5%90%8D%E5%92%8C%E5%85%AC%E7%BD%91ip%E4%BD%86%E6%98%AF%E7%BD%91%E7%AB%99%E4%B8%8D%E8%83%BD%E5%A4%9F%E6%89%93…

ISP 圖像傳感器camera原理

1、Color Filter Array — CFA 隨著數碼相機、手機的普及&#xff0c;CCD/CMOS 圖像傳感器近年來得到廣泛的關注和應用。 圖像傳感器一般都采用一定的模式來采集圖像數據&#xff0c;常用的有 BGR 模式和 CFA 模式。BGR 模式是一種可直接進行顯示和壓縮等處理的圖像數據模式&am…

51nod 1027 大數乘法

1027 大數乘法基準時間限制&#xff1a;1 秒 空間限制&#xff1a;131072 KB 分值: 0 難度&#xff1a;基礎題收藏關注給出2個大整數A,B&#xff0c;計算A*B的結果。 Input第1行&#xff1a;大數A 第2行&#xff1a;大數B (A,B的長度 < 1000&#xff0c;A,B > 0&#xff…

file mmap

do_set_pmd統計參數只會在這里設置&#xff1a; add_mm_counter(vma->vm_mm, MM_FILEPAGES, HPAGE_PMD_NR);但是這貌似都是處理大頁的情況哪&#xff0c;小頁呢&#xff1f; alloc_set_pte中有函數&#xff1a;inc_mm_couter_fast(vma->vm_mm, mm_couter_file(page)&…

Linux鏈接庫三(C跟C++之間動態庫的相互調用)

http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http://www.jb51.net/article/34990.htm C和C之間庫的互相調用 extern "C"的理解&#xff1a; 很多人認為"C"表示的C語言&#xff0c;實際并非如此&…

C#如何開發多語言支持的Winform程序

C# Winform項目多語言實現(支持簡/繁/英三種語言)有很多種方案實現多語言&#xff0c;我在這里介紹一種最簡單最容易理解的&#xff0c;作為教學材題應該從通俗易懂入手。在寫這篇文章之前&#xff0c;本來想用枚舉窗體對象成員的方式設置語言&#xff0c;但是找不到源代碼了&a…

Alpha 沖刺 (2/10)

Alpha 沖刺 &#xff08;2/10&#xff09; 隊名&#xff1a;第三視角 組長博客鏈接 本次作業鏈接 團隊部分 團隊燃盡圖 工作情況匯報 張揚&#xff08;組長&#xff09; 過去兩天完成了哪些任務&#xff1a; 文字/口頭描述&#xff1a; 1、學習qqbot庫&#xff1b; 2、實時保存…

Linux學習之第二課時--linux命令格式及命令概述

命令概述 Linux提供了大量的命令&#xff0c;利用它可以有效地完成大量的工作&#xff0c;如磁盤管理&#xff0c;文件存取&#xff0c;目錄操作&#xff0c;進程管理&#xff0c;文件權限設定等 Linux命令格式 Linux命令的組成部分&#xff1a;命令字 命令選項參數&#xff…

Linux C語言調用C++動態鏈接庫

Linux C語言調用C動態鏈接庫 標簽&#xff1a; C調用C庫 2014-03-10 22:56 3744人閱讀 評論(0) 收藏 舉報 分類&#xff1a; 【Linux應用開發】&#xff08;48&#xff09; 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 如果你有一個c做的動態…

Android實踐 -- 對apk進行系統簽名

對apk進行系統簽名 簽名工具 網盤下載 &#xff0c;需要Android系統的簽名的文件platform.x509.pem 和 platform.pk8 這個兩個文件在Android源碼中的 ./build/target/product/security 目錄下 具體的使用方法&#xff1a; java -jar signapk.jar platform.x509.pem platform.…

Java編寫基于netty的RPC框架

一 簡單概念RPC: ( Remote Procedure Call),遠程調用過程,是通過網絡調用遠程計算機的進程中某個方法,從而獲取到想要的數據,過程如同調用本地的方法一樣.阻塞IO :當阻塞I/O在調用InputStream.read()方法是阻塞的,一直等到數據到來時才返回,同樣ServerSocket.accept()方法時,也…

linux下c和c++互相調用

c調用cpp 創建個目錄 創建4個文件 c.c--c文件 cpp.cpp--c文件 cpp.hh--c聲明文件 Makefile c.c [javascript] view plaincopy#include "cpp.hh" int main() { cpp_fun(); } cpp.cpp [cpp] view plaincopy#include "cpp.hh" #include <stdi…

Applications Manager Docker監控

Docker 是一個流行的開源容器應用程序&#xff0c;允許您將應用程序、應用程序的內部依賴和關聯庫打包到一個單元中。Docker 的主要優點在于單臺機器上的多個 docker 容器共享同一操作系統內核&#xff0c;這可以幫助提升性能和節省大量內存。監控 docker 容器會很困難&#xf…

find

Linux中find常見用法示例 find path -option [ -print ] [ -exec -ok command ] {} \; find命令的參數&#xff1b; pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄&#xff0c;用/來表示系統根目錄。-print&#xff1a; find命令將匹配的文件輸出…

PHP將多個文件中的內容合并為新的文件

function test(){$hostdir iconv("utf-8","gbk","C:\Users\原萬里\Desktop\日常筆記") ; //iconv()轉換編碼方式&#xff0c;將UTF-8轉換為gbk&#xff0c;若是報錯在gbk后加//IGNORE$filesnames scandir($hostdir); …