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][ ...
随机推荐
- 校第十六届大学生程序设计竞赛暨2016省赛集训队选拔赛(Problem E)
Problem E Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值
[bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...
- Django 的信号 & Flask 的信号
信号:框架内部已帮助开发者预留的可扩展的位置 一.Django 的信号 项目目录结构: django_signal |--- app01 |--- models.py |--- views.py .. ...
- [Vijos] 天才的记忆
背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...
- 【搜索引擎】SOLR VS Elasticsearch(2019技术选型参考)
SOLR是什么 (官方的解释) Solr是基于Apache Lucene构建的流行的.快速的.开源的企业搜索平台. Solr也是高度可靠.可伸缩和容错的,提供分布式索引.复制和负载平衡查询.自动故障转 ...
- (转)Redis
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 Redis是 一个key-value存储系统.和Memcached类似,但是解决 ...
- Linux下设置swappiness参数来配置内存使用到多少才开始使用swap分区(转)
swappiness的值的大小对如何使用swap分区是有着很大的联系的.swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用s ...
- 信号量学习 & 共享内存同步
刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现 ...
- cocos2d-x 2.0下怎样让BOX2D DEBUG DRAW的方法笔记
原文链接: 这两天玩 cocos2d-x 和 box2d,发现 cocos2d-x 2.0 版本号要使用老方法 debug 渲染会出错.于是找到了新方法来 debug draw: 首先在你的头文件中添 ...
- android JNI 资料大全
AndroidJNI 通过C++调用JAVA 1. JNIEnv对象 对于本地函数 JNIEXPORT void JNICALL Java_video1_TestNative_sayHel ...