19 南京站+div2思维

news/2024/7/8 0:53:32

D. Meta-set

题意:给定一段长为k的数字组合,每个数组的选取为{0,1,2}。找到三个组合满足每位上的k都相同或者都不相同可称为1队,对于5个组合组成的meta-set,要求其中对数要大于等于2.
思路:
1.可发现每两个组合可确定一个唯一的组合,围绕着这个组合可产生多对meta-set。
2.进一步发现以自己为中心的组合meta-set的个数为x*(x-1)/2.
3.接着就是代码的处理。我是将每个组合变成字符串存了起来,用vector也可以。
思维误区:
开始认为组合的中心是已知的,采用O(n2 )循环,从每个组合开始记录有多少满足条件的对数,
再取C(n,2)累加结果。这是错误的,因为这个组合不作为中心时,可作为边缘加入到其他中心的组合中。

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define eps 1e-7

using namespace std;
int n,k,s[1005][25];
map<string,int>mp,mm;

void solve()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        string ss="";
        for(int j=1;j<=k;j++)
        {
            cin>>s[i][j];ss+='0'+s[i][j];
        }
        mp[ss]=i;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int tmp=0;
        for(int j=i+1;j<=n;j++)
        {
            string ss="";
            for(int g=1;g<=k;g++)
            {
                if(s[i][g]==s[j][g]) ss+='0'+s[i][g];
                else ss+='0'+(3-s[i][g]-s[j][g]);
            }
            mm[ss]++;
            /*
            if(mp[ss]&&mp[ss]>j)
            {
                for(int g=1;g<=k;g++) cout<<s[i][g]<<" ";
                cout<<"gg";
                for(int g=1;g<=k;g++) cout<<s[j][g]<<" ";
                cout<<"kkk  "<<ss<<endl;
                tmp++;
            }
            */
        }
    }
    for(int i=1;i<=n;i++)
    {
        string ss="";
        for(int j=1;j<=k;j++) ss+='0'+s[i][j];
        ans+=(mm[ss]-1)*mm[ss]/2;
    }
    cout<<ans<<endl;
}
signed main()
{
    //int T;cin>>T;
    //while(T--)
        solve();
    return 0;
}

C. Digital Path

去掉注释可跟踪代码的执行。
思路:
1.正常考虑一个点,他可能不是终点,也不是起点,若从它开始向两端深搜,不太可能。
2.换个想法,从终点开始搜索,周围没有比他大的数,开始深搜。
记忆化方程dp[x][y][len]含义:到达x行y列路径长度为len的方案数。若长度>=4,则都记录为4
转移方程:dp[x][y][len]+=dp[nx][ny][len-1],搜索数字比他小1的方格,可由它转移而来
dp[x][y][4]+=dp[nx][ny][4],到达相邻格子的也并非为正好为4
3.若len=1,并且可作为一条路径的起点,则dp[x][y][1]=1,否则为0.

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
#define eps 1e-7
using namespace std;
const int mod=1e9+7;
int n,m,a[1005][1005],dp[1005][1005][5];
bool vis[1005][1005];
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,-1,1};
//判终点
int ch1(int x,int y)
{
    for(int i=1;i<=4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[x][y]==a[nx][ny]-1) return 0;
    }
    return 1;
}
//判起点
int ch2(int x,int y)
{
    for(int i=1;i<=4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[x][y]==a[nx][ny]+1) return 0;
    }
    return 1;
}
int dfs(int x,int y,int len)
{
    if(len==1)
    {
        if(ch2(x,y)) dp[x][y][len]=1; else dp[x][y][len]=0;
        //cout<<x<<" "<<y<<" "<<len<<" "<<dp[x][y][len]<<endl;
        return dp[x][y][len];
    }
    if(dp[x][y][len]!=-1) return dp[x][y][len];
    int tmp=0;
    for(int i=1;i<=4;i++)
    {
        int nx=dx[i]+x,ny=dy[i]+y;
        if(nx<1||nx>n||ny<1||ny>m||a[x][y]!=a[nx][ny]+1) continue;
        tmp=(tmp+dfs(nx,ny,len-1))%mod;
        if(len==4)
        {
            //cout<<nx<<" "<<ny<<endl;
            tmp=(tmp+dfs(nx,ny,len))%mod;
        }
    }
    dp[x][y][len]=tmp%mod;
    //cout<<x<<" "<<y<<" "<<len<<" "<<dp[x][y][len]<<endl;
    return dp[x][y][len];
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
    for(int i=0;i<=n;i++)
        for(int j=0;j<=m;j++) for(int k=0;k<5;k++) dp[i][j][k]=-1;
    int ans=0;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
    {
        if(a[i][j]!=-1&&ch1(i,j))
        {
            //cout<<"gg"<<endl;
            ans=(ans+dfs(i,j,4))%mod;
        }

    }
    cout<<ans<<endl;
}
signed main()
{
    ios;
    //int T;cin>>T;
    //while(T--)
        solve();
    return 0;
}

K. Triangle

看了2个多小时,之前没怎么做过计算几何的题目,本题思路不难,但代码的实现挺难的。这次算积累了一套计算几何的板子,可算距离、点积、叉积、记录直线,判断点在线上(两个条件)
采用向量的方式,不需要考虑斜率不存在的情况。

#include <bits/stdc++.h>
#define int long long
#define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
#define endl '\n'
using namespace std;
const int mod=1e9+7;
const double eps=1e-8;
double x[5],y[5];
struct Point
{
    double x,y;
    Point(){};
    Point(double xx,double yy){x=xx,y=yy;}
    Point operator -(Point B)
    {
        return Point(x-B.x,y-B.y);
    }
}p[5],pos[5];
struct Line
{
    Point p1,p2;
    Line(){};
    Line(Point p11,Point p22){p1=p11,p2=p22;}
}lin[5];
int sgn(double x)
{
    if(abs(x)<eps) return 0;
    return x<0?-1:1;
}
double dis(Point p1,Point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double cross(Point p1,Point p2)
{
    return p1.x*p2.y-p1.y*p2.x;
}
double dot(Point p1,Point p2)
{
    return p1.x*p2.x+p1.y*p2.y;
}
int Pt_on_Line(Point p,Line ln)
{
    return sgn(cross(p-ln.p1,ln.p1-ln.p2))==0&&sgn(dot(p-ln.p1,p-ln.p2))<=0;
}
void solve()
{
    for(int i=1;i<=4;i++) cin>>p[i].x>>p[i].y;
    lin[1]=Line(p[1],p[2]);lin[2]=Line(p[1],p[3]);lin[3]=Line(p[2],p[3]);
    if(Pt_on_Line(p[4],lin[1])==0&&Pt_on_Line(p[4],lin[2])==0&&Pt_on_Line(p[4],lin[3])==0)
    {
        cout<<-1<<endl;return;
    }
    int g=0;
    for(int i=1;i<=3;i++)
    {
        if(Pt_on_Line(p[4],lin[i])==1) {g=i;break;}
    }
    if(g==1) pos[1]=p[3];else if(g==2) pos[1]=p[2];else pos[1]=p[3];
    if(dis(p[4],lin[g].p1)>=dis(p[4],lin[g].p2))
        pos[2]=lin[g].p1,pos[3]=lin[g].p2;
    else
        pos[2]=lin[g].p2,pos[3]=lin[g].p1;
    double tmp=(dis(pos[2],pos[3])/dis(pos[2],p[4]))*0.5;
    double dx=pos[2].x+tmp*(pos[1].x-pos[2].x);
    double dy=pos[2].y+tmp*(pos[1].y-pos[2].y);
    cout<<fixed<<setprecision(12)<<dx<<" "<<dy<<endl;
}
signed main()
{
    ios;   
    int T;cin>>T;
    while(T--)
        solve();
    return 0;
}


http://lihuaxi.xjx100.cn/news/67692.html

相关文章

drf之day07:drf中的视图集,权限类使用,频率类使用,认证源码分析,权限源码分析,鸭子类型

目录标题一&#xff1a;drf中视图集补充二&#xff1a;登录功能知识点补充三&#xff1a;权限类的使用1.思路&#xff1a;四&#xff1a;频率类的使用1.思路&#xff1a;全局配置五.认证源码分析&#xff1a;六.权限源码分析七&#xff1a;鸭子类型1.定义&#xff1a;2.推导一&…

APS高级排产如何帮助帮助企业制定生产计划?

对于物料及产能规划与现场详细作业排程而言&#xff0c;企业常因无法确实掌握生产制造现场实际的产能状况及物料进货时程&#xff0c;而采取有单就接的接单政策与粗估产能的生产排程方式&#xff0c;但又在提高对顾客的服务水平及允诺交期的基本前提下&#xff0c;导致生产车间…

后端整合 Swagger + Knife4j 接口文档

什么是接口文档&#xff1f;写接口信息的文档&#xff0c;每条接口包括&#xff1a; 请求参数响应参数 错误码 接口地址接口名称请求类型请求格式备注 为什么需要接口文档&#xff1f; 有个书面内容&#xff08;背书或者归档&#xff09;&#xff0c;便于大家参考和查阅&…

微服务间的远程接口调用:OpenFeign的使用并理解原理

openFeign能做什么&#xff1f; openFeign是一种声明式、模板化的HTTP客户端。在SpringCloud中使用openFeign&#xff0c;可以做到使用HTTP请求访问远程服务&#xff0c;就像调用本地方法一样的&#xff0c;开发者完全感知不到这是在调用远程方法&#xff0c;更感知不到在访问…

Java - Spring中HttpServletResponse的注入原理

Java - Spring中HttpServletResponse的注入原理前言一. HttpServletResponse的自动注入1.1 用ThreadLocal保存当前的请求和返回1.2 创建请求/返回的代理对象1.3 请求和返回的动态加载1.3.1 RequestObjectFactory的注入1.3.2 RequestAttributes中请求和返回的赋值二. 总结前言 …

火车头发布模块制作详细教程-火车头采集器发布模块大全以及设置方法

火车头采集器发布设置&#xff0c;要更好的使用火车头采集器软件&#xff0c;必须需要有基本的HTML基础,能看得懂网页源码,网页结构。 同时如果用到web发布或数据库发布,则对自己文章系统及数据存储结构要非常了解。当然对HTML和数据库不是很了解可以使用采集发布软件吗&#x…

MySQL索引原理

文章目录一、索引的作用及现象二、理解索引的准备工作1.MySQL的工作过程2.MySQL与磁盘的交互(1)磁盘的结构(2)定位扇区(3)磁盘与内存交互的单位Page的引入为何要是Page(4)磁盘随机访问与连续访问(5)总结三、索引的原理1.主键默认排序2.I/O请求3.单页情况(1)数据的链表结构(2)目…

从B站审核变慢现象,聊聊谛听安全内容社区产品的内容风控

B站是中国年轻世代高度聚集的文化社区和视频平台&#xff0c;近年来更是财报喜人。不过它最近却受到UP主对审核速度以及审核机制的吐槽。这背后有什么深层原因呢&#xff1f;本文从产品和商业角度对此追根溯源&#xff0c;同时也试着分析一下内容社区产品在内容风控策略上的一些…