洛谷试炼日记(计算几何+图论)(解题报告)

[洛谷P1183]多边形的面积 计算几何入门题 题目描述给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。输入输出格式输入格式:输入文件第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开... 阅读详情


断更两天我错了 真的错了

凸包

P2742 【模板】二维凸包

题目链接
如题,就是一道模板题啦
没啥好说的
AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define vc pt
#define db double
#define rep(i,a,b) for(int i = (a);i <= (b);i ++)
#define _rep(i,a,b) for(int i = (a);i >= (b);i --)
using namespace std;
const int N = 1e5 + 10;
const db eps = 1e-8;
int dcmp(db x){if(fabs(x) <= eps) return 0;return x > 0 ? 1 : -1;}
struct pt{
    db x,y;
    pt(){}
    pt(db x,db y): x(x),y(y) {}
}p[N],s[N];
pt operator - (pt a,pt b){return pt(a.x - b.x,a.y - b.y);}
pt operator + (pt a,pt b){return pt(a.x + b.x,a.y + b.y);}
pt operator * (pt a,db d){return pt(a.x * d,a.y * d);}
db operator * (pt a,pt b){return a.x * b.x + a.y * b.y;}
db len(vc a){return sqrt(a * a);}
db cs(vc a,vc b){return a.x * b.y - a.y * b.x;}

bool Acmp(pt a,pt b){
    if(fabs(a.x - b.x) <= eps) return a.y < b.y;
    return a.x < b.x;
}
int Andrew(pt p[],int n,pt s[]){
    sort(p + 1,p + 1 + n,Acmp);
    s[1] = p[1];
    int m = 1;
    rep(i,2,n){
        while(m > 1 && cs(s[m] - s[m - 1],p[i] - s[m]) <= 0) m -- ;
        s[++ m] = p[i];
    }
    int k = m;
    _rep(i,n - 1,1){
        while(m > k && cs(s[m] - s[m - 1],p[i] - s[m]) <= 0) m --;
        s[++ m] = p[i];
    }
    if(n > 1) m --;
    return m;
}
int main(){
    int n,m;
    scanf("%d",&n);
    rep(i,1,n){scanf("%lf%lf",&p[i].x,&p[i].y);}
    m = Andrew(p,n,s);
    db ans = 0;
    rep(i,1,m){ans += len(s[i] - s[i + 1]);}
    printf("%.2f\n",ans);
    return 0;
}

P3829 [SHOI2012]信用卡凸包

题目链接
好题!其实多动手画画图就能看出来

不难证明,其实就是圆心的凸包长度加上一个圆的周长
AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define db double

using namespace std;
const int N = 1e6 + 10;
const db PI = acos(-1),eps = 1e-10;
struct pt{
    db x,y;
    pt(){}
    pt(db x,db y) : x(x),y(y){}
}p[N],q[N];
pt operator + (pt a,pt b){return pt(a.x + b.x,a.y + b.y);}
pt operator - (pt a,pt b){return pt(a.x - b.x,a.y - b.y);}
pt operator * (pt a,db d){return pt(a.x * d,a.y * d);}
db operator * (pt a,pt b){return a.x * b.x + a.y * b.y;}
bool operator < (const pt& a,const pt& b){
    return a.x == b.x ? a.y < b.y : a.x < b.x;
}
db cs(pt a,pt b){return a.x * b.y - a.y * b.x;}
db cs(pt a,pt b,pt c){return (b - a).x * (c - a).y - (b - a).y * (c - a).x;}
db len(pt a){return sqrt(a * a);}
pt rt(pt a,db t){
    db c = cos(t),s = sin(t);
    return pt(a.x * c - a.y * s, a.x * s + a.y * c);
}

int main(){
    int n,cnt = 0;
    db a,b,r,x,y,t;
    scanf("%d%lf%lf%lf",&n,&a,&b,&r);
    a /= 2,b /= 2;
    for(int i = 1;i <= n;i ++){
        scanf("%lf%lf%lf",&x,&y,&t);
        pt cen = pt(x,y);
        p[++ cnt] = rt(pt(b - r,a - r),t) + cen;
        p[++ cnt] = rt(pt(b - r,r - a),t) + cen;
        p[++ cnt] = rt(pt(r - b,r - a),t) + cen;
        p[++ cnt] = rt(pt(r - b,a - r),t) + cen;
    }
    sort(p + 1, p + cnt + 1);
    int m = 0;
    for(int i = 1;i <= cnt;i ++){
        while(m > 1 && cs(q[m - 1],q[m],p[i]) <= 0) m --;
        q[++ m] = p[i];
    }
    int k = m;
    for(int i = cnt - 1;i >= 1;i --){
        while(m > k && cs(q[m - 1],q[m],p[i]) <= 0) m --;
        q[++ m] = p[i];
    }
    db ans = 2 * PI * r;
    for(int i = 1;i < m;i ++) ans += len(q[i] - q[i + 1]);
    printf("%.2f\n",ans);
    return 0;
}

旋转卡壳

P1452 [USACO03FALL]Beauty Contest G /【模板】旋转卡壳

题目链接
又是一道模板题呢
AC代码:

#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;
const int N = 5e5 + 10;
int n,m;
struct Point{
    int x,y;
    Point(){}
    Point(int x,int y) : x(x),y(y){}
    int length(){
        return x * x + y * y;
    }
    Point operator - (const Point& b)const{return Point(x - b.x,y - b.y);}
    bool operator < (const Point& b){
        if(x == b.x) return y < b.y;
        return x < b.x;
    }
};

int dis(Point& a,Point& b){
    return (b - a).length();
}

int cross(Point& a,Point& b,Point& c){
    return (b - a).x * (c - a).y - (b - a).y * (c - a).x;
}
Point p[N],st[N];
void Andrew(){
    sort(p,p + n);
    for(int i = 0;i < n;i ++){
        while(m > 1 && cross(st[m - 2],st[m - 1],p[i]) <= 0) m --;
        st[m ++] = p[i];
    }
    int k = m;
    for(int i = n - 2;i >= 0;i --){
        while(m > k && cross(st[m - 2],st[m - 1],p[i]) <= 0) m --;
        st[m ++] = p[i];
    }
    if(n > 1) m --;
}
void Rotating_Calipers(){
    int cur = 1;int ans = 0;
    for(int i = 0;i < m;i ++){
        while(cross(st[i],st[i + 1],st[cur]) < cross(st[i],st[i + 1],st[cur + 1]))
            cur = (cur + 1) % m;
        ans = max(ans,max(dis(st[i],st[cur]),dis(st[i + 1],st[cur])));
    }
    printf("%d\n",ans);
}

int main(){
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) scanf("%d%d",&p[i].x,&p[i].y);
    Andrew();
    Rotating_Calipers();
}

P3187 [HNOI2007]最小矩形覆盖

题目链接
首先不难想到,最小矩形的一条边肯定与凸包的某一条边重合 那么我们就可以枚举凸包的每一条边然后旋转卡壳求一下对踵点 然后更新一下答案就行
记得防止输出负零(切记)
AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define db double
#define vc pt
using namespace std;
const int N = 5e4 + 10;
const db eps = 1e-8;
int dcmp(double x){return x < -eps ? -1 : x > eps;}
struct pt{
    db x,y;
    pt(){}
    pt(db x,db y): x(x),y(y){}
    bool operator < (const pt& b)const{return !dcmp(y - b.y) ? x < b.x : y < b.y;}
}p[N],s[N],t[5];
typedef pt vc;
vc operator + (vc a,vc b){return vc(a.x + b.x,a.y + b.y);}
vc operator - (pt a,pt b){return vc(a.x - b.x,a.y - b.y);}
vc operator * (vc a,db d){return vc(a.x * d,a.y * d);}
db operator * (vc a,vc b){return a.x * b.x + a.y * b.y;}
db cs(vc a,vc b){return a.x * b.y - a.y * b.x;}
db cs(pt a,pt b,pt c){return (b - a).x * (c - a).y - (b - a).y * (c - a).x;}
db len(vc a){return sqrt(a * a);}

int n,m;
bool Gcmp(pt a,pt b){
    db k = cs(a - p[1],b - p[1]);
    if(fabs(k) < eps) return len(p[1] - a) < len(p[1] - b);
    return k > 0;
}
void Graham(){
    for(int i = 2;i <= n;i ++) if(p[i] < p[1]) swap(p[i],p[1]);
    sort(p + 2,p + n + 1,Gcmp);
    s[++ m] = p[1];
    for(int i = 2;i <= n;i ++){
        while(m > 1 && cs(s[m] - s[m - 1],p[i] - s[m]) < eps) m --;
        s[++ m] = p[i];
    }
    s[0] = s[m];
}
db ans = 1e60;
void solve(){
    int l = 1,r = 1,p = 1;
    db L,R,D,H;
    for(int i = 0;i < m;i ++){
        D = len(s[i] - s[i + 1]);
        while(cs(s[i],s[i + 1],s[p + 1]) - cs(s[i],s[i + 1],s[p]) > - eps) p = (p + 1) % m;
        while((s[i + 1] - s[i]) * (s[r + 1] - s[i]) - (s[i + 1] - s[i]) * (s[r] - s[i]) > -eps) r = (r + 1) % m;
        if(i == 0) l = r;
        while((s[i + 1] - s[i]) * (s[l + 1] - s[i]) - (s[i + 1] - s[i]) * (s[l] - s[i]) < eps) l = (l + 1) % m;
        L = (s[i + 1] - s[i]) * (s[l] - s[i]) / D;
        R = (s[i + 1] - s[i]) * (s[r] - s[i]) / D;
        H = cs(s[i],s[i + 1],s[p]) / D;
        if(H < 0) H = -H;
        db tmp = (R - L) * H;
        if(tmp < ans){
            ans = tmp;
            t[0] = s[i] + (s[i + 1] - s[i]) * (R / D);
            t[1] = t[0] + (s[r] - t[0]) * (H / len(t[0] - s[r]));
            t[2] = t[1] - (t[0] - s[i]) * ((R - L) / len(s[i] - t[0]));
            t[3] = t[2] - (t[1] - t[0]);
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++) scanf("%lf%lf",&p[i].x,&p[i].y);
    Graham();
    solve();
    printf("%.5lf\n",ans);
    int fir = 0;
    for(int i = 1;i <= 3;i ++) if(t[i] < t[fir]) fir = i;
    for(int i = 0;i <= 3;i ++)
        printf("%.5lf %.5lf\n",fabs(t[(i + fir) % 4].x) > 1e-12?t[(i + fir) % 4].x : 0.00000,fabs(t[(i + fir) % 4].y) > 1e-12 ? t[(i + fir) % 4].y : 0.00000);
    return 0;
}

半平面交

P3256 [JLOI2013]赛车

题目链接
就是在直角坐标系第一象限中画一下位移和时间图像 然后自己加上去四条直线求个半平面交就行 注意限度取大,精度取小
AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define db long double
#define vc pt
using namespace std;
const int N = 1e5 + 10;
const long long lim = 1e18 + 10;
const db eps = 1e-18;
int n,m,cnt,num,l,r,ans[N];
db k[N],w[N];
int dcmp(db x){return x < -eps ? -1 : x > eps;}
struct pt{
    db x,y;
    pt(){}
    pt(db x,db y) : x(x),y(y){}
}sta[N];
vc operator + (pt a,pt b){return vc(a.x + b.x,a.y + b.y);}
vc operator - (pt a,pt b){return vc(a.x - b.x,a.y - b.y);}
vc operator * (vc a,db d){return vc(a.x * d,a.y * d);}
db operator * (vc a,vc b){return a.x * b.x + a.y * b.y;}
db cs(vc a,vc b){return a.x * b.y - a.y * b.x;}
struct line{
    pt x,y;int id;
    double deg;
    line(){}
    line(pt x,pt y,int id) : x(x),y(y),id(id) {deg = atan2((y - x).x,(y - x).y);}
}L[N],q[N];
bool oR(pt p,line a){return dcmp(cs(p - a.x,a.y - a.x) - eps) > 0;}
pt lip(line a,line b){//line_intersecton_point
    vc v = a.y - a.x, u = b.y - b.x,w = a.x - b.x;
    db t = cs(w,u) / cs(u,v);
    return a.x + v * t;
}
bool HPIcmp(line a,line b){
    if(dcmp(a.deg - b.deg) == 0) return oR(b.x,a);
    return a.deg < b.deg;
}
int HPI(){//half_plane_intersection
    sort(L + 1,L + cnt + 1,HPIcmp);
    l = 1,r = 1;q[1] = L[1];
    for(int i = 2;i <= cnt;i ++){
        if(!dcmp(L[i].deg - L[i - 1].deg)) continue;
        while(l < r && oR(sta[r - 1],L[i])) r --;
        while(l < r && oR(sta[l],L[i])) l ++;
        q[++ r] = L[i];
        if(l < r) sta[r - 1] = lip(q[r],q[r - 1]);
    }
    while(l < r && oR(sta[r - 1],q[l])) r --;
    while(l < r && oR(sta[l],q[r])) l ++;
    sta[r] = lip(q[l],q[r]);
    if(r - l + 1 <= 1) return 0;
    return r - l + 1;
}

void solve(){
    for(int i = l;i <= r;i ++){
        for(int j = 1;j <= n;j ++){
            if(w[j] == w[q[i].id] && k[j] == k[q[i].id])
                ans[++ num] = j;
        }
    }
    sort(ans + 1, ans + num + 1);
    cout << num << endl;
    for(int i = 1;i <= num;i ++) cout << ans[i] << " ";
    cout << endl;
}
int main(){
    cin >> n;
    for(int i = 1;i <= n;i ++) cin >> w[i];
    for(int i = 1;i <= n;i ++) cin >> k[i];
    pt a = pt(0,0),b = pt(lim,0);
    pt c = pt(lim,lim),d = pt(0,lim);
    L[++ cnt] = line(a,b,0),L[++ cnt] = line(b,c,0);
    L[++ cnt] = line(c,d,0),L[++ cnt] = line(d,a,0);
    for(int i = 1;i <= n;i ++){
        pt a = pt(0,w[i]),b = pt(1,w[i] + k[i]);
        L[++ cnt] = line(a,b,i);
    }
    m = HPI();
    solve();
    return 0;
}

P2600 [ZJOI2008]瞭望塔

题目链接
看到n<=300 直接暴力
首先枚举一下每一个点求一个最小高度
再枚举一下任意两条直线的交点求最小高度
可能有人会想(比如我)诶任意两条直线交点不就包含每一个点了吗
那起点和终点呢…
AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define rep(i,a,b) for(int i = (a);i <= (b);i ++)
#define _rep(i,a,b) for(int i = (a);i >= (b);i --)
#define db double
using namespace std;
const int N = 310;
const db INF = 99999999999.0;
struct line{
    db k,b;
    line(){}
    line(db k,db b) : k(k),b(b) {}
}l[N];
int n;db x[N],y[N];
db work(db x){
    db ans = 0;
    rep(i,1,n - 1) ans = max(ans,l[i].k * x + l[i].b);
    return ans;
}
int main(){
    scanf("%d",&n);
    rep(i,1,n) scanf("%lf",&x[i]);
    rep(i,1,n) scanf("%lf",&y[i]);
    rep(i,1,n - 1){
        db k = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
        db b = - k * x[i] + y[i];
        l[i] = line(k,b);
    }
    db ans = INF;
    rep(i,1,n) ans = min(ans,work(x[i]) - y[i]);
    rep(i,1,n - 1){
        rep(j,i + 1,n - 1){
            db o = (l[j].b - l[i].b) / (l[i].k - l[j].k);
            rep(k,1,n - 1){
                if(x[k] <= o && o <= x[k + 1]){
                    ans = min(ans,work(o) - l[k].k * o - l[k].b);
                }
            }
        }
    }
    printf("%.3f",ans);
    return 0;
}

P4196 [CQOI2006]凸多边形 /【模板】半平面交

题目链接
怎么又是模板题 难的又不会做只能做模板题啦
AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;
typedef double db;
const int N = 1e3 + 10;
const double eps = 1e-10;
int n,m,sum;
struct pt{
    db x,y;
    pt () {}
    pt(db x,db y) : x(x),y(y) {}
    void rd(){scanf("%lf%lf",&x,&y);}
}p[N],q[N];
typedef pt vc;
vc operator + (pt a,pt b){return vc(a.x + b.x,a.y + b.y);}
vc operator - (pt a,pt b){return vc(a.x - b.x,a.y - b.y);}
vc operator * (vc a,db d){return vc(a.x * d,a.y * d);}
db operator * (vc a,vc b){return a.x * b.x + a.y * b.y;}
db cross(vc a,vc b){return a.x * b.y - a.y * b.x;}
struct line{
    pt p;vc v;
    db deg;
    line(){}
    line(pt p,vc v) : p(p),v(v){deg = atan2(v.y,v.x);}
    bool operator < (const line& b)const{return deg < b.deg;}
}l[N],s[N];
pt lip(line a,line b){//line_intersection_point
    vc u = a.p - b.p;
    db t = cross(u,b.v) / cross(b.v,a.v);
    return a.p + a.v * t;
}
int hd,tl;
void hpi(){//half_plane_intersection
    sort(l + 1,l + sum + 1);
    hd = 1,tl = 1;
    s[hd] = l[1];
    for(int i = 2;i <= sum;i ++){
        while(hd < tl && cross(l[i].v,q[tl - 1] - l[i].p) <= eps) tl --;
        while(hd < tl && cross(l[i].v,q[hd] - l[i].p) <= eps) hd ++;
        s[++ tl] = l[i];
        if(fabs(cross(s[tl].v,s[tl - 1].v)) <= eps){
            tl --;
            if(cross(s[tl].v,l[i].p - s[tl].p) > eps) s[tl] = l[i];
        }
        if(hd < tl){
            q[tl - 1] = lip(s[tl - 1],s[tl]);
        }
    }
    while(hd < tl && cross(s[hd].v,q[tl - 1] - s[hd].p) <= eps) tl --;
    if(tl - hd <= 1)return;
    q[tl] = lip(s[hd],s[tl]);
}
void solve(){
    db ans = 0;
    for(int i = hd;i <= tl;i ++){
        int tt = i + 1;
        if(i == tl) tt = hd;
        ans += cross(q[i],q[tt]);
    }
    printf("%.3f\n",ans / 2);
}

int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++){
        scanf("%d",&m);
        for(int j = 1;j <= m;j ++) p[j].rd();
        for(int j = 1;j <= m;j ++){
            int tt = j + 1;
            if(j == m) tt = 1;
            l[++ sum] = line(p[j],p[tt] - p[j]);
        }
    }
    hpi();
    solve();
    return 0;
}

图论

P2661 [NOIP2015 提高组] 信息传递

题目链接
看到这种题就不要想着爆搜了
用点技巧 比如并查集判环
AC代码:

#include<iostream>
#include<cstdio>
#define rep(i,a,b) for(int (i) = (a);(i) <= (b);(i) ++)
using namespace std;
const int N = 2e5 + 10;
int fa[N];
int getf(int x,int& cnt){
    cnt ++;
    return x == fa[x] ? x : getf(fa[x],cnt);
}
int n;
int main(){
    scanf("%d",&n);
    rep(i,1,n) fa[i] = i;
    int ans = 0x3f3f3f3f;
    rep(i,1,n){
        int cnt = 0,x;
        scanf("%d",&x);
        if(getf(x,cnt) == i) ans = min(ans,cnt);
        else fa[i] = x;
    }
    printf("%d",ans);
    return 0;
}

P2921 [USACO08DEC]Trick or Treat on the Farm G

题目链接
两道题好像啊 但是我还是不会
看了题解真的好强
就是用一个h[]数组记录一下一个环内的糖果数
因为一只牛想要停下来必须得进入某一个环里
s[]记录到达某个房间的糖果数就好了
如果一个点被经过了两次,那么这个环的糖果数就是当前减去s[now]
具体细节看代码,回溯的时候可以把环内的节点都做一下标记,即更新h[]数组
AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(int (i) = (a);(i) <= (b);(i) ++)
using namespace std;
const int N = 1e5 + 10;
int d[N],h[N],s[N],vis[N],fl;
int dfs(int now,int sum){
    if(h[now]) return sum - 1 + h[now];
    if(vis[now]){
        h[now] = sum - s[now];
        fl = now;
        return sum - 1;
    }
    vis[now] = true;
    s[now] = sum;
    int ans = dfs(d[now],sum + 1);
    if(fl){
        if(fl == now) fl = 0;
        else h[now] = h[fl];
    }
    else h[now] = h[d[now]] + 1;
    vis[now] = false;
    return ans;
}
int main(){
    int n;scanf("%d",&n);
    rep(i,1,n) scanf("%d",&d[i]);
    rep(i,1,n) printf("%d\n",dfs(i,1));
    return 0;
}
cpp-图论算法最小生成树Prim算法和Kruskal算法C实现 图论算法:最小生成树——Prim算法和Kruskal算法C 实现 立即下载

相关推荐

Graph_cpp:C ++图论算法

C ++图论算法

【洛谷 P8720】[蓝桥杯 2020 省 B2] 平面切分 题解(计算几何+集合+向量)

平面上有N条直线, 其中第i条直线是yAi​⋅xBi​。请计算这些直线将平面分成了几个部分。

HEX9CF的技术博客 1436

计算几何(很详细的几何算法材料)

关于几何的算法,讲的很详细,适合初学者。。。。。都是测测

线性代数-向量空间

线性代数学习笔记向量空间 向量空间 向量空间的严格定义: 设 VVV 为一向量组,如果 VVV 非空,且 VVV 对于向量的加法以及数乘两种运算封闭,那么就称 VVV 为 向量空间。 所谓封闭,是指在 VVV 中向量进行数乘和加减,其结果依然在 VVV 中。具体的说,就是: 若 a∈V,b∈V,a \in V, b \in V,a∈V,b∈V, 则 a+b∈Va + b \in Va+b∈V 若 a∈V,k∈R,a \in V, k \in \mathbb{R},a∈V,k∈R, 则 ka∈Vka \i

levin blog 5758

伯德图逆向工程:用MATLAB从扫频数据中提取系统特性的5个关键步骤

本文详细介绍了使用MATLAB从扫频数据中提取系统特性的5个关键步骤,包括数据预处理、频响特性提取、相位解缠绕、系统特性反演和结果验证。通过伯德图逆向工程技术,工程师可以有效分析黑箱系统的频率响应特性,解决噪声干扰和相位跳变等实际问题,提升控制系统调试效率。

weixin_29081163的博客 199

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

洛谷 B4356 [GESP202506 二级] 数三角形

大家好!今天咱们要学习的是洛谷上的一道有趣的编程题 ——B4356 [GESP202506 二级] 数三角形。这道题是 GESP(编程能力等级认证)二级的真题,虽然看起来是几何问题,但实际上考察的是基础的循环嵌套和条件判断能力,非常适合刚接触编程的同学练习。咱们从题目本身出发,一步步理解它的求解思路~cpp运行int n,ans;n:用来存储输入的图形规模(层数);ans:用来作为计数器,统计符合条件的三角形数量,初始值默认为 0(全局变量未初始化时默认值为 0)。这里将变量定义在main。

2501_91189146的博客 1801

DAC8760高精度数模转换器原理与工业级嵌入式应用

数模转换器(DAC)是工业测控系统中实现数字指令到模拟执行的关键接口,其核心性能由分辨率、线性度、温漂及系统级TUE(总未调整误差)共同决定。DAC8760作为一款16位四象限精密DAC,集成了可编程增益放大器(PGA)、内部基准源与SPI高速接口,支持电压/电流双模输出,显著提升闭环控制精度与硬件适配灵活性。其技术价值在于将高精度模拟前端与数字控制深度耦合,满足PLC、ATE及激光偏置等严苛场景对长期稳定性与多通道同步性的要求。本文围绕DAC8760的寄存器配置、HAL/LL驱动实践、PCB布局规范、现场

weixin_42315569的博客 583

洛谷 P3744 李彬的几何 【计算几何】

题目链接 题意: 给出一个凸多边形,点按顺时针给出,每个点可以移动 ddd 的距离,求使这个多边形不再是凸多边形的最小的 ddd 题解: 不难发现,要使一个凸多边形不再凸,就是把一个顶点移到两个的的连线上,要使移动距离最短,那就是移到相邻两个点的连线上,但是每个点都可以移动,如图,点B向相邻两个点的线段AC移动,AC也可以向B移动,所以求出点到直线距离还要÷2÷2÷2 #include<iostream> #include<sstream> #include<string&g

qq_50554695的博客 240

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5975

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 778

洛谷 P1027 Car 的旅行(计算几何)

洛谷 P1027 Car 的旅行(计算几何) 题意 中文题还写个p题意,复制粘贴在这里: 题目 思路 简单粗暴最短路,问题其实在计算几何的部分。每个城市给矩形三个点,然后计算第四个点,只需要先两两组合成向量,看是不是垂直(点积为0),如果是垂直,向量相加就是第四个点和刚才三个点的垂足形成的向量,加上垂足的坐标就是第四个点的坐标了。然后就是两两之间连上边,同一个城市是高铁线路,不同城市间是飞机,...

口丁乙orz各位菊苣口下留情orz口丁乙 414

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 88

洛谷试炼日记(图论)(解题报告)

最近就是图论专题啦 因为图论的题目真的超级多 然后可能没办法做到日更了因为开始上课了 标题

juruo_c的博客 464

ProcessingJoy —— 最简单的实时流体模拟【JAVA】

实现基于非常非常经典的 Paper ——Jos Stam 的Real-Time Fluid Dynamics for Games 代码和注释 float visc = 0.0f; float diff = 0.0f; int N = 250; int size = (N + 2) * (N + 2); float[] u = new float[size]; // 速度, 水平/竖直 float[] v = new float[size]; float[] u_prev = new fl...

ShaderJoy 的兴趣技术杂货铺 2816

Ubuntu开机进入initramfs,解决办法来了!

摘要:Ubuntu系统启动时卡在initramfs界面,表明系统无法正常挂载根文件系统。常见原因包括引导配置错误、文件系统损坏、驱动程序问题和硬件故障。解决方法包括:1)使用fsck修复文件系统;2)通过dmesg排查驱动问题;3)检查硬盘等硬件状态;4)重新安装GRUB引导程序。建议做好系统备份等预防措施,遇到问题时按步骤排查。该问题通常可通过文件系统修复或引导配置重建解决。(148字)

米可的博客! 3421

洛谷试炼日记(manacher和trie树)(解题报告)

文章目录**manacher**P4555 [国家集训队]最长双回文串P1659 [国家集训队]拉拉队排练**Trie字典树**P3879 [TJOI2010]阅读理解P2292 [HNOI2004]L语言P2922 [USACO08DEC]Secret Message GP3065 [USACO12DEC]First! G manacher P4555 [国家集训队]最长双回文串 题目链接 思路:最开始只有一个n^2的思路,不用写都知道会T 看了大佬的思路之后恍然大悟 在求以位置i为中心的最大回文串长度时

juruo_c的博客 301

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

洛谷试炼日记(trie树和AC自动机)(解题报告)

文章目录**Trie树**P4407 [JSOI2009]电子字典P4551 最长异或路径**AC自动机**P5357 【模板】AC自动机(二次加强版)P3121 [USACO15FEB]Censoring G Trie树 P4407 [JSOI2009]电子字典 题目链接 第一次近距离接触树上dfs,之前可能接触过但是没仔细了解,就是用dfs枚举,因为题目说目标串可以改动之后变为字典树里的串 所以对目标串进行dfs就行啦 细节看代码就好 AC代码: #include<iostream> #in

juruo_c的博客 386

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

洛谷试炼日记(trie树,AC自动机,回文自动机)(解题报告)

文章目录**Trie树**P4683 [IOI2008] Type Printer 打印机**AC自动机**P2444 [POI2000]病毒**回文自动机**P5496 【模板】回文自动机(PAM)P3649 [APIO2014]回文串P4287 [SHOI2011]双倍回文 Trie树 P4683 [IOI2008] Type Printer 打印机 题目链接 就是求最小操作数嘛 一开始想太多,其实就是最长的最后打印呗 那就先标记一下最长的那一串 然后dfs先跳过那些最长串经过的节点 最后再枚举最长串的

juruo_c的博客 208

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

洛谷算法竞赛生态全解析:从核心功能到高效学习路径

在线评测系统(OJ)是算法学习和编程竞赛的核心平台,其原理在于通过自动化评测机验证代码的正确性、时间与空间效率。这项技术的价值在于为学习者提供了即时反馈和标准化的训练环境,极大地提升了算法练习的效率与效果。在众多应用场景中,中文算法竞赛社区洛谷构建了一个集题目、评测、社区、教程于一体的完整生态。本文聚焦于洛谷平台,深入剖析其题目系统、评测机制与社区功能等核心模块,并融入题单规划和博客沉淀等实用技巧,旨在帮助用户系统性地提升算法能力,将平台工具价值最大化,从而在算法竞赛与工程实践中建立扎实基础。

weixin_30460489的博客 410

暑期计划

暑期计划 总纲 意义 这是中考前的最后一个暑假,可以用于提高 其后有NOIP提高组的比赛,需要在信息领域快速变强 有大把的时间,可以进行调整,培养习惯 目标 文化 复习,大量的整理 自主预习提高 信息 学习提高组~省选的数据结构、算法和思想 做题+打比赛,达到提高组水平 训练初赛水平,能通过提高组初赛 其他 练字 健身+控制体重 计划 ...

weixin_30527423的博客 148

【洛谷】P3744 - 李彬的几何(计算几何题)

题目链接 题意:求将一个凸多边形移动成非凸多边形的最短距离。 思路:只要有一个角是平角那就不是凸多边形啦。所以就是找到将某一个角变成平角的最短距离。 图示: 其中x为所求距离,直线代表移动后的平角。 利用海伦公式s=p&nbsp;(p−a)(p−b)(p−c)−−−−−−−−−−−−−−−−−−√&nbsp;,&nbsp;其中&nbsp;a&nbsp;,b&nbsp;,c&nbsp;,p...

Dicer_的博客 347

洛谷 P1355 神秘大三角(计算几何基础)

P1355 神秘大三角 题目提供者yeszy 标签 福建省历届夏令营 难度 普及/提高- 题目描述 判断一个点与已知三角形的位置关系。 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) ...

weixin_30951389的博客 216

洛谷日报索引(2020、2019、2018)

历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算)h...

Reflect的博客 7828

P2313 [HNOI2005]汤姆的游戏

题目描述 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣。于是他开始在一张很大很大的白纸上画很多很多的矩形和圆。画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花。汤姆发现爆米花在白纸上看起来就像一个个点,有些点落在矩形或圆内部,而有些则在外面。于是汤姆开始数每个点在多少个矩形或圆内部。毕竟汤姆还只是个孩子,而且点、矩形和圆又非常多。所以汤姆数了好一会都数不清,于是就向聪...

weixin_30706691的博客 224
上一篇: 计算几何初步
下一篇: 洛谷试炼日记(图论)(解题报告)
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值