上周的忘写了……题目没有作者……

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总结的更多相关文章

  1. OSC Source Code Innovation Salon(2018.10.20)

    时间:2018.10.20地点:北京 朝阳 浦项中心B座2层

  2. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  3. 【2018.10.20】CXM笔记(思维)

    1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...

  4. POI 2018.10.20

    [POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...

  5. 2018.10.20 bzoj2748: [HAOI2012]音量调节(背包)

    传送门 这题是不是太sbsbsb了一点. 难度直逼普及-. 直接背包判存在性就行了. 代码: #include<bits/stdc++.h> using namespace std; bo ...

  6. 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个数结 ...

  7. 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个可 ...

  8. 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]有/无重复的机会时压缩的最小值. 那么可以从三种情况转移过来 ...

  9. 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][ ...

随机推荐

  1. [luoguP3178] [HAOI2015]树上操作(dfs序 + 线段树 || 树链剖分)

    传送门 树链剖分固然可以搞. 但还有另一种做法,可以看出,增加一个节点的权值会对以它为根的整棵子树都有影响,相当于给整棵子树增加一个值. 而给以某一节点 x 为根的子树增加一个权值也会影响当前子树,节 ...

  2. uva12558 Egyptian Fractions (HARD version)(迭代深搜)

    Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...

  3. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  4. Eval 和 Bind 的区别

    原文发布时间为:2008-10-20 -- 来源于本人的百度文章 [由搬家工具导入] 据绑定表达式包含在 <%# 和 %> 分隔符之内,并使用 Eval 和 Bind 函数。 Eval 函 ...

  5. 洛谷——P1546 最短网络 Agri-Net

    P1546 最短网络 Agri-Net 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一 ...

  6. mysql资料整理

    ###SQL的语言分类 1.DQL(Data Query Language):数据查询语言 select 2.DML(Data Manipulate Language):数据操作语言 insert . ...

  7. iOS: 解决Asset Catalog Compile Error - TDDIstiller instance can only be distilled only one time的错误

    执行命令:rm -rf /Users/<用户名>/Library/Developer/Xcode/DerivedData 然后重新编译项目即可.

  8. kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  9. Dell R420 RAID建立以及系统安装

    http://thefallenheaven.blog.51cto.com/450907/1753472 Dell R420的RAID划分,以及系统安装 3块2T的盘,装好硬盘后开机,这里有3种方式去 ...

  10. win8 metro 自己写摄像头录像项目

    这是要求不适用CameraCaptureUI等使用系统自带的 camera  UI界面.要求我们自己写调用摄像头摄像的方法,如今我把我的程序贴下: UI界面的程序: <Page x:Class= ...