1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <map> 6 #include <queue> 7 #include <cmath> 8 #include <vector> 9 #include <ctime> 10 #include <cctype> 11 12 using namespace std; 13 14 #define mem0(a) memset(a, 0, sizeof(a)) 15 #define lson l, m, rt << 1 16 #define rson m + 1, r, rt << 1 | 1 17 #define define_m int m = (l + r) >> 1 18 #define Rep(a, b) for(int a = 0; a < b; a++) 19 #define lowbit(x) ((x) & (-(x))) 20 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {} 21 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {} 22 23 typedef double db; 24 typedef long long LL; 25 26 const int dx[4] = {1, 0, -1, 0}; 27 const int dy[4] = {0, -1, 0, 1}; 28 const int maxn = 1e4 + 7; 29 const int maxm = 1e5 + 7; 30 const int MD = 1e9 +7; 31 32 struct Point { 33 int x, y; 34 bool operator < (const Point &opt) const { 35 return x < opt.x || x == opt.x && y < opt.y; 36 } 37 Point operator - (const Point &opt) const { 38 return Point(x - opt.x, y - opt.y); 39 } 40 constructInt2(Point, x, y); 41 void inp() { 42 scanf("%d %d", &x, &y); 43 } 44 void outp() { 45 printf("(%d, %d), ", x, y); 46 } 47 }; 48 49 struct Trie { 50 const static int char_size = 26; 51 int cc; 52 int cht[100010][char_size]; 53 int mark[100010]; 54 Trie() { cc = 0; mem0(mark); mem0(cht); } 55 int Idex(char ch) { return ch - ‘0‘; } 56 void Insert(char s[], int v) { 57 int pos = 0; 58 for(int i = 0; s[i]; i++) { 59 int id = Idex(s[i]); 60 if(!cht[pos][id]) cht[pos][id] = ++cc; 61 pos = cht[pos][id]; 62 } 63 mark[pos] = v; 64 } 65 bool Find(char s[]) { 66 int pos = 0; 67 for(int i = 0; s[i]; i++) { 68 int id = Idex(s[i]); 69 if(!cht[pos][id]) return 0; 70 pos = cht[pos][id]; 71 } 72 return mark[pos]; 73 } 74 }; 75 76 struct KMP { 77 int next[1000010]; 78 void GetNext(char s[]) { 79 mem0(next); 80 next[0] = next[1] = 0; 81 for(int i = 1; s[i]; i++) { 82 int j = next[i]; 83 while(j && s[i] != s[j]) j = next[j]; 84 next[i + 1] = s[j] == s[i]? j + 1 : 0; 85 } 86 } 87 void Match(char s[], char t[]) { 88 int j = 0, len = strlen(t); 89 for(int i = 0; s[i]; i++) { 90 while(j && s[i] != t[j]) j = next[j]; 91 if(s[i] == t[j]) j++; 92 if(j == len) printf("%d\n", i - len + 1); 93 } 94 } 95 }; 96 97 struct Matrix { 98 int a[3][3]; 99 Matrix operator * (const Matrix &_A) const { 100 Matrix tmp; 101 mem0(tmp.a); 102 for(int i = 0; i < 3; i++) { 103 for(int j = 0; j < 3; j++) { 104 for(int k = 0; k < 3; k++) { 105 tmp.a[i][j] = ((LL)a[i][k] * _A.a[k][j] + tmp.a[i][j]) % MD; 106 } 107 } 108 } 109 return tmp; 110 } 111 }; 112 113 struct Edge { 114 int u, v; 115 constructInt2(Edge, u, v); 116 }; 117 118 struct Segment { 119 Point a, b; 120 void inp() { 121 scanf("%d%d%d%d", &a.x, &a.y, &b.x, &b.y); 122 if(a.x > b.x) { 123 swap(a.x, b.x); 124 swap(a.y, b.y); 125 } 126 } 127 }; 128 129 Matrix CalcMatrix(Matrix a, int n) { 130 if(n == 1) return a; 131 Matrix tmp = CalcMatrix(a, n >> 1); 132 tmp = tmp * tmp; 133 if(n & 1) tmp = tmp * a; 134 return tmp; 135 } 136 137 inline int ReadInt() { 138 char c = getchar(); 139 while(!isdigit(c)) c = getchar(); 140 141 int x = 0; 142 while(isdigit(c)) { 143 x = x * 10 + c - ‘0‘; 144 c = getchar(); 145 } 146 return x; 147 } 148 149 inline void WriteInt(int i) { 150 int p = 0; 151 static int buf[10]; 152 if(i == 0) p++; 153 else while(i) { 154 buf[p++] = i % 10; 155 i /= 10; 156 } 157 for(int j = p - 1; j; j--) putchar(‘0‘ + buf[j]); 158 } 159 160 int Cross(Point a, Point b) { 161 return a.x * b.y - a.y * b.x; 162 } 163 164 int Dist2(Point a, Point b) { 165 int x = a.x - b.x, y = a.y - b.y; 166 return x * x + y * y; 167 } 168 int ConvexHull(Point *p, int n, Point *ch) { 169 sort(p, p + n); 170 int m = 0; 171 for (int i = 0; i < n; i++) { 172 while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--; 173 ch[m++] = p[i]; 174 } 175 int k = m; 176 for (int i = n - 2; i >= 0; i--) { 177 while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--; 178 ch[m++] = p[i]; 179 } 180 if (n > 1) m--; 181 return m; 182 } 183 184 template<class edge> struct Graph { 185 vector<vector<edge> > adj; 186 Graph(int n) { adj.clear(); adj.resize(n + 5); } 187 Graph() { adj.clear(); } 188 void resize(int n) { adj.resize(n + 5); } 189 void add(int s, edge e){ adj[s].push_back(e); } 190 void del(int s, edge e) { adj[s].erase(find(iter(adj[s]), e)); } 191 void clear() { adj.clear(); } 192 vector<edge>& operator [](int t) { return adj[t]; } 193 }; 194 195 template<class T> struct TreeArray { 196 vector<T> c; 197 int maxn; 198 TreeArray(int n) { c.resize(n + 5); c.clear(); maxn = n; } 199 TreeArray() { c.clear(); n = 0; } 200 void resize(int n) { c.resize(n + 5); c.clear(); maxn = n; } 201 void add(int p, T x) { while (p < maxn) { c[p] += x; p += lowbit(p); } } 202 T get(int p) { T res = 0; while (p) { res += c[p]; p -= lowbit(p); return res; } } 203 T range(int a, int b) { return get(b) - get(a - 1); } 204 };
原文:http://www.cnblogs.com/jklongint/p/4368586.html