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的资料不多,所以学得有点磕磕碰碰。
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() {
@Override
public void handle(ActionEvent actionEvent) {
System.out.println("您已成功登录。");
}
});
//单机两次就是双击
// b1.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler()
// {
// 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() {
@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();
}
}
进度如图:
分析:这个题目,我开始是想暴力的,结果一看数据,算了算了,惹不起,所以这就接触到了一个新知识点,线段树,它的作用比树状数组呢大那么一点点,主要凸显在随时改任意区间的值这里,这个题也是一个线段树的模板题,把数据存储在一个数组里面,然后创建一个结构体数组,存放从left到right所需要的参数,在这个题目里面就是sum(和)。存储方法,如图:
这就是线段树的一个基本模型,我需要的只是和,那就是说我只需要存放,左边的界限和右边的界限,还有和。
代码如下;
#include
#include
#include
#include
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);
}
分析:因为上一道题是模板题,所以这一道题目直接套上一题的板子就行,不用大改。
代码如下:
#include
#include
#include
#include
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);
}
分析:这个题在前面的题目的基础上加了一个新的点叫做“懒标记”,在本题中考察的是在一段区间内加同一个数,其他的和第一个题没什么差别,如果像第一题那样一个数一个数地改,肯定爆时间,所以这时候“懒标记”的作用就发挥得淋漓尽致。它不用每次都加,只是在用的时候加就行。
代码如下:
#include
#include
#include
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;
}
}
分析:这个题用了线段树的思想,用数组模拟和、懒标记,一直到最后它的总和就是a的第一个值,它最需要注意的一点是数组开大点,。。。不然就一直爆时间,我开始还以为是我的懒标记没有设好,后来发现是我的数组开小了。
代码如下:
#include
#include
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++;
}
}
分析:开始没看明白这个题,用我那进制转换的思路写不行,然后后来才明白,第i位的权值是前i-1位的权值相乘。那这个题就很好写了,最需要注意的一点就是要倒着存。
代码如下:
#include
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);
}
分析:这个题目其实很好想,只要爱丽丝剪一次,就一夜回到解放前,最高的高度,就是爱丽丝离开这棵树的最长的时间,那也就是以这棵树为中心,找两边最长的距离,然后一来还有一回嘛,也就是要乘以2,就是它最高的高度。
代码如下:
#include
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);
}