都是之前的博客了,发现草稿箱里面还有很多……
容器的使用
- 栈:①考虑栈为空 ②考虑出栈的个数
有关lower_bound函数的使用
结构体
写一个代码思路很重要,就拿这个例题来说,首先,我们可以将起始点加入我们的队列中,距离和供油量为0.需要得到多组数据并为其赋值还要不互相影响,要使用什么知识来解决这个问题呢?我们最先可能会想到数组,但数组是有局限性的,无法将汽油以及和站点很好的联系起来,这个时候,我们可以用结构体数组来存储数据;
这个例题是单个输出单词,并不计入空格,使输入与输出数据互不影响
结构体存位置:
1 |
|
是这个Step结构体的构造函数,C++中的结构体和C中不太一样,已经可以像和C++中的类一样写入函数了,
函数括号后面的是初始化列表,上面的写法等价于:
1 2 3 4 |
|
数组
其次,这点很重要,用数组下标解决问题使问题简单了很多,我们可以用数组下标解决很多问题:
①例一可以将数组下标作为加油站的站点
②可以用数组下标来计算每个数字出现的次数
单目运算符
目前就是这个题运用单目运算符,灵活用到了&与^符号的应用,&相同则为0,否则为1,而^运算,有0则为0;
a -= (a & 1) ^ 1;
1&1=0 3&1=2 2&1=3 即偶数加一,奇数减一
1^1=1 3^1=3 2^1=0 即偶数均为0,奇数不变
数据的不重复输出
①将数字不重复输出
for(i=1;i<m;i++){
for(j=0;j<i;j++){
if(a[i]==a[j]){
break;
}
}
②set使用练习:输出字符中不重复的字符
#include<set>
int main()
{
char c;
set<char> set_c;//创建set
while(cin.get(c))
set_c.insert(c);//插入,set不支持下标,insert返回pair,first指向元素,second是一个boll值,true表示插入成功,false表示已有元素
set<char>::iterator iterator=set_c.begin();//创建迭代器指向首
while(iterator!=set_c.end())
{
cout<<* iterator;//输出迭代器指向,只读,不可修改值
iterator++;
}
}
char型与int型的转换:
把一个数字字符ch,转为一个整数,就是ch-'0'当然ch-48也行
边计算边取余: 运算速度更快
#include<cstdio>
using namespace std;
int main() {
long long a,b,ans;
while(~scanf("%lld%lld",&a,&b)) {
ans=1;
for(long long i=a+1; i<=b; i++) {
if(i%10==0) {
ans=0;
break;
}
else ans*=i%10;
}
printf("%lld\n",ans%10);
}
return 0;
}
大数据不要用cin and cout,两杯速度的 差距
逆向思维:看了题解还不太明白的一道题
题目:CodeForces - 938D Buy a Ticket
#include<cstdio>
#include<cstring>
#define lson l,mid,rt<<1
#define rson mid,r,rt<<1|1 //建树******
#define maxn 200005
using namespace std;
//将原数据建树,单点修改,相同位置++,想了半天,好像是错的
//看了别人的思路,咋也想不到用线段树怎么去解决这个问题
//倒叙插入,最后一个插入的数是不会改变的,用节点保存空位数
//2 69 __ __ 69 __ (需要前面有3个空位才能插入)
//1 33 __ 33 69 __ (需要前面有2个空位才能插入)
//1 51 __ 33 69 51 (需要前面有2个空位才能插入) 前面只有1个空位 故插入后面空格
//0 77 77 33 69 51 (需要前面有1个空位才能插入)
int n,p[maxn],v[maxn];
int tree[maxn<<2],ans[maxn];
void build(int l,int r,int rt) {
tree[rt]=r-l;
if(tree[rt]==1) {
//res[rt]=a[l];
return ;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void update(int pos,int val,int l,int r,int rt) {
--tree[rt];
if(r-l==1) {
ans[l]=val;
return ;
}
int mid=(l+r)>>1;
if(pos<tree[rt<<1]) update(pos,val,lson);//******
else update(pos-tree[rt<<1],val,rson);
}
int main() {
int n,i;
while(~scanf("%d",&n)) {
for(i=0;i<n;i++) {
scanf("%d%d",&p[i],&v[i]);
}
build(0,n,1);
for(i=n-1;i>=0;i--) {
update(p[i],v[i],0,n,1);
}
for(i=0;i<n;i++)
printf("%d%c",ans[i],i!=(n-1)?' ':'\n');
}
return 0;
}