2018.10.20 XMYZ Day1总结
上周的忘写了……题目没有作者……
T1.backpack
期望得分100,实际得分100.
感觉我自己真是不如以前了……以前做这种题都是秒掉的,现在怎么想了10分钟啊……
因为物品的体积和价值都非常小,我们有一句套话,“远距离贪心,近距离暴力”,所以虽然背包的体积特别大,我们可以把他压缩成1000000左右,剩下的直接暴力取性价比最高的即可。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int INF = ;
const ll mod = 1e9+; ll read()
{
ll ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} ll dp[M],m,n,a[M],b[M],v[],mpos,ans;
double maxn; void solve1()
{
rep(i,,n)
rep(j,a[i],m) dp[j] = max(dp[j],dp[j-a[i]] + b[i]);
printf("%lld\n",dp[m]);
} int main()
{
freopen("backpack.in","r",stdin);
freopen("backpack.out","w",stdout);
n = read(),m = read();
rep(i,,n)
{
a[i] = read(),b[i] = read();
v[a[i]] = max(b[i],v[a[i]]);
}
if(n <= && m <= ) solve1();
else
{
rep(i,,)
{
double p = (double)(i),q = (double)(v[i]);
if(q / p > maxn) maxn = q / p,mpos = i;
}
if(m > )
{
ll k = (m - ) / mpos;
m -= k * mpos,ans += k * v[mpos];
}
rep(i,,)
rep(j,i,m) dp[j] = max(dp[j],dp[j-i] + v[i]);
ans += dp[m];
printf("%lld\n",ans);
}
return ;
}
T2.sort
期望得分20,实际得分0.
这道题考试的时候没怎么想,主要刚T3了,而且我也不会求方案数。写了个爆搜,然后GG了。
后来想到这个最大值和最小值很好维护,最大值取后一半减去前一半即可,而最小值的话只要奇偶分别维护取差值即可。这个可以使用线段树分别维护奇偶,稍微有点麻烦,下放的时候有很多特判。
之后至于方案数,mrclr大佬说,你可以把它看成一个括号序列匹配,就是一个卡特兰数。求一下阶乘和阶乘的逆元即可。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int INF = ;
const ll mod = 1e9+; ll read()
{
ll ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} struct seg
{
ll v,ov,ev,lazy;
}t[M<<]; ll n,m,c[M<<],l,r,op,val,sum[M<<],inv[M<<]; ll qpow(ll a,ll b)
{
ll p = ;
while(b)
{
if(b&1LL) p *= a,p %= mod;
a *= a,a %= mod;
b >>= 1LL;
}
return p;
} void init()
{
sum[] = inv[] = inv[] = 1ll;
rep(i,,n<<) sum[i] = sum[i-] * i,sum[i] %= mod;
inv[n<<] = qpow(sum[n<<],mod-);
per(i,(n<<)-,) inv[i] = inv[i+] * (i+),inv[i] %= mod;
//rep(i,1,n<<1) printf("%lld ",sum[i]);enter;
} void pushup(int p)
{
t[p].v = t[p<<].v + t[p<<|].v,t[p].v %= mod;
t[p].ev = t[p<<].ev + t[p<<|].ev,t[p].ev %= mod;
t[p].ov = t[p<<].ov + t[p<<|].ov,t[p].ov %= mod;
} void pushdown(int p,int l,int r)
{
ll mid = (l+r) >> ,k = mid - l + ,q = r - mid;
t[p<<].v += t[p].lazy * k,t[p<<].v %= mod;
t[p<<|].v += t[p].lazy * q,t[p<<|].v %= mod;
t[p<<].lazy += t[p].lazy,t[p<<|].lazy += t[p].lazy;
t[p<<].lazy %= mod,t[p<<|].lazy %= mod;
if(k & )
{
if(l&) t[p<<].ov += t[p].lazy * (k + >> ),t[p<<].ev += t[p].lazy * (k>>);
else t[p<<].ov += t[p].lazy * (k >> ),t[p<<].ev += t[p].lazy * (k + >> );
}
else t[p<<].ov += t[p].lazy * (k >> ),t[p<<].ev += t[p].lazy * (k >> );
t[p<<].ov %= mod,t[p<<].ev %= mod;
if(q & )
{
if((mid + ) & ) t[p<<|].ov += t[p].lazy * (q + >> ),t[p<<|].ev += t[p].lazy * (q >> );
else t[p<<|].ov += t[p].lazy * (q >> ),t[p<<|].ev += t[p].lazy * (q + >> );
}
else t[p<<|].ov += t[p].lazy * (q >> ),t[p<<|].ev += t[p].lazy * (q >> );
t[p<<|].ov %= mod,t[p<<|].ev %= mod;
t[p].lazy = ;
} void build(int p,int l,int r)
{
if(l == r)
{
t[p].v = c[l];
if(l & ) t[p].ov = c[l];
else t[p].ev = c[l];
return;
}
int mid = (l+r) >> ;
build(p<<,l,mid),build(p<<|,mid+,r);
pushup(p);
} void modify(int p,int l,int r,int kl,int kr,ll val)
{
if(l == kl && r == kr)
{
ll k = r - l + ;
t[p].v += val * k,t[p].lazy += val;
t[p].v %= mod,t[p].lazy %= mod;
if(k & )
{
if(l & ) t[p].ov += val * (k + >> ),t[p].ev += val * (k >> );
else t[p].ov += val * (k >> ),t[p].ev += val * (k + >> );
}
else t[p].ov += val * (k >> ),t[p].ev += val * (k >> );
t[p].ov %= mod,t[p].ev %= mod;
return;
}
if(t[p].lazy) pushdown(p,l,r);
int mid = (l+r) >> ;
if(kr <= mid) modify(p<<,l,mid,kl,kr,val);
else if(kl > mid) modify(p<<|,mid+,r,kl,kr,val);
else modify(p<<,l,mid,kl,mid,val),modify(p<<|,mid+,r,mid+,kr,val);
pushup(p);
} ll query(int p,int l,int r,int kl,int kr,int f)
{
if(l == kl && r == kr)
{
if(f == ) return t[p].v;
else if(f == ) return t[p].ov;
else if(f == ) return t[p].ev;
}
ll mid = (l+r) >> ;
if(t[p].lazy) pushdown(p,l,r);
if(kr <= mid) return query(p<<,l,mid,kl,kr,f);
else if(kl > mid) return query(p<<|,mid+,r,kl,kr,f);
else return query(p<<,l,mid,kl,mid,f) + query(p<<|,mid+,r,mid+,kr,f) % mod;
} int main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
n = read(),m = read();
init();
rep(i,,n<<) c[i] = read();
build(,,n<<);
rep(i,,m)
{
op = read();
if(op == ) l = read(),r = read(),val = read(),modify(,,n<<,l,r,val);
else
{
l = read(),r = read();
int g = (l + r) >> ,h = (r - l + ) >> ;
ll a = query(,,n<<,l,g,),b = query(,,n<<,g+,r,),maxx = (b - a + mod << ) % mod;
ll ka = query(,,n<<,l,r,),kb = query(,,n<<,l,r,),minx = abs(kb - ka) % mod;
ll cat = sum[h << ] * inv[h] % mod * inv[h+] % mod;
printf("%lld %lld %lld\n",maxx >> ,minx,cat);
}
}
return ;
}
T3.digit
期望得分20,实际得分20.
考试的时候主要刚这题了……想到使用dp[i][j]表示前i位对4,5,6取模后结果为j的情况数,发现这个对于每一位都是一样的,可以使用矩乘优化计算。但是我的DP一直是错的……到死也没de出来。
后来发现我的计算是不对的,不应该对4,5,6分别计算,而应该对它们的lcm60取模,这样的话我们使用矩乘优化,之后取所有能整除4,5,6的数的结果即可。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int INF = ;
const ll mod = 1e9+; ll read()
{
ll ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} struct matrix
{
ll a[][];
void init(int x)
{
memset(a,,sizeof(a));
rep(i,,M-) a[i][i] = x;
}
matrix operator * (const matrix &g) const
{
matrix p;
p.init();
rep(i,,M-)
rep(j,,M-)
rep(k,,M-) p.a[i][j] += a[i][k] * g.a[k][j],p.a[i][j] %= mod;
return p;
}
matrix operator *= (const matrix &g)
{
return *this = *this * g;
}
matrix operator ^ (ll g)
{
matrix p,q = *this;
p.init();
while(g)
{
if(g & ) p *= q;
q *= q;
g >>= ;
}
return p;
}
}f,g; ll l,r,k,ans; int main()
{
l = read(),r = read(),k = read();
f.init();
rep(i,,M-)
{
rep(j,,M-) f.a[j][i] = k / M % mod;
rep(j,,k%M-) f.a[(i+j) % M][i]++,f.a[(i+j) % M][i] %= mod;
}
g = f ^ r;
rep(i,,M-) if(i % == || i % == || i % == ) ans += g.a[i][],ans %= mod;
g = f ^ (l - );
rep(i,,M-) if(i % == || i % == || i % == ) ans += (mod - g.a[i][]),ans %= mod;
printf("%lld\n",ans);
return ;
}
2018.10.20 XMYZ Day1总结的更多相关文章
- OSC Source Code Innovation Salon(2018.10.20)
时间:2018.10.20地点:北京 朝阳 浦项中心B座2层
- 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)
i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...
- 【2018.10.20】CXM笔记(思维)
1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...
- POI 2018.10.20
[POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...
- 2018.10.20 bzoj2748: [HAOI2012]音量调节(背包)
传送门 这题是不是太sbsbsb了一点. 难度直逼普及-. 直接背包判存在性就行了. 代码: #include<bits/stdc++.h> using namespace std; bo ...
- 2018.10.20 bzoj1925: [Sdoi2010]地精部落(dp)
传送门 dp好题. 设f[i][j]f[i][j]f[i][j]表示iii个数结尾是jjj且结尾两个数递增的方案数. 那么显然可以对称的定义出g[i][j]g[i][j]g[i][j]表示iii个数结 ...
- 2018.10.20 bzoj1079: [SCOI2008]着色方案(多维dp)
传送门 dp妙题. f[a][b][c][d][e][last]f[a][b][c][d][e][last]f[a][b][c][d][e][last]表示还剩下aaa个可以用一次的,还剩下bbb个可 ...
- 2018.10.20 bzoj1068: [SCOI2007]压缩(区间dp)
传送门 这题转移很妙啊. f[l][r][1/0]f[l][r][1/0]f[l][r][1/0]表示对于区间[l,r][l,r][l,r]有/无重复的机会时压缩的最小值. 那么可以从三种情况转移过来 ...
- 2018.10.20 loj#2593. 「NOIP2010」乌龟棋(多维dp)
传送门 f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示用iii张111,jjj张222,kkk张333,lll张444能凑出的最大贡献. 然后从f[i−1][j][ ...
随机推荐
- javascript、jquery 、C#、sqlserveer、mysql、oracle中字符串截取的区别和用法
下标从0开始 ,并且包括起始位 javascript 中字符串截取 : substring(Number start,Number end) var substr = "liuguangfa ...
- C#中将数字金额转成英文大写金额的函数
<span style="white-space:pre"> </span>/// <summary> /// 数字转金额大写 /// 调用示例 ...
- HTTP协议详解【转载】
Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前 ...
- HDU 4609 FFT+组合数学
3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- P1427 小鱼的数字游戏 洛谷
https://www.luogu.org/problem/show?pid=1427 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字 ...
- CPU 天梯图
- ArcGIS中Shapefile和Geodatabase坐标容差的问题
转自原文 ArcGIS中Shapefile和Geodatabase坐标容差的问题 ArcGIS中,Shapefile文件是没有容差设置的,所以无论什么单位的坐标写入shapefile文件,都不存在容差 ...
- 百亿级企业级 RPC 框架开源了!
今天给大家介绍给一款性能卓越的 RPC 开源框架,其作者就是我推荐每个 Java 程序员都应该看的<Java 生态核心知识点整理>的原作者张玉龙. 说实话我第一次看到这个资料的时候,就感觉 ...
- Meteor软件包管理
Meteor 提供数千种开发应用程序,您可以使用社区包. 添加软件包 您可以查看Meteor官方包服务器: 点击这里. 只搜索你需要的包,并在命令提示符窗口中添加它. 例如,想使用 http 包添加到 ...
- MySQL 资源大全
干货!MySQL 资源大全 提交 我的留言 加载中 已留言 shlomi-noach 发起维护的 MySQL 资源列表,内容覆盖:分析工具.备份.性能测试.配置.部署.GUI 等. 伯乐在线已在 Gi ...