1. 程式人生 > >Noip前的大抱佛腳----奇技淫巧

Noip前的大抱佛腳----奇技淫巧

STL函式

set

set查詢前驅後繼

multiset<int>::iterator iter;
S.insert(x);
iter=S.find(x);//返回迭代器
iter--;//前驅
int ans=*iter;
S.erase(find(x));
return ans;

或者可以使用\(lower\_bound\)(大於等於)、\(upper\_bound\)(嚴格大於)函式

multiset<int>::iterator iter;
iter=S.upper_bound(x);

需要注意的是,\(iter\)是一個類似指標的東西,\(set\)的結構發生改變時,\(iter\)

所指向的值也會變!

刪除元素

S.erase(iter);//刪除迭代器所指的元素(multiset只刪一個元素)
S.erase(x);//刪除所有的x元素(multiset就能把所有x刪掉)
S.erase(find(x));//只刪一個x

map

map的遍歷

\(C++\)寫法

map<int,int>::iterator iter;
for(iter=Map.begin();iter!=Map.end();iter++)
    int A=iter->first,B=iter.second;

\(C++11\)寫法

for(auto x:Map) cout<<x.first<<" "<<x.second;//返回的是pair

map的查值

\(x\)是否在\(Map\)

1. if(Map[x]!=0) ...
2. if(Map.find(x)!=Map.end()) ...

一定要使用第二種方法,因為若\(x\)不在\(Map\)中,而呼叫\(Map[x]\)的話會自動新增一個結點\((x,0)\),使得常數變大或者發生錯誤

deque

雙端佇列

#include<deque>
deque<int> Q;
Q.push_front(x);
Q.push_back(x);
Q.pop_front(x);
Q.pop_back(x);
Q.size();
!Q.empty();

bitset

值域在\(10^9\)左右的時候用它比Map快得多!!!(10.16被卡常教訓)

空間計算:除以8(嚴格來說\(\lceil\frac{k}{64}\rceil×8\)

結構體

過載運算子

小於號(堆)

struct food
{
    int id,tim; 
    bool operator <  (const food &b)const
        {return tim>b.tim;} 
    //表示按tim從小到大排序(因為預設是大根堆,不清楚可以試試,注意兩個const)
};

高精度以及矩陣乘法

struct BigNum
{
    int a[110],w;
    BigNum () {memset(a,0,sizeof(a));w=0;}//表示一呼叫就會執行這個函式
    int &operator [] (int x) {return a[x];}//可以使用A[i]代替A.a[i]
    void operator = (int x)
        {
            memset(a,0,sizeof(a));w=0;
            while(x) {a[++w]=x%10,x/=10;}
            if(!w) a[++w]=0;
        }
    BigNum operator + (BigNum B)
        {
            BigNum C;C.w=max(w,B.w);
            for(int i=1;i<=C.w;i++) C[i]=a[i]+B[i];
            for(int i=1;i<=C.w;i++) C[i+1]+=C[i]/10,C[i]%=10;
            if(C[C.w+1]) C.w++;return C;
        }
}A;
struct Matrix
{
    int a[50][50];
    int* operator [] (int x) {return a[x];}//可以用A[i][j]代替A.a[i][j]
    Matrix () {memset(a,0,sizeof(a));}
    Matrix operator * (Matrix B)
        {
            Matrix C;
            for(int k=1;k<=n;k++)
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        (C[i][j]+=1ll*a[i][k]*B[k][j]%mod)%=mod;
            return C;
        }
}Base,Ans;

淫蕩的操作們

O(1)的long long相乘

ll mul(ll x,ll y,ll p)
{
    x%=p;y%=p;
    return (x*y-(ll)((long double)x/p*y+0.5)*p+p)%p;
}

奇怪的錯誤點

判斷一個數是否為完全平方數

sqrt返回的是double!!要強制轉成int才行

String等不定長陣列的使用

在呼叫之前一定要判是否在長度範圍內,否則會出現神奇的錯誤

考試時嚴格按照給定的編譯命令

否則就會出現不開O2訪問陣列負下標還拍上了的情況

一些細節

實數有效位數

  • float 8 位
  • double 16 位
  • long double 32 位