目录
MySQL
查询
比较条件
判空
逻辑条件
模糊条件
where in
聚合查询
排序查询
vju
线段树OR树状数组 - Virtual Judge
cf
Problem - A - Codeforces
Problem - A - Codeforces
Problem - B - Codeforces
周总结
MySQL
查询
比较条件
SELECT *FROM student WHERE age>12;
注意:如果查询后只需要出现其中几列,在*这个位置写上要查询的列。
判空
SELECT device_id,gender,age,university FROM user_profile WHERE age is not NULL;
作用是剔除为空的数据。
逻辑条件
SELECT device_id,gender,age,university,gpa FROM user_profile
WHERE GPA>3.5 and gender='male';
GPA大于3.5的男性
SELECT device_id,gender,age,university,gpa FROM user_profile
WHERE GPA>3.7 or university='北京大学';
GPA大于3.7或者学校为北京大学的学生
模糊条件
SELECT * FROM student WHERE name LIKE '%三%';
表示查找student这个表中的名字带有‘三’的数据。
where in
select device_id,gender,age,university,gpa from user_profile
where university in('北京大学','复旦大学','山东大学');
筛选出学校为'北京大学','复旦大学','山东大学'的学生信息。
聚合查询
SELECT max(gpa) FROM user_profile where university='复旦大学';
找复旦大学学生gpa最高值是多少
SELECT count(gender) as male_num,round(avg(gpa),1) as avg_gpa FROM user_profile where gender="male";
求男性用户有多少人以及他们的平均gpa是多少,保留小数位数为1。
排序查询
SELECT device_id,age FROM user_profile ORDER BY age;
取出用户信息表中的用户年龄,请取出相应数据,并按照年龄升序排序。
SELECT device_id,gpa,age FROM user_profile ORDER BY gpa desc,age desc;
取出用户信息表中对应的数据,并先按照gpa、年龄降序排序输出。
SELECT device_id,gpa,age FROM user_profile ORDER BY gpa ,age ;
取出用户信息表中的年龄和gpa数据,并先按照gpa升序排序,再按照年龄升序排序输出。
vju
线段树OR树状数组 - Virtual Judge
分析:我开始看这个题的时候,我觉得是纯覆盖,直接干就行,还是失策了,数据有点多,会爆,然后我就想到了贪心+排序,还是有问题,因为它数据一打乱可能就会造成多几块或者少几块的情况,然后接触了一个只有一点点印象的东西——离散,,,太离谱了,我是真的想不到,用离散+贪心+排序+去重,就是这个题目的精华。
这个真的让我挺震惊的,因为之前要去重或者二分查找的话都要自己打代码,然后才能达到效果。所以真的从c转成c++真的挺重要的,不然别人两句代码的事,自己要打几十行。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct ffff
{
int l;
int r;
}a[10002<<4];
struct fffff
{
int l;
int r;
int val;
int lazy;
int sum;
int mid()
{
return (l+r)/2;
}
}t[20002<<4];
int dqu()
{
char chr=getchar();
int f=1,sum=0;
while(!isdigit(chr))
{
if(chr=='-')
f=-1;
chr=getchar();
}
while(isdigit(chr))
{
sum=sum*10;
sum+=chr-'0';
chr=getchar();
}
return sum*f;
}
int sum = 0,n,js=0,x,y;
int b[20005<<4];
bool bf[20005<<4];
void build(int i,int l,int r)
{
t[i].l=l;
t[i].r=r;
t[i].val=0;
if(l==r)
return;
int m=t[i].mid();
build(i*2,l,m);
build(i*2+1,m+1,r);
}
int quc()
{
scanf("%d",&n);
js = 0;
for(int i = 1;i <= n;i++)
{
a[i].l = dqu();
a[i].r = dqu();
b[++js] = a[i].l;
b[++js] = a[i].r;
b[++js] = a[i].r + 1;
}
sort(b+1,b+js+1);
int len;
len=unique(b + 1,b + js + 1) - b - 1;
for(int i = 1; i <= n;i++)
{
a[i].l = lower_bound(b + 1,b + len + 1,a[i].l) - b;//二分查找
a[i].r = lower_bound(b + 1,b + len + 1,a[i].r) - b;
}
return len;
}
void query(int i,int l,int r)
{
if(t[i].val!=-1)
{
if(!bf[t[i].val])
{
bf[t[i].val] = 1;
sum++;
}
return;
}
query(i*2,l,r);
query(i*2+1,l,r);
}
void jiar(int i)
{
if(t[i].val==-1)
return;
t[i*2].val=t[i*2+1].val=t[i].val;
t[i].val=-1;
}
void fout(int i,int l,int r,int x)
{
if(l<=t[i].l&&t[i].r<= r)
{
t[i].val=x;
return;
}
jiar(i);
int m=t[i].mid();
if(l<=m)
fout(i*2,l,r,x);
if(r>m)
fout(i*2+1,l,r,x);
}
int xwen(int l,int r)
{
memset(bf,0,sizeof(bf));
sum = 0;
bf[0] = 1;
query(1,l,r);
return sum;
}
int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
int m=quc();
js=0;
build(1,1,m);
for(int i = 1;i <= n;i++)
fout(1,a[i].l,a[i].r,++js);
printf("%d\n",xwen(1,m));
}
return 0;
}
cf
Problem - A - Codeforces
分析:这道题分两块写,它一个数中最大值和最小值相减的最大值是9,那也就是说只要两个数之间的差大于等于90,那么就可以直接找一个数c使得c*90%100为一个整数,这就是第一部分。第二部分是两数之间的差小于90,反正数也不多,直接浅浅地暴力一下就行。
代码如下:
#include<stdio.h>
int xysz(int x)
{
int a[10],i,n,t=x,max=0,min=10;
for(i=0;t;i++)
{
a[i]=t%10;
t/=10;
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
}
return max-min;
}
int main()
{
int t,i,l,r;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&l,&r);
int i,max=0,t,temp=l;
for(i=l;i<=r;i++)
{
t=xysz(i);
if(t>max)
{
max=t;
temp=i;
}
if(max>=9)
{
temp=i;
break;
}
}
printf("%d\n",temp);
}
return 0;
}
Problem - A - Codeforces
分析:
这个题很好想,因为它子序列的起点从哪里开始是你自己决定的,所以只要我目前的这个位置之后的数字,有一个小于或者这个位置的序号的数就行。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int a[102];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
int f=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(a[j]<=i)
{
f=1;
printf("YES\n");
break;
}
}
if(f)
break;
}
if(f==0)
printf("NO\n");
}
}
Problem - B - Codeforces
分析:
这个题当时想了二十多分钟吧,开始一直顺着想,然后突然就发现逆着想更好想,首先,它肯定是不能为偶数的,一旦是偶数就输出-1,那为奇数的时候呢?只要总操作次数不超过40,那它始终都是能出来的,那么对于奇数,他就两种可能,要么是2*x-1得到的,要么是2*x+1得到的,那就两种都试一下,只要其中有一个操作过后不得偶数,那么就可以,反之就使用另外一种。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n%2==0)
printf("-1\n");
else
{
int a[42]={0};
int i;
int f=0;
for(i=1;i<=40;i++)
{
if(n==1)
{
f=1;
break;
}
if(n<1)
break;
if((n-1)/2%2==1)
{
a[i]=2;
n=(n-1)/2;
}
else
{
a[i]=1;
n=(n+1)/2;
}
}
if(f)
{
printf("%d\n",i-1);
i--;
do{
printf("%d ",a[i]);
}while(i-->1);
printf("\n");
}
else
printf("-1\n");
}
}
}
周总结
MySQL的查询学完了,项目设计思路已经交给学姐了,学姐说还行,但是我觉得还不够细,因为学的东西不多,具体的操作还是很模糊,所以等把那些东西都学完之后,会再次进行补充和具体化。
这周打了一场cf,手感是比之前好一点了,但是要注意编译器的问题,有些编译器它可能会爆时间,但是换个编译器它就不爆时间了。补了一场cf,这场cf比较偏数学。补了一场atc,这场的题目不是很难,在接受范围内。打了一场牛客,经验还是要积累,感觉经验非常非常少。