周中训练笔记(五)
2017-09-28 20:56
218 查看
离散化:建立一个结构体,结构体含有两个整型,一个存输入的数一个存下标,然后定义一个比较函数,利用sort将其排序,然后用一个新的一维数组进行循环赋值,就可以将结构体进行排序。
struct node
{
int val;
int num;
}a[100];
for(i=1;i<=n;i++){
cin>>a[i].val;
a[i].num=i;
}
将其排序。
for(i=1;i<=n;i++)
b[a[i].num]=i;
题目大意:给出一个序列求其不下降子序列的个数,如果存在相同的元素就分别列出。
代码:#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define Max 1000000007
#define m 1000010
int s[m],c[m],b[m],n;
struct node{
int val;
int num;
}a[m];
bool comp(node a,node b){
return a.val<b.val;
}
int lowbit(int i){
return i&(-i);
}
void update(int i,int x){
while(i<=n){
s[i]+=x;
s[i]%=Max;
i+=lowbit(i);
}
}
int getsum(int i){
int sum=0;
while(i>0){
sum+=s[i];
sum%=Max;
i-=lowbit(i);
}
return sum;
}
int main(){
int i;
while(cin>>n){
memset(s,0,sizeof(s));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
cin>>a[i].val;
a[i].num=i;
}
sort(a+1,a+n+1,comp);
b[a[1].num]=1;
for(i=2;i<=n;i++){
if(a[i].val==a[i-1].val)
b[a[i].num]=b[a[i-1].num];
else
b[a[i].num]=i;
}
for(i=1;i<=n;i++){
c[i]=getsum(b[i])+1;
update(b[i],c[i]);
}
int all=getsum(n);
cout<<all<<endl;
}
return 0;
}
解题思路:先把结构体离散化,然后利用一次循环c[i]=getsum(b[i])+1,c[i]存的是按升序排序后的第b[i]个元素总共有多少个子序列,算出之后利用update函数把包含b[i]个数的c[i]更新,最后用getsum函数算出来算出来总和。
struct node
{
int val;
int num;
}a[100];
for(i=1;i<=n;i++){
cin>>a[i].val;
a[i].num=i;
}
将其排序。
for(i=1;i<=n;i++)
b[a[i].num]=i;
题目大意:给出一个序列求其不下降子序列的个数,如果存在相同的元素就分别列出。
代码:#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define Max 1000000007
#define m 1000010
int s[m],c[m],b[m],n;
struct node{
int val;
int num;
}a[m];
bool comp(node a,node b){
return a.val<b.val;
}
int lowbit(int i){
return i&(-i);
}
void update(int i,int x){
while(i<=n){
s[i]+=x;
s[i]%=Max;
i+=lowbit(i);
}
}
int getsum(int i){
int sum=0;
while(i>0){
sum+=s[i];
sum%=Max;
i-=lowbit(i);
}
return sum;
}
int main(){
int i;
while(cin>>n){
memset(s,0,sizeof(s));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
cin>>a[i].val;
a[i].num=i;
}
sort(a+1,a+n+1,comp);
b[a[1].num]=1;
for(i=2;i<=n;i++){
if(a[i].val==a[i-1].val)
b[a[i].num]=b[a[i-1].num];
else
b[a[i].num]=i;
}
for(i=1;i<=n;i++){
c[i]=getsum(b[i])+1;
update(b[i],c[i]);
}
int all=getsum(n);
cout<<all<<endl;
}
return 0;
}
解题思路:先把结构体离散化,然后利用一次循环c[i]=getsum(b[i])+1,c[i]存的是按升序排序后的第b[i]个元素总共有多少个子序列,算出之后利用update函数把包含b[i]个数的c[i]更新,最后用getsum函数算出来算出来总和。
相关文章推荐
- 2018年2月24日训练笔记
- 【深度学习】笔记6:基于CIFAR10网络,训练自己的分类网络的记录
- 【caffe学习笔记之6】caffe-matlab/python训练LeNet模型并应用于mnist数据集(1)
- 2017年12月10日训练笔记
- 2018年2月3日训练笔记
- tensorflow笔记-简单模型训练,保存与提取
- Google机器学习速成课笔记(3)训练与损失
- 【学习笔记】逻辑思维训练题目集
- 国庆训练笔记
- 8月23日训练笔记
- 2018年02月06日训练笔记
- 周中训练笔记+HDU1806Frequent values
- 2107年10月15日训练笔记
- torch入门笔记11:如何训练神经网络
- 周中训练笔记(四)
- 【学习笔记&训练记录】数位DP
- 9月24日训练笔记
- 周末训练笔记
- 2018年1月27日训练笔记
- 8月8日训练笔记