A:
基排或者快排t的递归拆分
Code:这里用的STL函数
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<double,double> pii; const int N = 5e6+5; const int M = 1e6+5; const int Mod = 1000009; #define pi acos(-1) #define INF 1e8 #define INM INT_MIN #define pb(a) push_back(a) #define mk(a,b) make_pair(a,b) #define dbg(x) cout << "now this num is " << x << endl; #define met0(axx) memset(axx,0,sizeof(axx)); #define metf(axx) memset(axx,-1,sizeof(axx)); #define sd(ax) scanf("%d",&ax) #define sld(ax) scanf("%lld",&ax) #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx) #define sdd(ax,bx) scanf("%d %d",&ax,&bx) #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx) #define sfd(ax) scanf("%lf",&ax) #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx) #define pr(a) printf("%d\n",a) #define plr(a) printf("%lld\n",a) int n,k,a[N]; inline int read() { int x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } int main() { int t;t = read(); while(t--) { n = read(),k = read(); for(int i=1;i<=n;++i) a[i] = read(); nth_element(a+1,a+k-1,a+n+1); pr(a[k]); } // system("pause"); return 0; }
B:
比赛时理解错题意了。
题意:
两两点可以组成线段,且只需要去统计最多能取的不平行且不重合的直线.
注意:一个点可以多次出现。
思路:那么就很简单了。
显然每种斜率的直线只能取其中一条。
直接set统计不同的斜率个数即可,注意特殊处理底数为0.
注意:-k和k不平行!!
Code:
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<double,int> pii; const int N = 5e6+5; const int M = 1e6+5; const int Mod = 1000009; #define pi acos(-1) #define INF 1e8 #define INM INT_MIN #define pb(a) push_back(a) #define mk(a,b) make_pair(a,b) #define dbg(x) cout << "now this num is " << x << endl; #define met0(axx) memset(axx,0,sizeof(axx)); #define metf(axx) memset(axx,-1,sizeof(axx)); #define sd(ax) scanf("%d",&ax) #define sld(ax) scanf("%lld",&ax) #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx) #define sdd(ax,bx) scanf("%d %d",&ax,&bx) #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx) #define sfd(ax) scanf("%lf",&ax) #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx) #define pr(a) printf("%d\n",a) #define plr(a) printf("%lld\n",a) struct Node{double x,y;}a[205]; int main() { int n;sd(n); int num = 0; set<double> S; for(int i=1;i<=n;++i) cin >> a[i].x >> a[i].y; for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(i == j) continue; if(a[i].x-a[j].x == 0) { num++; continue; } double k = (a[i].y-a[j].y)/(a[i].x-a[j].x); S.insert(k); } } int tmp = S.size(); if(num != 0) tmp++; pr(tmp); system("pause"); return 0; }
C:
题意可以转化一下,求两个距离小于总距离/2的最大值。
显然这个值是一段连续的区间
那么可以尺取来找。
因为是环形的,先化环为链,然后尺取去维护连续最大的区间.
Code:
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<double,int> pii; const int N = 1e5+5; const int M = 1e6+5; const int Mod = 1000009; #define pi acos(-1) #define INF 1e8 #define INM INT_MIN #define pb(a) push_back(a) #define mk(a,b) make_pair(a,b) #define dbg(x) cout << "now this num is " << x << endl; #define met0(axx) memset(axx,0,sizeof(axx)); #define metf(axx) memset(axx,-1,sizeof(axx)); #define sd(ax) scanf("%d",&ax) #define sld(ax) scanf("%lld",&ax) #define sldd(ax,bx) scanf("%lld %lld",&ax,&bx) #define sdd(ax,bx) scanf("%d %d",&ax,&bx) #define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx) #define sfd(ax) scanf("%lf",&ax) #define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx) #define pr(a) printf("%d\n",a) #define plr(a) printf("%lld\n",a) int a[N<<1],all = 0; int main() { int n;sd(n); for(int i=1;i<=n;++i) sd(a[i]),all += a[i]; for(int i=n+1;i<=2*n;++i) a[i] = a[i-n]; int L = 0,r = 0,sum = 0,ans = -1; while(L <= r && r <= 2*n) { if(sum*2 <= all) { ans = max(ans,sum); sum += a[r++]; } else { sum -= a[L++]; } } pr(ans); system("pause"); return 0; }
D: