1001:CCPC直播   字符串处理,几个if语句

1002:口算训练   前缀和处理<=根号n的因数,大于根号n的因数每个数至多有一个,用vector存下每个大因数的位置,map离散化。查询的时候lower_bound看是否存在即可。

1003:缺失的数据范围   式子单调增,二分答案。防溢出,需要double。

1004:寻宝游戏   神奇dp  dp[i][j][x][y]表示走到(i,j)位置,有x个已经过的格子未统计,y个未经过的格子统计了的最大总分。往右和往下走的时候分别转移。往下走转移时,要从大到小选取这一行末及下一行首未经过的若干统计。

#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
const int N=;
int n,m,k,a[N][N],b[N][N][N],f[N][N][][],sum,ans,tmp;
vector<int> vec[N];
void Max(int &x,int y){x=max(x,y);}
bool cmp(int A,int B){return A>B;}
int main()
{
int T=read();
while (T--)
{
n=read();m=read();k=read();
for (int i=;i<=n;i++) vec[i].clear();
memset(b,,sizeof(b));
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) {
a[i][j]=read();if (i==) continue;
for (int k=;k<j;k++) b[i][j][++*b[i][j]]=a[i][k];
for (int k=j+;k<=m;k++) b[i][j][++*b[i][j]]=a[i-][k];
sort(b[i][j]+,b[i][j]+*b[i][j]+,cmp);
}
memset(f,-,sizeof(f));
f[][][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k1=;k1<=k;k1++)
for (int k2=;k2<=k;k2++)
if (tmp=f[i][j][k1][k2],tmp!=-)
{
if (j!=m||i==n)//right
{
Max(f[i][j+][k1+][k2],tmp);
Max(f[i][j+][k1][k2],tmp+a[i][j]);
}
if (i!=n)//down
{
sum=;
for (int z=;z<=k-k2;z++)
sum+=z==?:b[i+][j][z],
Max(f[i+][j][k1+][k2+z],tmp+sum),
Max(f[i+][j][k1][k2+z],tmp+a[i][j]+sum);
}
}
ans=;
for (int k1=;k1<=k;k1++)
Max(ans,f[n][m+][k1][k1]);
printf("%d\n",ans);
}
return ;
}

1005:奢侈的旅行  cost=log((level+a[i])/level),那么sigma_cost=log((1+a1)/1)+log((1+a1+a2)/(1+a1))+log((1+a1+a2+a3)/(1+a1+a2))+...,

根据log的变换,sigma_cost=log(1+a1+a2+...+ak)。要使得sigma_cost最小,即使得所有经过的ai之和最小。而每一条边cost>=bi,即level(也就是ai前缀和)<=ai/(2^bi-1),所以ai之和越小越好啦,跟上一个限制的目的一样。

按照ai跑个最短路,走每一条边的时候看限制是否通过即可。(现场大脑死机没想出log的转换,回家种地T_T)

1006:对称数  莫队+分块真的是可以过的啦,括号序列版多了两倍常数就光荣TLE了,以后树分块还是写直接分块、树上跳跃、然后去掉lca、查询时要特判的版本吧。(一开始想莫队+set,没有算好复杂度,结果后来没有时间改掉括号序列,一个是时间复杂度算得不够仔细,一个是转思路不够快)。莫队复杂度现场推,卡均值还是TTT。

正解似乎是某种套路。主席树+二分。出现不出现相当于异或。当权值区间[l,r]中实际的权值异或和=w[l]^w[l+1]^...^w[r](全取1次的异或和),那么大概率[l,r]中的权值都出现奇数次(w为随机权值,小概率被卡)。这样的话对于每一个点到根的链维护主席树(为什么要用主席树呢?因为主席树支持相减/相异或,比较方便统计出现次数),四棵主席树异或一下就能维护出l->r的路径。然后二分找没有出现过的最小权值。

bitset暴力异或+分块卡空间也是一种可行做法。

1007:赛题分析  序列取Min

1008:quality算法  图论转换题。由于B图中的每个点都只有两条边连出,不看B点, 就是一条连接A中两个点的边,由此A变成了一张完全图。问题转换成在A中选择n条边定向,并且每个点有且仅有一条入边,使得这n条边的权值最小。

基环森林是一个符合题意的构造。

由于有n^2条边,不能按照kruskal一样直接对边排序,我们从高位到低位按位对点权进行分治。

尽量在该位相同的块中连边,按照块的大小决策需要在块之间连多少边。

如果两个块的大小都>=3,那么内部必然能构成基环森林。中间不连边。

如果其中一个块的大小<3,连一条边成链。

两个块的大小都<3,连两条边构成环。

如果要连边就暴力枚举。时间复杂度O(nloga)。

//记得要判层数d==-1跳出,有可能点权都相等。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
const int N=;
const int inf=0x3f3f3f3f;
int n,a[N],Mn,Mc,tmp;
ll ans;
void solve(int l,int r,int id)
{
if (l==r||id==-) return;
if (l+==r) {ans+=a[l]^a[r];return;}
int cnt=l-;
for (int i=l;i<=r;i++)
if (!((a[i]>>id)&)) cnt=i;else break;
if (cnt==r||cnt==l-) {solve(l,r,id-);return;}
else if (cnt-l+>=&&r-cnt>=) {solve(l,cnt,id-);solve(cnt+,r,id-);return;} Mn=Mc=inf;
for (int i=l;i<=cnt;i++)
for (int j=cnt+;j<=r;j++)
if (tmp=a[i]^a[j],tmp<Mn) Mc=Mn,Mn=tmp;
else if (tmp<Mc) Mc=tmp;
if (cnt-l+<&&r-cnt<) ans+=(ll)Mn+Mc;
else ans+=Mn;
solve(l,cnt,id-);solve(cnt+,r,id-);
}
int main()
{
int T=read();
while (T--)
{
n=read();ans=;
for (int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);
solve(,n,);
printf("%lld\n",ans);
}
return ;
}

1009:SA-IS后缀数组  fy:快快快,后缀数组裸题!~10分钟后~忘记板子怎么背了。

这道题会卡nlogn,由于它是比较相邻两个后缀的大小关系,如果第一位不相同那么直接判掉。否则可以根据后一位两个后缀的大小关系判断。

1010:回文树   每个点的点权在[1,n]随机,那么答案的数量是O(n)的。考虑每个点、每条边为对称中心,暴力bfs枚举所有答案即可。hash判断,注意bfs的时候同子树中的答案减去。时间复杂度O(nlogn)。

1011:代码派对  一开始想数据结构、扫描线什么的。。。果不其然地跑偏。

差分前缀和统计覆盖某个点的矩形个数sum[i][j]。如果直接统计C(sum[i][j],3])的和,会算重。

考虑两个方向(折半去重),减去同时覆盖(i,j)和(i-1,j)的矩形三元组个数,减去同时覆盖(i,j)和(i,j-1)的矩形三元组个数,再加上同时覆盖(i,j),(i-1,j-1)的矩形三元组个数,就是答案。

统计同时覆盖两个格子的矩形数可以通过将所有矩形的右下角左缩进或上缩进,同样以前缀和统计。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
int n,xa,xb,ya,yb,sum[][N][N];
ll c3(int n){return (ll)n*(n-)*(n-)/;}
void add(int x,int Xa,int Ya,int Xb,int Yb)
{
if (Xa>Xb||Ya>Yb) return;
sum[x][Xa][Ya]++;
sum[x][Xa][Yb+]--;
sum[x][Xb+][Ya]--;
sum[x][Xb+][Yb+]++;
}
int main()
{
int T;scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (int x=;x<;x++) memset(sum[x],,sizeof(sum[x]));
for (int i=;i<=n;i++)
{
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
add(,xa,ya,xb,yb);
add(,xa,ya,xb,yb-);
add(,xa,ya,xb-,yb);
add(,xa,ya,xb-,yb-);
}
for (int i=;i<=;i++)
for (int j=;j<=;j++)
for (int x=;x<;x++)
sum[x][i][j]+=sum[x][i-][j]+sum[x][i][j-]-sum[x][i-][j-];
ll ans=;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
ans+=c3(sum[][i][j])-c3(sum[][i][j-])-c3(sum[][i-][j])+c3(sum[][i-][j-]);
printf("%lld\n",ans);
}
return ;
}

那么,加油!

CCPC-WFinal-女生专场的更多相关文章

  1. HDU 6024(中国大学生程序设计竞赛女生专场1002)

    这是CCPC女生专场的一道dp题.大佬们都说它简单,我并没有感到它有多简单. 先说一下题意:在一条直线上,有n个教室,现在我要在这些教室里从左到右地建设一些作为糖果屋,每个教室都有自己的坐标xi 和建 ...

  2. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

    Deleting Edges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  3. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)

    Graph Theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  5. 2017中国大学生程序设计竞赛 - 女生专场(dp)

    Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...

  6. 2018 CCPC 女生专场

    可能是史上最弱的验题人—— Problem A (小)模拟. #include <bits/stdc++.h> using namespace std; int T; int main() ...

  7. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

    A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...

  8. 2016女生专场 ABCDEF题解 其他待补...

    GHIJ待补... A.HUD5702:Solving Order Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  9. "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场

    Combine String #include<cstdio> #include<cstring> #include<iostream> #include<a ...

  10. hdu_5705_Clock("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5705 题意:给你一个时间和一个角度,问你下一个时针和分针形成给出的角度是什么时候 题解:我们可以将这个 ...

随机推荐

  1. node+webpack+vue的环境搭建

      一般第一次搭建环境的时候,多多少少还是会出点状况的.这个时候多去百度,看牛人怎么解决,然后跟着尝试,多试几遍还是能解决的. 先说一下我安装的过程吧 1.我一开始按照官网的来搭建,失败了.报错内容是 ...

  2. 2018 最新 spring boot 整合 swagger2 (swagger2 版本 2.8.0)

    好久没上了, 看到又有人回复了. 我就来修改一下. 修改时间  2018年5月16日 这回给你上全新版本. 至发稿时间,所有的包都是新版. 注意: 高版本需要添加  jaxb-api 包, 否则会报错 ...

  3. xinetd - 扩展的互联网服务守护进程

    总览 SYNOPSIS xinetd [options] 描述 DESCRIPTION xinetd 执行与 inetd 相同的任务:它启动提供互联网服务的程序.与在系统初始化时启动这些服务器,让它们 ...

  4. codeforces750E New Year and Old Subsequence 矩阵dp + 线段树

    题目传送门 思路: 先看一个大牛的题解 题解里面对矩阵的构造已经写的很清楚了,其实就是因为在每个字符串都有固定的很多中状态,刚好可以用矩阵来表达,所以$(i,j)$这种状态可以通过两个相邻的矩阵的$m ...

  5. 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端

    Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的f ...

  6. 网址URL知识

    URL由三部分组成:资源类型.存放资源的主机域名.资源文件名. URL的一般语法格式为: (带方括号[]的为可选项): protocol :// hostname[:port] / path / [; ...

  7. ajax 工作原理

    Ajax的优缺点及工作原理? 定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).Ajax 是一种用于创建快速动态网 ...

  8. Vue.js 样式绑定(1)

    demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  9. re.match与re.search的区别

    re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None:而re.search匹配整个字符串,直到找到一个匹配. 实 ...

  10. 01二重退背包+组合数学——cf1111d

    退背包进阶,还是挺难想的 /* dp1[k]表示取到体积k的方案数 dp2[i][j][k]表示左侧必选ij的情况下,取到体积k的方案数 dp2[i][j][k]=dp1[k]-左侧不选ij的方案数 ...