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][ ...
随机推荐
- k/3cloud表格控件块粘贴代码逻辑
大家可以在表单插件EntityBlockPasting事件中自己处理,然后将cancel设置为true.以下代码可以参考一下,插件代码中需要将其中一些属性或方法修改,例如this.BusinessIn ...
- hdu3306:Another kind of Fibonacci
A(0)=A(1)=1,A(i)=X*A(i-1)+Y*A(i-2),求S(n)=A(0)^2+A(1)^2+A(2)^2+A(3)^2+……+A(n)^2. 这个矩阵有点毒.. #include&l ...
- Java jsp页面中jstl标签详解
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- Android服务Service
安卓Service服务 一 Service简介 Service是运行在后台的,没有界面的,用来处理耗时比较长的.Service不是一个单独的进程,也不是一个单独的线程. Service有两种类型 ...
- java HashMap的使用
java HashMap的使用 import java.util.HashMap; import java.util.Iterator; public class WpsklHashMap { pub ...
- [Bzoj1022][SHOI2008]小约翰的游戏John(博弈论)
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2976 Solved: 1894[Submit] ...
- Java函数式接口Consumer
Consumer是java8提供的函数式接口之一,意思为消费者,接受参数而不返回值 void accept(T t); default Consumer<T> andThen(Consum ...
- 北京交大yum
[base] name=CentOS-$releasever - Base #mirrorlist=http://mirrorlist.centos.org/?release=$releasever& ...
- Win7 SP1 安装SQL Server 2012时提示“此计算机上的操作系统不符合 SQL Server 2012的最低要求”
- CentOS 6.x ELK(Elasticsearch+Logstash+Kibana)
CentOS 6.x ELK(Elasticsearch+Logstash+Kibana) 前言 Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案, ...