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][ ...
随机推荐
- HDU-1858-Max Partial Value I,有坑点,不难;
Max Partial Value I Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Othe ...
- Lucene、Compass学习以及与SSH的整合
一.准备 个人在学习中采用Struts2 + Hibernate3.2 + Spring2.5 + Compass2.2.0, 一下图片为本次学习中用到的jar包: 图中圈出的jar包为本次学习的主要 ...
- 【2018 Multi-University Training Contest 1】
01:https://www.cnblogs.com/myx12345/p/9362221.html 02:https://www.cnblogs.com/myx12345/p/9382267.htm ...
- 给Ubuntu更换成163的源(sources.list)Unable to locate package
Refer to http://www.crifan.com/ubuntu_change_sources_list_to_163/ 1. backup /etc/apt/sources.list 2. ...
- JavaScript 将行结构数据转化为树结构数据源(高效转化方案)
js接收到后台的数据如下 /// 部门信息 var departRows = [{ parentDepartId: 'root', departId: 'DC', departName: '集团' } ...
- 2018 百度之星 初赛 第六题 HDU6349
三原色图 Accepts: 281 Submissions: 1261 Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 262144/ ...
- FatMouse's Speed--hdu1160(dp+输出路径)
Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...
- Duplicate property mapping of contactPhone found in
启动的时候报Duplicate property mapping of contactPhone found in com....的错误,是因为在建立实体对象的时候,有字段重复了,有的是继承了父类的字 ...
- 使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector
利用HD/IDE layer的ioctl函数接口获取HD/IDE的磁盘容量.HDIO_DRIVE_TASK 能发出訪问LBA地址的命令.但不能读写数据. #include <stdio.h&g ...
- 原生js 平滑滚动到页面的某个位置
window.scrollTo() 语法1: window.scrollTo(x-coord,y-coord) x-coord 是文档中的横轴坐标. y-coord 是文档中的纵轴坐标. 例子: w ...