MySQL的学习,JavaFX初步使用实现,vju刷题,蓝桥杯

MySQL

简单查询

所有列

INSERT INTO student (name,age,class,shux,yyu) VALUES
('张三',11,'一班',85,96),
('张4',12,'一班',87,76),
('张5',14,'二班',65,86),
('张6',11,'一班',75,76),
('张7',11,'三班',95,36),
('张8',13,'一班',89,98),
('张9',14,'三班',81,87),
('张0',11,'一班',85,88);

#查询所有列
SELECT * FROM student;

 结果

 指定列

#查询指定列
SELECT name FROM student;

结果

 注意:查询多个列用英文逗号分割。如果表中有重名的字段,可以用别名来分辨。

合并列

#合并列查询
SELECT CONCAT(class,'-',name) '班级-姓名' FROM student;

结果:

 运算

SELECT name,(shux+yyu) '总成绩' FROM student;

结果

 去重

SELECT DISTINCT class FROM student;

结果:

 限制查询

select * from student limit 0,2;

注释:把student表里面的0至2行输出。

select shux as shuxue from student limit 0,2;

注释:将shux列名改为shuxue并输出前两行,但是表里面的列名不改变。

JavaFX

哔站对javaFx的资料不多,所以学得有点磕磕碰碰。

package com.example.csxm;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import  javafx.stage.Stage;
import javafx.application.Application;
//窗口
public class csxm11 extends Application{
    public static void main(String[] args){
        launch(args);
    }
    public void start(Stage primaryStage)throws  Exception{


        //按钮——登录
        Button b1=new Button("登录");
        //按钮的位置
        b1.setLayoutX(65);
        b1.setLayoutY(200);
        b1.setPrefWidth(100);
        b1.setPrefHeight(35);
        //按钮上面的字(字体,字号)
        b1.setFont(Font.font("sans-serif",20));
//        //设置按钮的背景颜色
//        BackgroundFill bgf=new BackgroundFill(Paint.valueOf("#8FBC8F"),new CornerRadii(60),new Insets(8));
//        Background bg=new Background(bgf);
//        b1.setBackground(bg);


        //单击
        b1.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                System.out.println("您已成功登录。");
            }
        });


        //单机两次就是双击
//        b1.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>()
//                {
//                    public void handle(MouseEvent event)
//                    {
//                        if(event.getClickCount()==2&&event.getButton().name().equals(MouseButton.FORWARD.name()))
//                        {
//                            System.out.println("双击");
//                        }
//                    }
//                }
//        );




        //按钮——注册
        Button b2=new Button("注册");
        //按钮的位置
        b2.setLayoutX(220);
        b2.setLayoutY(200);
        b2.setPrefWidth(100);
        b2.setPrefHeight(35);
        //按钮上面的字(字体,字号)
        b2.setFont(Font.font("sans-serif",20));
//        //设置按钮的背景颜色
//        BackgroundFill bgf1=new BackgroundFill(Paint.valueOf("#8FBC8F"),new CornerRadii(60),new Insets(8));
//        Background bg1=new Background(bgf1);
//        b2.setBackground(bg1);
        //单击
        b2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                System.out.println("请开始注册。");
            }
        });

        //标签
        Label userslabel=new Label("账号:");
        userslabel.setLayoutX(80);
        userslabel.setLayoutY(48);
        
        //文本框
        TextField users=new TextField();
        users.setPromptText("请输入用户名!");
        users.setLayoutX(120);
        users.setLayoutY(40);
        users.setPrefWidth(190);
        users.setPrefHeight(30);


        //密码
        Label passlabel=new Label("密码:");
        passlabel.setLayoutX(80);
        passlabel.setLayoutY(108);


        //密码框
        PasswordField password=new PasswordField();
        password.setPromptText("请输入密码!");
        password.setLayoutX(120);
        password.setLayoutY(100);
        password.setPrefWidth(190);
        password.setPrefHeight(30);


        //设置窗口颜色
        GridPane startpr=new GridPane();
        startpr.setStyle("-fx-background-color: #FFF5EE");



        //GridPane root=new GridPane();
        startpr.add(userslabel,0,0);
        startpr.add(passlabel,0,1);
        startpr.add(users,1,0);
        startpr.add(password,1,1);
        startpr.add(b1,0,2);
        startpr.add(b2,1,2);
        startpr.setHgap(5);
        startpr.setVgap(15);
        GridPane.setMargin(b2,new Insets(0,0,0,120));
        startpr.setAlignment(Pos.CENTER);

        Scene scene=new Scene(startpr);
        primaryStage.setScene(scene);
        primaryStage.setTitle("聊天室");
        primaryStage.setHeight(300);
        primaryStage.setWidth(400);
        primaryStage.setResizable(false);
        primaryStage.show();
    }
}

进度如图:

 

vju

线段树OR树状数组 - Virtual Judge

分析:这个题目,我开始是想暴力的,结果一看数据,算了算了,惹不起,所以这就接触到了一个新知识点,线段树,它的作用比树状数组呢大那么一点点,主要凸显在随时改任意区间的值这里,这个题也是一个线段树的模板题,把数据存储在一个数组里面,然后创建一个结构体数组,存放从left到right所需要的参数,在这个题目里面就是sum(和)。存储方法,如图:

 这就是线段树的一个基本模型,我需要的只是和,那就是说我只需要存放,左边的界限和右边的界限,还有和。

代码如下;

#include <bits/stdc++.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
struct ffff
{
    int ll;
    int rr;
    int sum;
}pre[50001*3];

int a[50002];

void jshu(int l,int r,int k)
{
    pre[k].ll=l;
    pre[k].rr=r;
    if(l==r)
    {
        pre[k].sum=a[l];
        return;
    }
    int m;
    m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    pre[k].sum=pre[k*2].sum+pre[k*2+1].sum;
}

int query(int i,int j,int k)
{
    if(pre[k].ll==i&&pre[k].rr==j)
    return pre[k].sum;
    int m=(pre[k].ll+pre[k].rr)/2;
    if(j<=m)
    return query(i,j,k*2);
    else if(i>m)
    return query(i,j,k*2+1);
    else 
    return  query(i,m,k*2)+query(m+1,j,k*2+1);
}

void zj(int l,int r,int kk,int i,int j)
{
    pre[kk].sum+=j;
    if(l==r&&r==i)
        return ;
    int m=(l+r)/2;
    if(i<=m)
        zj(l,m,kk*2,i,j);
    else
        zj(m+1,r,kk*2+1,i,j);
}


int  main()
{
    int t;
    scanf("%d",&t);
    int tt=1;
    while(tt<=t)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d",a+i);
        printf("Case %d:\n",tt);
        jshu(1,n,1);
        char b[10]={0};
        while(scanf("%s",b)&&b[0]!='E')
        {
            int ii,jj;
            scanf("%d%d",&ii,&jj);
            if(b[0]=='Q')
            printf("%d\n",query(ii,jj,1));
            else if(b[0]=='A')
           zj(1,n,1,ii,jj);
            else 
            zj(1,n,1,ii,-jj);
        }
        tt++;
    }
}

建树,这是一个很常用的建树的板子,很好用

void jshu(int l,int r,int k)
{
    pre[k].ll=l;
    pre[k].rr=r;
    if(l==r)
    {
        pre[k].sum=a[l];
        return;
    }
    int m;
    m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    pre[k].sum=pre[k*2].sum+pre[k*2+1].sum;
}

找[left,right]之间的和

int query(int i,int j,int k)
{
    if(pre[k].ll==i&&pre[k].rr==j)
    return pre[k].sum;
    int m=(pre[k].ll+pre[k].rr)/2;
    if(j<=m)
    return query(i,j,k*2);
    else if(i>m)
    return query(i,j,k*2+1);
    else 
    return  query(i,m,k*2)+query(m+1,j,k*2+1);
}

加数或减数

void zj(int l,int r,int kk,int i,int j)
{
    pre[kk].sum+=j;
    if(l==r&&r==i)
        return ;
    int m=(l+r)/2;
    if(i<=m)
        zj(l,m,kk*2,i,j);
    else
        zj(m+1,r,kk*2+1,i,j);
}

线段树OR树状数组 - Virtual Judge

 分析:因为上一道题是模板题,所以这一道题目直接套上一题的板子就行,不用大改。

代码如下:

#include <bits/stdc++.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
struct ffff
{
    int ll;
    int rr;
    int maxx;

}pre[200001*3];

int a[200002];

void bmax(int k)
{
    pre[k].maxx=pre[k*2].maxx>pre[k*2+1].maxx?pre[k*2].maxx:pre[k*2+1].maxx;
}

int max(int aa,int bb)
{
    return aa>bb?aa:bb;
}

void jshu(int l,int r,int k)
{
    pre[k].ll=l;
    pre[k].rr=r;
    pre[k].maxx=a[l];
    if (l==r) 
    return;
    int m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    bmax(k);
}

void quefy(int xx,int yy,int k) 
{
    if (pre[k].ll==xx&&pre[k].rr==xx)
	 { 
        pre[k].maxx=yy; 
        return; 
    }
    int m=(pre[k].ll+pre[k].rr)/2;
    quefy(xx,yy, k*2|(xx>m));
    bmax(k);
}

int xw(int l,int r,int k)
{
    if (l<=pre[k].ll&&r>=pre[k].rr) return pre[k].maxx;
    int m=(pre[k].ll+pre[k].rr)/2;
    int ma=0;
    if (l<=m) 
    ma=max(ma,xw(l,r,k*2));
    if (r>m) 
    ma=max(ma,xw(l,r,k*2+1));
    return ma;
}

int  main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {for(int i=1;i<=n;i++)
    scanf("%d",a+i);
    jshu(1,n,1);
    for(int i=1;i<=m;i++)
    {
        char c[2];
        int l,r;
        scanf("%s",c);
        scanf("%d%d",&l,&r);
        if(c[0]=='Q')
        printf("%d\n",xw(l,r,1));
        else 
        quefy(l,r,1);
    }}
}

建树

void jshu(int l,int r,int k)
{
    pre[k].ll=l;
    pre[k].rr=r;
    pre[k].maxx=a[l];
    if (l==r) 
    return;
    int m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    bmax(k);
}

存储最大值

void bmax(int k)
{
    pre[k].maxx=pre[k*2].maxx>pre[k*2+1].maxx?pre[k*2].maxx:pre[k*2+1].maxx;
}

找最大值

int xw(int l,int r,int k)
{
    if (l<=pre[k].ll&&r>=pre[k].rr) return pre[k].maxx;
    int m=(pre[k].ll+pre[k].rr)/2;
    int ma=0;
    if (l<=m) 
    ma=max(ma,xw(l,r,k*2));
    if (r>m) 
    ma=max(ma,xw(l,r,k*2+1));
    return ma;
}

改变元素

void quefy(int xx,int yy,int k) 
{
    if (pre[k].ll==xx&&pre[k].rr==xx)
	 { 
        pre[k].maxx=yy; 
        return; 
    }
    int m=(pre[k].ll+pre[k].rr)/2;
    quefy(xx,yy, k*2|(xx>m));
    bmax(k);
}

线段树OR树状数组 - Virtual Judge

分析:这个题在前面的题目的基础上加了一个新的点叫做“懒标记”,在本题中考察的是在一段区间内加同一个数,其他的和第一个题没什么差别,如果像第一题那样一个数一个数地改,肯定爆时间,所以这时候“懒标记”的作用就发挥得淋漓尽致。它不用每次都加,只是在用的时候加就行。

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct ffff
{
    long long ll;
    long long rr;
    long long sum;
    long long lan;
}pre[100010*4];

long long a[100010];;

void bj(long long k)
{
     if(pre[k].lan)
    {
        pre[2*k].lan+=pre[k].lan;
        pre[2*k+1].lan+=pre[k].lan;
        pre[k*2].sum+=pre[k].lan*(pre[k*2].rr-pre[k*2].ll+1);
        pre[k*2+1].sum+=pre[k].lan*(pre[k*2+1].rr-pre[k*2+1].ll+1);
        pre[k].lan=0;
    }
}


void jshu(long long l,long long r,long long k)
{
    pre[k].ll=l;
    pre[k].rr=r;
    //pre[k].lan=0;
    if(l==r)
    {
        pre[k].sum=a[l];
        return;
    }
    long long m;
    m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    pre[k].sum=pre[k*2].sum+pre[k*2+1].sum;
}


long long query(long long i,long long j,long long k)
{
    if(i<=pre[k].ll&&j>=pre[k].rr)
    return pre[k].sum;
    bj(k);
    long long mid=(pre[k].ll+pre[k].rr)/2;
    long long sum1=0;
    if(i<=mid)
    sum1+=query(i,j,k*2);
    if(j>mid)
    sum1+=query(i,j,k*2+1);
    return sum1;
}

void zj(long long l,long long r,long long p,long long k)
{
    if(l<=pre[k].ll&&r>=pre[k].rr)
    {
        pre[k].sum+=p*(pre[k].rr-pre[k].ll+1);
       pre[k].lan+=p;
        return;
    }
   bj(k);
    long long  mid=(pre[k].ll+pre[k].rr)/2;
    if(l<=mid)
    zj(l,r,p,k*2);
    if(r>mid)
    zj(l,r,p,k*2+1);
    pre[k].sum=pre[k*2].sum+pre[k*2+1].sum;
}

int  main()
{
    long long n,m;
    while( scanf("%lld%lld",&n,&m)!=EOF)
    {
        for(long long i=1;i<=n;i++)
        scanf("%lld",a+i);
        jshu(1,n,1);
        char b[10]={0};
        while(m--)
        {
            long long ii,jj,kk;
            scanf("%s",b);
            if(b[0]=='Q')
            {
                scanf("%lld%lld",&ii,&jj);
                printf("%lld\n",query(ii,jj,1));
            }
            else
            {
                scanf("%lld%lld%lld",&ii,&jj,&kk);
                zj(ii,jj,kk,1);
            }
           // printf("1  ");
        }
    }
}

主要代码:

懒标记:

void bj(long long k)
{
     if(pre[k].lan)
    {
        pre[2*k].lan+=pre[k].lan;
        pre[2*k+1].lan+=pre[k].lan;
        pre[k*2].sum+=pre[k].lan*(pre[k*2].rr-pre[k*2].ll+1);
        pre[k*2+1].sum+=pre[k].lan*(pre[k*2+1].rr-pre[k*2+1].ll+1);
        pre[k].lan=0;
    }
}

 

 

线段树OR树状数组 - Virtual Judge

分析:这个题用了线段树的思想,用数组模拟和、懒标记,一直到最后它的总和就是a的第一个值,它最需要注意的一点是数组开大点,。。。不然就一直爆时间,我开始还以为是我的懒标记没有设好,后来发现是我的数组开小了。

代码如下:

#include<stdio.h>
#include<string.h>
int  a[100010*4],b[100010*4];

void bj(int  l,int  r)
{
     if(b[l])
    {
        b[2*l]=b[2*l+1]=b[l];
        a[l*2]=b[l*2]*(r-(r/2));
		a[l*2+1]=b[l*2+1]*(r/2);
		b[l]=0;
    }
}


void jshu(int  l,int  r,int  k)
{
    b[k]=0;
    if(l==r)
    {
        a[k]=1;
        return;
    }
    int  m;
    m=(l+r)/2;
    jshu(l,m,k*2);
    jshu(m+1,r,k*2+1);
    a[k]=a[k*2]+a[k*2+1];
}


void zj(int  ii,int  jj,int  kk,int  p,int  q,int  r)
{
    if(ii<=p&&q<=jj)
    {
       b[r]=kk;
       a[r]=kk*(q-p+1);
        return;
    }
    bj(r,q-p+1);
    int   mid=(q+p)/2;
    if(ii<=mid)
    zj(ii,jj,kk,p,mid,r*2);
    if(jj>mid)
    zj(ii,jj,kk,mid+1,q,r*2+1);
    a[r]=a[r*2]+a[r*2+1];
}

int  main()
{
    int  n,m;
    int t;
    scanf("%d",&t);
    int tt=1;
    while(tt<=t)
    {
        scanf("%d",&n);
        jshu(1,n,1);
        scanf("%d",&m);
        while(m--)
        {
            int  ii,jj,kk;
            scanf("%d%d%d",&ii,&jj,&kk);
            zj(ii,jj,kk,1,n,1);
        }
        printf("Case %d: The total value of the hook is %d.\n",tt,a[1]);
        tt++;
    }
    
}

蓝桥杯

[蓝桥杯 2022 省 B] X 进制减法 - 洛谷

 分析:开始没看明白这个题,用我那进制转换的思路写不行,然后后来才明白,第i位的权值是前i-1位的权值相乘。那这个题就很好写了,最需要注意的一点就是要倒着存。

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long a[100002],b[100002],c[100002],he[100002];

int main()
{
    int n,m1,m2;
    he[1]=1;
    scanf("%d",&n);
    scanf("%d",&m1);
    for(int i=m1;i>0;i--)
    scanf("%lld",a+i);
    scanf("%d",&m2);
    for(int i=m2;i>0;i--)
    scanf("%lld",b+i);
    int m=max(m1,m2);
    for(int i=m;i >= 1;i--) 
    c[i] = max(max(a[i],b[i]) + 1,(long long)(2)); 
   for(int i = 2;i <= m;i++) 
   he[i]=(c[i-1]*he[i-1])%1000000007; 
   long long sum1=0,sum2=0;
   for(int i=m1;i>0;i--) 
   sum1=(sum1+a[i]*he[i])%1000000007;  //计算X进制数A
    for(int i=m2;i >= 1;i--) 
    sum2=(sum2+b[i]*he[i])%1000000007;  //计算X进制数B
    printf("%lld",(sum1-sum2+1000000007)%1000000007);
}

[蓝桥杯 2022 省 B] 修建灌木 - 洛谷

分析:这个题目其实很好想,只要爱丽丝剪一次,就一夜回到解放前,最高的高度,就是爱丽丝离开这棵树的最长的时间,那也就是以这棵树为中心,找两边最长的距离,然后一来还有一回嘛,也就是要乘以2,就是它最高的高度。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    printf("%d\n",max(n-i,i-1)*2);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值