0%

Codeforces Div 2 D 天梯 1——5

之前刷了几天C的天梯...感觉傻逼题有些多...似乎有些浪费时间... 难道我的能力已经超越Div 2 C啦? 所以决定刷一下Div 2 D的天梯...发现傻逼题还是很多... http://codeforces.com/problemset/problem/474/D 动态规划 d[i]代表总共算到了i个花,然后从i-1和i-k进行更新就好 最后用前缀和处理一下,解决一下提问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long t,k;
long long a,b;
long long ans;
long long d[100010]={};
long long h[100010]={};
int main()
{
cin>>t>>k;
d[0]=1;
for(int i=1;i<=100000;i++)
{
d[i]+=d[i-1];
if(i-k>=0) d[i]+=d[i-k];
d[i]%=mod;
}
for(int i=1;i<=100000;i++)
{
h[i]=h[i-1];
h[i]+=d[i];
h[i]%=mod;
}
for(int i=1;i<=t;i++)
{
cin>>a>>b;
ans=h[b]-h[a-1];
while(ans<0) ans+=mod;
ans%=mod;
cout<<ans<<endl;
}
return 0;
}
http://codeforces.com/problemset/problem/208/D 模拟即可...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
using namespace std;
long long n;
long long p[51]={};
struct pp
{
long long a,num;
} u[6]={};
long long ans[6]={};
bool cmp(pp x,pp y)
{
return x.a>y.a;
}
long long t;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=5;i++)
{
cin>>u[i].a;
u[i].num=i;
}
sort(u+1,u+6,cmp);
for(int i=1;i<=n;i++)
{
t+=p[i];
for(int j=1;j<=5;j++)
{
if(t>=u[j].a)
{
ans[u[j].num]+=t/u[j].a;
t%=u[j].a;
}
}
}
for(int i=1;i<=5;i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
cout<<t<<endl;
return 0;
}
http://codeforces.com/problemset/problem/339/D 看到这个询问的样子,就想到是线段树单点修改了吧...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<bits/stdc++.h>
using namespace std;
long long a[200010]={};
long long t[800010]={};
long long n,m;
long long p,b;
void build(long long l,long long r,long long num,long long p)
{
if(l==r)
{
t[num]=a[l];
return;
}
long long mid=(l+r)/2;
build(l,mid,num*2,!p);
build(mid+1,r,num*2+1,!p);
if(p==1) t[num]=t[num*2]|t[num*2+1];
else t[num]=t[num*2]^t[num*2+1];
}
void update(long long l,long long r,long long num,long long p,long long u,long long b)
{
if(l==r&&l==u)
{
t[num]=b;
return;
}
long long mid=(l+r)/2;
if(u<=mid) update(l,mid,num*2,!p,u,b);
else update(mid+1,r,num*2+1,!p,u,b);
if(p==1) t[num]=t[num*2]|t[num*2+1];
else t[num]=t[num*2]^t[num*2+1];
}
int main()
{
scanf("%I64d%I64d",&n,&m);
for(int i=1;i<=1<<n;i++)
{
scanf("%I64d",&a[i]);
}
build(1,1<<n,1,n%2);
for(int i=1;i<=m;i++)
{
scanf("%I64d%I64d",&p,&b);
update(1,1<<n,1,n%2,p,b);
printf("%I64d\n",t[1]);
}
return 0;
}

http://codeforces.com/problemset/problem/493/D 每次看到博弈题就是瞎几把乱搞... 这次猜了一发结论...竟然蒙对了... 仔细思考一下,其实可以白的黑的一起向中间走,如果n大于3的话,最后总会变成n等于3的状态,只不过n为偶数的时候黑的先动,n为奇数的时候白的先动 这样的话结果就十分显然了?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==0)
{
cout<<"white"<<endl;
cout<<"1 2"<<endl;
}
else
{
cout<<"black"<<endl;
}
return 0;
}
http://codeforces.com/problemset/problem/414/B 和之前的一道题差不多,就是用筛法做一个dp 均摊时间复杂度nnlogn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long n,k;
long long d[2010][2010]={};
long long ans;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) d[1][i]=1;
for(int i=1;i<k;i++)
{
for(int j=1;j<=n;j++)
{
for(int t=j;t<=n;t+=j)
{
d[i+1][t]+=d[i][j];
d[i+1][t]%=mod;
}
}
}
for(int i=1;i<=n;i++) ans+=d[k][i],ans%=mod;
cout<<ans;
return 0;
}