标签:des style blog http io ar color os sp
B:对于坐标先进行离散化,然后线性的扫一遍,常见的处理方式。
2 5 1 2 2 2 2 4 3 4 5 1000 5 1 1 2 2 3 3 4 4 5 5
3 1
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <math.h> #include <time.h> #include <stack> #include <map> #include <set> #define eps 1e-8 ///#define LL long long #define LL __int64 #define INF 0x3f3f3f #define PI acos(-1) #define mod 1000000007 using namespace std; const int maxn = 200010; int num[maxn]; int dx[maxn]; int lx[maxn]; int ly[maxn]; struct node { int x, y; }f[maxn]; int Find(int x, int n) { int l = 0; int r = n-1; while(l <= r) { int mid = (l+r)/2; if(dx[mid] == x) return mid; if(dx[mid] > x) r = mid-1; else l = mid+1; } return -1; } int main() { int T; cin >>T; while(T--) { int n; int ans = 0; scanf("%d",&n); for(int i = 0; i < n; i++) { scanf("%d %d",&f[i].x, &f[i].y); num[ans++] = f[i].x; num[ans++] = f[i].y; } sort(num, num+ans); int cnt = 0; dx[cnt++] = num[0]; for(int i = 1; i < ans; i++) { if(num[i] == dx[cnt-1]) continue; dx[cnt++] = num[i]; } memset(lx, 0, sizeof(lx)); memset(ly, 0, sizeof(ly)); for(int i = 0; i < n; i++) { int x = Find(f[i].x, cnt); int y = Find(f[i].y, cnt); lx[x]++; ly[y]--; } int Max = 0; int sum = 0; for(int i = 0; i < cnt; i++) { sum += lx[i]; Max = max(sum, Max); sum += ly[i]; } cout<<Max<<endl; } return 0; }C:最长上升子序列的改版,要求在A和B最多可以交换m次的前提下,找到A的一条最长上升子序列。
直接想的话dp(i, j, k)已经交换了i次,位置j处,取A(k == 0)或者取B(k == 1)时的最大长度为多少。
三层会1000*1000*1000TLE到死啊。
有m颗线段树维护每次找到交换了i次位置为j的最长子序列是多少。
2 5 3 5 1 4 2 3 1 2 4 3 1 5 4 5 1 4 2 3 1 2 4 3 1
4 4
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <map> #include <set> #define eps 1e-8 #define M 1000100 #define LL long long //#define LL long long #define INF 0x3f3f3f #define PI 3.1415926535898 #define mod 1000000007 #define rson mid+1, r, rt<<1|1 #define lson l, mid, rt<<1 #define root 0, ans-1, 1 const int maxn = 1001; using namespace std; int dp[maxn][8001]; int dy[2*maxn], dx[2*maxn]; int num1[maxn], num2[maxn]; struct node { int x, y; }f[maxn]; int ans; int Find(int x) { int l = 0; int r = ans-1; while(l <= r) { int mid = (l+r)>>1; if(dy[mid] == x) return mid; else if(dy[mid] < x) l = mid+1; else r = mid-1; } return -1; } int Query(int m, int l, int r, int L, int R, int site) { if(l == L && r == R) return dp[m][site]; int mid = (L+R)>>1; if(r <= mid) return Query(m, l, r, L, mid, site<<1); else if(l > mid) return Query(m, l, r, mid+1, R, site<<1|1); else return max(Query(m, l, mid, L, mid, site<<1), Query(m, mid+1, r, mid+1, R, site<<1|1)); } void Push_UP(int m, int site) { dp[m][site] = max(dp[m][site<<1], dp[m][site<<1|1]); } void Updata(int m, int x, int d, int l, int r, int site) { if(l == r) { dp[m][site] = d; return; } int mid = (l+r)>>1; if(x <= mid) Updata(m, x, d, l, mid, site<<1); else Updata(m, x, d, mid+1, r, site<<1|1); Push_UP(m, site); } int main() { int T; scanf("%d",&T); while(T--) { int n, m; scanf("%d %d",&n, &m); ans = 0; for(int i = 0; i < n; i++) { scanf("%d %d",&f[i].x, &f[i].y); dx[i<<1] = f[i].x; dx[i<<1|1] = f[i].y; } sort(dx, dx+2*n); dy[ans++] = dx[0]; for(int i = 1; i < 2*n; i++) { if(dy[ans-1] == dx[i]) continue; dy[ans++] = dx[i]; } for(int i = 0; i <= m ; i++) for(int j = 0; j <= 4*ans; j++) dp[i][j] = 0; int Max = 0; int sum1, sum2, xans; for(int i = 0; i < n; i++) { int x = Find(f[i].x); int y = Find(f[i].y); xans = 0; if(x) xans = Query(0, 0, x-1, 0, ans-1, 1); num1[0] = xans+1; Max = max(Max, xans+1); for(int j = 1; j <= i+1 && j <= m; j++) { sum1 = 0; sum2 = 0; if(j != i+1) { if(x) sum1 = Query(j, 0, x-1, 0, ans-1, 1); num1[j] = sum1+1; } if(y) sum2 = Query(j-1, 0, y-1, 0, ans-1, 1); num2[j] = sum2+1; xans = max(sum1, sum2); Max = max(Max, xans+1); } for(int j = 0; j <= i+1 && j <= m; j++) { if(j != i+1) Updata(j, x, num1[j], 0, ans-1, 1); if(!j) continue; Updata(j, y, num2[j], 0, ans-1, 1); } } printf("%d\n",Max); } return 0; }
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/xu12110501127/article/details/41673775