[線段樹][讀入優化][玄學加速]借教室 noip
借教室
首先,這是一道水題,線段樹直接敲起
但是!!!!!!
如果,你只是簡單地敲了一份線段樹,你會發現,你會卡兩個至少兩個點!!!
因為讀入會被卡!
於是,你可以使用getchar()來進行玄學加速……
vijos上加速近1000ms!!!!!以下是 借教室 AC程式碼
#include <cstdio>
const int maxind = 1000001;
int sum=-1;
int a[maxind]={0};
struct nodes{
int flag;
int min;
int max;
nodes(void){
this->flag=0 ;
this->min=0;
this->max=0;
}
};
nodes sumsTree[maxind * 4 + 10];
inline void read(int&x){ //玄學加速的開始
char ch=getchar();
x=0;
while (ch>'9'||ch<'0')
ch=getchar();
while (ch<='9'&&ch>='0'){
x*=10;
x+=ch-'0';
ch=getchar();
}
return ;
}
inline int min(int a,int b){
return (a<b)?a:b;
}
inline int max(int a,int b){
return (a>b)?a:b;
}
inline void pushdown(int node){
const int lc=(node<<1),rc=(node<<1)|1;
int flag=sumsTree[node].flag;
sumsTree[lc].flag+=flag;
sumsTree[rc].flag+=flag;
sumsTree[lc].max +=flag;
sumsTree[lc].min+=flag;
sumsTree[rc].max+=flag;
sumsTree[rc].min+=flag;
return ;
}
void build(int node, int begin, int end)
{
if (begin == end){
sumsTree[node].max = a[begin];
sumsTree[node].min = a[begin];
}
else
{
int t=(begin+end)>>1;
build((node<<1), begin, t);
build(node*2|1, t+1, end);
sumsTree[node].min=min(sumsTree[(node<<1)].min,sumsTree[(node<<1)|1].min);
sumsTree[node].max=max(sumsTree[(node<<1)].max,sumsTree[(node<<1)|1].max);
}
}
void add(int node,int begin,int end,const int left,const int right,const int num){
if (begin>right||end<left)
return ;
int t=(begin+end)>>1;
const int lc=(node<<1),rc=(node<<1)|1;
nodes& cur=sumsTree[node];
if (begin>=left&&end<=right)
{
cur.flag+=num;
cur.max+=num;
cur.min+=num;
return ;
}
pushdown(node);
cur.flag=0;
add(lc,begin,t,left,right,num);
add(rc,t+1,end,left,right,num);
cur.max=max(sumsTree[lc].max,sumsTree[rc].max);
cur.min=min(sumsTree[lc].min,sumsTree[rc].min);
return ;
}
int query(int node,int begin,int end,const int left,const int right,const int num){
if (begin>right||end<left)
return 0;
int t=(begin+end)>>1;
const int lc=(node<<1),rc=(node<<1)|1;
nodes &cur=sumsTree[node];
if (begin>=left&&end<=right)
{
if(cur.max<num) return 0;
if (cur.min>=num) {return end-begin+1;}
if (begin!=end){
pushdown(node);
return query(lc,begin,t,left,right,num)+query(rc,t+1,end,left,right,num);
}
}
pushdown(node);
cur.flag=0;
return query(lc,begin,t,left,right,num)+query(rc,t+1,end,left,right,num);
}
int main(void)
{
int n,m;
read(n);read(m);
// scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
read(a[i]);
build(1,1,n);
for (int i=1;i<=m;i++)
{
char ch=getchar();
int from,to,ds;
while (ch!='Q'&&ch!='A')
ch=getchar();
read(from);read(to);read(ds);
if (ch=='Q'){
add(1,1,n,from,to,ds);
}
// else {
printf("%d\n",query(1,1,n,from,to,ds));
// }
}
return 0;
}
因為很重要所以貼兩遍
inline void read(int&x){ //玄學加速的開始
char ch=getchar();
x=0;
while (ch>'9'||ch<'0')
ch=getchar();
while (ch<='9'&&ch>='0'){
x*=10;
x+=ch-'0';
ch=getchar();
}
return ;
}
相關推薦
[線段樹][讀入優化][玄學加速]借教室 noip
借教室 首先,這是一道水題,線段樹直接敲起 但是!!!!!! 如果,你只是簡單地敲了一份線段樹,你會發現,你會卡兩個至少兩個點!!! 因為讀入會被卡! 於是,你可以使用getchar()來進行玄學加速……
第八屆福建省大學生程式設計競賽-FZU 2277 DFS +線段樹+讀入掛
FZU 2277 Problem 2277 Change Accept: 245 Submit: 1186 Time Limit: 2000 mSec Memory Limit : 262
讀入優化
long har blog () div 需要 logs log class 只能讀入數字,不過這個比scanf快很多,並且對於 long long 類型用I64d,還是用 lld 完全忽略,不需要靠考慮在windows,或Linux系統的差別,主要是快啊!!! 1
【墻裂推薦】讀入優化和輸出優化
return getchar() ret style getchar 決定 推薦 int div 讀入優化: 1 inline int read() 2 { 3 int X=0,w=1; char ch=0; 4 while(ch<‘0‘ || ch
讀入優化~~~(個人學習筆記)
false == 學習 學習筆記 筆記 scanf ios sca tchar 基本模板:inline int read(){ int x=0,w=1; char ch=0; while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)w=-1;ch=
關於讀入優化的最終分析
緩存 文件映射 ice 開始 int 字符 1.4.1 clas man 關於讀入優化的最終分析 摘要 身為一只以卡常為生的蒟蒻,總想著通過一些奇技淫巧來掩飾優化常數。 於是本文章就非正式地從最初的開始到最終的終止來談談在OI種各種主流、非主流讀入的速度以及利弊。 序言 隨
UOJ#7. 【NOI2014】購票 | 線段樹 凸包優化DP
科學 uil 影響 現在 problem long llb noi cpp 題目鏈接 UOJ #7 題解 首先這一定是DP!可以寫出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\]
LOJ #2537. 「PKUWC 2018」Minimax (線段樹合並 優化dp)
get code define main 有一個 update ems minimax 計數 LOJ #2537. 「PKUWC 2018」Minimax (線段樹合並 優化dp) 題意 : 小 \(C\) 有一棵 \(n\) 個結點的有根樹,根是 \(1\) 號結點,
讀入優化 && 輸出優化
找到 getch oid 優化 include write tex utc getc qwq算是一個板子隨筆吧 快讀我在某大佬的博客中找到了更短的代碼 但是這個寫習慣了就改不了了qwq 其實是我不想改 廢話好多 直接貼代碼 1 //讀入優化 2 inline int
ACM:讀入優化
can net double \n void sig color || tmp 兩個簡單的讀入優化 1 int getin(){ 2 int ans=0;char tmp;bool sign=0; 3 while(!isdigit(tmp=getc
P - Atlantis HDU - 1542(矩形面積並 + 線段樹離散化優化)
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of t
hdu 6183 線段樹的空間優化
題意: 一個空的座標系,有④種操作:①1 x y c表示在(x, y)點染上顏色c;②2 X y1 y2表示查詢在(1, y1)到(X, y2)範圍內有多少種不同的顏色: ③0表示清屏;④3表示程式退出(0<=x, y<=1000000, 0<=c<=50)
讀入優化&&輸出優化
#include<cstdio> int isdigit[300]; void read(int &x) { int f = 1; x = 0; char s = getchar(); while(!isdigit[s]) {if(x
CF 787D 線段樹套堆優化Dij
題目連結:http://codeforces.com/contest/786/problem/B 題意:就是給了n個點,給了m個加邊的關係,有向邊,但是加邊不一定是u->v,可能是u->[l, r]就是u到[l, r]區間裡面的每一個點都加一條邊,
【原創】整數讀入優化 C++
一、背景 這是某道題目的狀態: 我的程式碼: 大牛的程式碼: 我瞬間萌幣了! 我有這麼慢?Are you kidding me? 點進去一看: void Read(int & p)
更快的讀入優化fread
原來的讀優是這樣寫的: int _read(){ int sum=0;char ch=getchar(); while(!(ch>='0'&&ch<='9'))ch=getchar(); while(
c++讀入優化模板
int getint() { char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); int res=0;
讀入優化新姿勢——學習筆記
震驚!99.9%的oier都不知道。用了此方法,暴力立馬變標算! 最近學習了一個新的函式fread,可以從檔案中整塊讀入資訊,速度很快。基於這個函式,我們可以寫一個新的getchar(): inline char gc(){ static cha
C++getint()讀入優化
第一篇部落格: 快速讀入,C++程式的很實用的一套,處理百萬級資料。 int getint(){ int w=0,q=0; char c=getch
讀入優化&輸出優化
注意了注意了注意了,重要的事情說3遍,這個東西是騙分神器,騙分神器,騙分神器!!! 眾所周知:scanf比cin快得多,printf比cout快得多,如果你不知道就……就現在知道了 那有沒有更快的呢?當然。 請看: 我懵逼了,至於慢近100ms嗎? 好