吃喝等死的节奏.......
早起看hust oj上有练习
就等到九点开始做
第一题一看是简单贪心..后来发现数据量太大果断不会做...搜题解说是dp+线段树..ORZ..我线段树只会敲基本的...这题果断放弃了..
翻书搜模版
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct matrix
{
int mat[2][2];
};
matrix start;
int n=2,mod=10000;
matrix mul(matrix a,matrix b)
{
matrix temp;
memset(temp.mat,0,sizeof(temp.mat));
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(a.mat[i][k])
{
for(int j=0;j<n;j++)
{
temp.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
if(temp.mat[i][j]>=mod)
{
temp.mat[i][j]%=mod;
}
}
}
}
}
return temp;
}
matrix expo(matrix p,int k)
{
if(k==1)
{
return p;
}
matrix temp;
memset(temp.mat,0,sizeof(temp.mat));
for(int i=0;i<n;i++)
{
temp.mat[i][i]=1;
}
if(k==0)
{
return temp;
}
while(k)
{
if(k%2)
{
temp=mul(p,temp);
}
p=mul(p,p);
k/=2;
}
return temp;
}
int main()
{
start.mat[1][1]=0;
start.mat[1][0]=start.mat[0][1]=start.mat[0][0]=1;
int k;
while(cin>>k&&k!=-1)
{
cout<<expo(start,k).mat[0][1]%mod<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int dp[25][15][2];
int bit[25];
//dp[pos][pre][have]
//pos当前位置
//pre之前已经确定的部分
//have 前面是否全为0 1:不是全为0 0:全为0
int dfs(int pos,int pre,int have,int doing)
{
if(pos==-1)
{
if(have)
{
return 1;
}
else
{
return 0;
}
}
if(!doing&&dp[pos][pre][have]!=-1)
{
return dp[pos][pre][have];
}
int ans=0;
int end=doing?bit[pos]:9;
for(int i=0;i<=end;i++)
{
int nhave=have;
if(have==0)
{
if(i==0)
{
nhave=0;
}
else
{
nhave=1;
}
ans+=dfs(pos-1,i,nhave,doing&&i==end);
}
else if(abs(i-pre)>=2)
{
nhave=1;
ans+=dfs(pos-1,i,nhave,doing&&i==end);
}
// ans+=dfs(pos-1,i,nhave,doing&&i==end);
}
if(!doing)
{
dp[pos][pre][have]=ans;
}
return ans;
}
int solve(int n)
{
int len=0;
while(n)
{
bit[len++]=n%10;
n/=10;
}
return dfs(len-1,0,0,1);
}
int main()
{
memset(dp,-1,sizeof(dp));
int a,b;
while(cin>>a>>b)
{
cout<<solve(b)-solve(a-1)<<endl;
}
return 0;
}
题解参照这个链接
/*
http://www.baidu.com/link?url=LyMVYeWhyhNXE_R99qXp-BABjdLKTH9Cf_rpUhSMu_901x9tZWR74YxAsaKmGb3f0sbZIUy1JWNdjacXaDG-uNQy25OKnK1zupKhRmgLqG3
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define MIN 1e-6
using namespace std;
int n,k;
double a[1005];
double b[1005];
double value[1005];
int main()
{
while(cin>>n>>k,n!=0||k!=0)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int j=0;j<n;j++)
{
cin>>b[j];
}
double left=0;
double right=100;
double mid;
while(right-left>MIN)
{
mid=(left+right)/2;
for(int i=0;i<n;i++)
{
value[i]=100*a[i]-mid*b[i];
}
sort(value,value+n);
double sum=0;
for(int i=k;i<n;i++)
{
sum+=value[i];
}
if(sum>0)
{
left=mid;
}
else
{
right=mid;
}
}
printf("%.0lf\n",left);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n;
int c[1005][1005];
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int j,int k)
{
while(i<=n)
{
int temp=j;
while(temp<=n)
{
c[i][temp]+=k;
temp+=lowbit(temp);
}
i+=lowbit(i);
}
}
int sum(int i,int j)
{
int sum=0;
while(i>0)
{
int temp=j;
while(temp>0)
{
sum+=c[i][temp];
temp-=lowbit(temp);
}
i-=lowbit(i);
}
return sum;
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(c,0,sizeof(c));
int t;
cin>>n>>t;
while(t--)
{
char s[5];
cin>>s;
if(s[0]=='C')
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
x2++;
y2++;
update(x1,y1,1);
update(x1,y2,-1);
update(x2,y1,-1);
update(x2,y2,1);
}
else
{
int x1,y1;
cin>>x1>>y1;
cout<<sum(x1,y1)%2<<endl;
}
}
cout<<endl;
}
return 0;
}
今天下午的训练
自己先做好辅助
记录下不会的题目与知识点
利用训练间隙补上
以上.