https://blog.csdn.net/yanhu6955/article/details/81217308
为什么是素数:https://blog.csdn.net/qq_41608020/article/details/81213481
https://www.cnblogs.com/tiberius/p/9375743.html
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int p = 47; 5 const int N = p * p; 6 int ans[N + 5][N + 5]; 7 8 int main(){ 9 puts("2000"); 10 ///(p*p) * (p*p) -> 0...p*p - 1 row(x) + (0...p-1),(p...2p-1),... group(k = x / p) , row -> i = 0...p-1 team(i). 11 for(int x = 0; x < N; x++){///row 12 int k = x / p;///k*i(offset->last row) 0...p-1|0, p...2p-1|2, 2p...3p-1|2, ...|(k=x/p). 13 int b = x % p; 14 for(int i = 0; i < p; i++){ 15 int y = i * p ///inline offset. 16 + (k * i + b) % p; 17 ans[x][y] = 1; 18 } 19 } 20 for(int i = 0; i < 2000; i++){ 21 for(int j = 0; j < 2000; j++) 22 printf("%d", ans[i][j]); 23 puts(""); 24 } 25 return 0; 26 }
1 ///4 ways to solve inv pair. 2 ///https://blog.csdn.net/haolexiao/article/details/54989306 3 4 #include <bits/stdc++.h> 5 using namespace std; 6 7 const int N = 1e5 + 5; 8 int num[N]; 9 long long cnt; 10 int temp[N];/// 11 void Merge(int left, int mid, int right) 12 { 13 ///int temp[N];///TLE 14 int i = left, j = mid + 1, k = left; 15 while(i <= mid&&j <= right) 16 { 17 if (num[i] > num[j]) 18 { 19 cnt += mid - i + 1; 20 temp[k++] = num[j++]; 21 } 22 else 23 temp[k++] = num[i++]; 24 } 25 while (i <= mid) temp[k++] = num[i++]; 26 while (j <= right) temp[k++] = num[j++]; 27 for (i = left; i <= right; i++) 28 num[i] = temp[i]; 29 } 30 31 void mergeSort(int left, int right) 32 { 33 if (left < right) 34 { 35 int mid = (left + right) / 2; 36 mergeSort(left, mid); 37 mergeSort(mid + 1, right); 38 Merge(left, mid, right); 39 } 40 } 41 42 int main() 43 { 44 int n, x, y; 45 while(~scanf("%d%d%d",&n, &x, &y)) 46 { 47 for(int j = 0; j < n; j++) 48 scanf("%d", &num[j]); 49 cnt = 0; 50 mergeSort(0, n-1);/// 51 long long ans=cnt*min(x,y); 52 printf("%lld\n", ans); 53 } 54 return 0; 55 56 } 57 /*#include<bits/stdc++.h> 58 using namespace std; 59 typedef long long ll; 60 ll x,y,n; 61 const int maxn= 500005; 62 ll aa[maxn];//离散化后的数组 63 ll c[maxn]; //树状数组 64 65 struct Node 66 { 67 int v; 68 int order; 69 }a[maxn]; 70 71 bool cmp(Node a, Node b) 72 { 73 if(a.v == b.v) return a.order < b.order; 74 ///if a.v == b.v, the order shouldn't be changed.WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaa!!!!!!!!!!! 75 ///or 76 return a.v < b.v; 77 } 78 79 int lowbit(int k) 80 { 81 return k&(-k); 82 } 83 84 void update(int t, int value) 85 { 86 int i; 87 for (i = t; i <= n; i += lowbit(i)) 88 c[i] += value; 89 } 90 91 int getsum(int t) 92 { 93 int i, sum = 0; 94 for (i = t; i >= 1; i -= lowbit(i)) 95 sum += c[i]; 96 return sum; 97 } 98 99 int main() 100 { 101 int i; 102 while (scanf("%lld%lld%lld",&n,&x,&y)!=EOF) 103 { 104 for (i = 1; i <= n; i++) 105 { 106 scanf("%d", &a[i].v); 107 a[i].order = i; 108 } 109 sort(a + 1, a + n + 1,cmp); 110 memset(c, 0, sizeof(c)); 111 for (i = 1; i <= n; i++) 112 aa[a[i].order] = i; 113 ///right position.(make the same number's aa equal or if(a.v == b.v) return a.order < b.order;(cmp) ). 114 ll ans = 0; 115 for (i = 1; i <= n; i++) 116 { 117 update(aa[i], 1); 118 ans += i - getsum(aa[i]);/// 119 } 120 printf("%lld\n",min(x, y)*ans); 121 } 122 return 0; 123 } 124 125 */ 126 /* 127 #include <iostream> 128 #include <stdio.h> 129 #include <math.h> 130 #include <string.h> 131 #include <time.h> 132 #include <stdlib.h> 133 #include <string> 134 #include <bitset> 135 #include <vector> 136 #include <set> 137 #include <map> 138 #include <queue> 139 #include <algorithm> 140 #include <sstream> 141 #include <stack> 142 #include <iomanip> 143 using namespace std; 144 #define pb push_back 145 #define mp make_pair 146 typedef pair<int,int> pii; 147 typedef long long ll; 148 typedef double ld; 149 typedef vector<int> vi; 150 #define fi first 151 #define se second 152 #define fe first 153 #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);} 154 #define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);} 155 #define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);} 156 #define es(x,e) (int e=fst[x];e;e=nxt[e]) 157 #define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e]) 158 #define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");} 159 #define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");} 160 #define SZ 666666 161 //orz kczno1 POD only 162 template<typename T> 163 struct vec{T *a;int n;void clear(){n=0;} 164 void pb(const T &x){if((n&-n)==n)a=(T*)realloc(a,(n*2)*sizeof(T));a[n++]=x;} 165 inline T* begin(){return a;}inline T* end() {return a+n;}}; 166 int n,x,y,a[SZ],g[SZ],bs[SZ]; 167 void sol() 168 { 169 for(int i=1;i<=n;++i) bs[i]=0;/// 170 for(int i=1;i<=n;++i) 171 scanf("%d",a+i),g[i]=a[i]; 172 sort(g+1,g+1+n); 173 for(int i=1;i<=n;++i) 174 a[i]=n+1-(lower_bound(g+1,g+1+n,a[i])-g);///the amount of a[j] | a[j]>=a[i]; 175 ///lower_bound!!!(better than sort + struct) 176 //bool cmp(Node a, Node b){ 177 //if(a.v == b.v) return a.order < b.order;///if a.v == b.v, the order shouldn't be changed.WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaa!!!!!!!!!!! 178 //return a.v < b.v; 179 //} 180 ll inv=0; 181 for(int i=1;i<=n;++i) 182 { 183 for(int g=a[i]-1;g>=1;g-=g&-g) inv+=bs[g];///{1...cnt(>)} direct child 184 for(int g=a[i];g<=n;g+=g&-g) ++bs[g];///{cnt(>=a[i])...n} -> g is the direct inv(parent)(who should be smaller than "a[i]"); 185 } 186 printf("%lld\n",min(x,y)*inv); 187 } 188 int main() 189 { 190 while(scanf("%d%d%d",&n,&x,&y)!=EOF) sol(); 191 } 192 193 */
http://www.cnblogs.com/tiberius/p/9369683.html
超棒的思路:维护区间最小值min,以此为标准修改lazy标记,减少更新次数。理不好思路套板子分分钟tle而理直气壮.jpg...q^q...