1. 程式人生 > >[線段樹][讀入優化][玄學加速]借教室 noip

[線段樹][讀入優化][玄學加速]借教室 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嗎? 好