模拟赛-2018.12.9

  这是NOIP之后第一次模拟赛...但是考的比较悲惨。

  非常喜欢写考试总结,不知道为什么...

  T1:https://www.luogu.org/problemnew/show/P4147

  暴力加剪枝,跑的非常快。正解是悬线法,应该会更快一些。

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <algorithm>
# define R register int using namespace std; const int maxn=;
int n,m,ans;
int a[maxn][maxn],u[maxn][maxn];
char c[]; int main()
{
scanf("%d%d",&n,&m);
for (R i=;i<=n;++i)
for (R j=;j<=m;++j)
{
scanf("%s",c+);
if(c[]=='R') a[i][j]=;
else a[i][j]=;
if(a[i][j])
u[i][j]=u[i-][j]+;
}
for (R i=;i<=n;++i)
for (R j=;j<=m;++j)
{
int s=u[i][j];
for (R k=j;k>=;--k)
{
s=min(s,u[i][k]);
if(s==) break;
if(s*j<=ans) break;
ans=max(ans,(j-k+)*s);
}
}
printf("%d",ans*);
return ;
}

T1

  T2:https://www.lydsy.com/JudgeOnline/problem.php?id=2351

  矩阵哈希,但是被卡常了,其实本机跑的还挺快的,但是一用Cena测就变慢很多,不知道为什么。后来将所有的哈希值存下来排序,再利用单调性离线做就过了。

  因为不想写双哈希,所以想了一种比较奇妙的哈希方法,只要出题人没想到可以这样做就不会被卡了。首先对于每一行进行哈希,然后再对哈希值进行哈希,这里的精髓是变换角度的时候换一个base,几乎不可能被卡。

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <algorithm>
# define R register int
# define ULL int using namespace std; const int maxn=;
const int base1=;
const int base2=;
int q,m,n,at,a,b,f[maxn][maxn],st,cnt;
ULL hash1[maxn][maxn],hash2[maxn][maxn],po1[maxn],po2[maxn],Hash[],s[maxn*maxn];
char c[maxn];
struct ask
{
int id,ans;
ULL v;
}A[maxn];
ULL get_hash (int i,int l,int r) { return hash1[i][r]-hash1[i][l]*po1[r-l]; }
bool cmp (ask a,ask b) { return a.v<b.v; }
bool cmp1 (ask a,ask b) { return a.id<b.id; } int main()
{
scanf("%d%d%d%d",&m,&n,&a,&b);
po1[]=;
for (R i=;i<=n;++i)
po1[i]=po1[i-]*base1;
po2[]=;
for (R i=;i<=n;++i)
po2[i]=po2[i-]*base2;
for (R i=;i<=m;++i)
{
scanf("%s",c+);
for (R j=;j<=n;++j)
{
if(c[j]=='') f[i][j]=;
else f[i][j]=;
hash1[i][j]=hash1[i][j-]*base1+f[i][j];
}
}
for (R i=;i<=m;++i)
for (R j=b;j<=n;++j)
hash2[i][j]=hash2[i-][j]*base2+get_hash(i,j-b,j);
for (R i=a;i<=m;++i)
for (R j=b;j<=n;++j)
s[++st]=hash2[i][j]-hash2[i-a][j]*po2[a];
sort(s+,s++st);
scanf("%d",&q);
while(q--)
{
memset(Hash,,sizeof(Hash));
for (R i=;i<=a;++i)
{
scanf("%s",c+);
for (R j=;j<=b;++j)
if(c[j]=='') f[i][j]=;
else f[i][j]=;
}
for (R i=;i<=a;++i)
for (R j=;j<=b;++j)
Hash[i]=Hash[i]*base1+f[i][j];
for (R i=;i<=a;++i)
Hash[i]=Hash[i-]*base2+Hash[i];
A[++at].id=++cnt;
A[at].v=Hash[a];
}
int p=;
sort(A+,A++at,cmp);
for (R i=;i<=at;++i)
{
while(p<=st&&s[p]<A[i].v) p++;
if(s[p]==A[i].v) A[i].ans=;
}
sort(A+,A++at,cmp1);
for (R i=;i<=at;++i)
printf("%d\n",A[i].ans);
return ;
}

T2

  T3:https://www.lydsy.com/JudgeOnline/problem.php?id=1398

  题意概述:最小表示法板子题;

  ...可惜我不会.考场上手推了一个不知道复杂度多少的算法,但是跑的非常快,只是读错了输出要求丢了十分,下次要认真读题.

  说一下我自己编的做法:

  首先将字符串复制一份拼在后面:abac->abacabac.

  从之前的半段找到最小的字母作为开头,会发现有两个:

  

  那么把这两个点都加入队列里面,下一轮接着比较,发现第一个更优,此时当前最优解只有一个了,就是最终答案.

  但是这样做对于随机数据的确很快,对于构造的数据就变得很慢了,举个例子:aaaaa;

  但是这个算法并没有就此而至,要巧妙的应用最优解的性质,比如说这样,当前两个解都扫描到了相同的长度,但还没有分出高下.

  

  显然后面那个"可能的最优解"没有必要再保留了,因为绿色段最好也就是和蓝色段一样好(否则它就是最优解了),所以前者将来可能制造的最优解不会比后者劣,加上这个优化后跑的飞快,也许均摊证一下复杂度会变得非常科学?如果有人会证明或者Hack请私信我,谢谢~

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <algorithm>
# define R register int using namespace std; const int maxn=;
char s[maxn],t[maxn],ds[maxn];
int len,f,vis[maxn];
int q1[maxn],q2[maxn]; void min_dic ()
{
memset(vis,,sizeof(vis));
int minn=,beg=;
int t1=,t2=;
for (R i=;i<=len;++i)
minn=min(minn,(int)s[i]);
for (R i=;i<=len;++i)
ds[i]=ds[i+len]=s[i];
for (R i=;i<=len;++i)
if(ds[i]==minn) q1[++t1]=i;
for (R i=;i<len;++i)
{
t2=;
for (R j=;j<=t1;++j)
if(q1[j]!=&&vis[ q1[j] ]==) q2[++t2]=q1[j];
if(t2==)
{
beg=q2[];
break;
}
t1=;
minn=;
for (R j=;j<=t2;++j)
minn=min(minn,(int)ds[ q2[j]+i ]);
for (R j=;j<=t2;++j)
if(ds[ q2[j]+i ]==minn) vis[ q2[j]+i ]=true;
else q2[j]=;
t1=t2;
for (R j=;j<=t1;++j)
q1[j]=q2[j];
}
for (R i=;i<=len;++i)
s[i]=ds[i-+beg];
} int main()
{
scanf("%s",s+);
len=strlen(s+);
min_dic();
for (R i=;i<=len;++i)
t[i]=s[i];
memset(s,,sizeof(s));
scanf("%s",s+);
min_dic();
int f=;
for (R i=;i<=len;++i)
if(t[i]!=s[i]) f=;
if(f) printf("No\n");
else printf("Yes\n"),printf("%s",s+);
return ;
}

T3

  T4:https://www.luogu.org/problemnew/show/P2860

  题意概述:边双板子题;

  一个小结论:缩完边双后的新图如果有$n$个叶子,那么需要再加$f(n)$条边才能变成一个大边双.

  $$f(n)=\begin {Bmatrix}0,n=1\\ \frac{n+1}{2},others\end{Bmatrix}$$

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <algorithm>
# define R register int using namespace std; const int maxn=;
const int maxm=;
int k,n,m,h=,firs[maxn],x,y,sta[maxn],Tp,ans,id[maxn],low[maxn],cnt,d[maxn],bp,color[maxn];
struct edge
{
int too,nex;
}g[maxm]; void add (int x,int y)
{
g[++h].nex=firs[x];
g[h].too=y;
firs[x]=h;
} void dfs (int x,int las)
{
id[x]=low[x]=++cnt;
sta[++Tp]=x;
int j;
for (R i=firs[x];i;i=g[i].nex)
{
if(i==(las^)) continue;
j=g[i].too;
if(!id[j]) dfs(j,i);
low[x]=min(low[x],low[j]);
}
if(id[x]==low[x])
{
color[x]=++bp;
while(sta[Tp]!=x)
{
color[ sta[Tp] ]=bp;
Tp--;
}
Tp--;
}
} int main()
{
scanf("%d%d",&n,&m);
for (R i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for (R i=;i<=n;++i)
if(!id[i]) dfs(i,-);
for (R i=;i<=n;++i)
for (R j=firs[i];j;j=g[j].nex)
{
k=g[j].too;
if(color[i]!=color[k]) d[ color[k] ]++,d[ color[i] ]++;
}
for (R i=;i<=bp;++i)
if(d[i]==) ans++;
if(ans==) printf("");
else printf("%d",(ans+)/);
return ;
}

T4

  T5:https://www.luogu.org/problemnew/show/P4819

  题意概述:有$n$个人,$m$对认识关系(单向),其中有一个人是杀手,如果问普通人,那他就会告诉你他认识的人中有没有杀手,否则就会被杀,每个人是杀手的概率相同,求最优策略下不被杀的概率.

  显然要先缩点,然后入度为零的问一问,就没了...吗?

  考试时这么写,挂成了25分.这道题还需要用到一点人类智慧.

  举个例子:5 0这组数据,被杀的概率用我的做法做是1,但其实是0.8,因为如果问了四个人都不是杀手,第五个人就不用问了,推广一下,如果有一个入度为0的联通分量的大小为一,且连出去的边指向的点入度不为一,这个点就是一个可有可无的点,不过即使有很多这样的点也只能删一个,注意一下.

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <vector>
# include <algorithm>
# define R register int using namespace std; const int maxn=;
const int maxm=;
int k,ans,h,x,y,n,m,siz[maxn],firs[maxn],id[maxn],low[maxn],color[maxn],bp,cnt,r[maxn],sta[maxn],Tp,vis[maxn];
struct edge
{
int too,nex;
}g[maxm];
struct edg
{
int x,y;
}ed[maxm];
vector <int> v[maxn]; void add (int x,int y)
{
g[++h].too=y;
g[h].nex=firs[x];
firs[x]=h;
} void dfs (int x)
{
id[x]=low[x]=++cnt;
vis[x]=true;
sta[++Tp]=x;
int j;
for (R i=firs[x];i;i=g[i].nex)
{
j=g[i].too;
if(!id[j])
{
dfs(j);
low[x]=min(low[x],low[j]);
}
else
{
if(vis[j]) low[x]=min(low[x],low[j]);
}
}
if(id[x]==low[x])
{
color[x]=++bp;
vis[x]=false;
siz[bp]++;
while(sta[Tp]!=x)
{
color[ sta[Tp] ]=bp;
vis[ sta[Tp] ]=false;
Tp--;
siz[bp]++;
}
Tp--;
}
} bool check (int x)
{
if(siz[x]>) return false;
int sz=v[x].size();
for (R i=;i<sz;++i)
if(r[ v[x][i] ]==) return false;
return true;
} bool cmp (edg a,edg b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
} int main()
{
scanf("%d%d",&n,&m);
for (R i=;i<=m;++i)
scanf("%d%d",&ed[i].x,&ed[i].y);
sort(ed+,ed++m,cmp);
for (R i=;i<=m;++i)
if(ed[i].x!=ed[i-].x||ed[i].y!=ed[i-].y) add(ed[i].x,ed[i].y);
for (R i=;i<=n;++i)
if(!id[i]) dfs(i);
for (R i=;i<=n;++i)
for (R j=firs[i];j;j=g[j].nex)
{
k=g[j].too;
if(color[i]!=color[k]) r[ color[k] ]++,v[ color[i] ].push_back(color[k]);
}
for (R i=;i<=bp;++i)
if(r[i]==) ans++;
for (R i=;i<=bp;++i)
if((r[i]==)&&check(i))
{
ans--;
break;
}
ans=n-ans;
printf("%.6lf",(double)ans/n);
return ;
}

T5

  今天又是被烜神仙吊着锤的一天呢,自闭了,还是要提高知识水平呀.

---shzr

loli的测试-2018.12.9的更多相关文章

  1. 2018.12.7 浪在ACM 集训队第八次测试赛

    2018.12.7 浪在ACM 集训队第八次测试赛  https://blog.csdn.net/QLU_minoz/article/details/84886717   感谢苗学林同学C题和D题题解 ...

  2. 2018.12.02 Socket编程之初识Socket

    Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...

  3. OPPO Developers Conference(2018.12.26)

    时间:2018.12.26地点:北京国家会议中心

  4. Tencent Cloud Developers Conference(2018.12.15)

    时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店

  5. 2018.12.1 Test

    目录 2018.12.1 Test A 串string(思路) B 变量variable(最小割ISAP) C 取石子stone(思路 博弈) 考试代码 B C 2018.12.1 Test 题目为2 ...

  6. 「版本升级」MyEclipse CI 2018.12.0正式发布

    新版本MyEclipse为WildFly 14新增一个新的服务器连接器,改进性能并新增一些Java 10修复程序.新版本为IDE做了几个核心修复,这是MyEclipse 2018一个更棒的升级. [M ...

  7. 微信小程序 - 接口更新记录以及解决方案(2018/12/26)

    2018/8/17 - 背景音频需要在app.json添加requireBackGroundModes 2018/9/12 - 微信更改获取用户信息接口/获取位置等接口 - button 2018/1 ...

  8. 调试大叔V2.1.0(2018.12.17)|http/s接口调试、数据分析程序员辅助开发神器

    2018.12.17 - 调试大叔 V2.1.0*升级http通讯协议版本,完美解决Set-Cookie引起的系列问题:*新增Content-Type编码格式参数,支持保存(解决模拟不同网站或手机请求 ...

  9. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

随机推荐

  1. jquery 3.1 tets

    r.extend = r.fn.extend = function () { var a, b, c, d, e, f, g = arguments[0] || {}, h = 1, i = argu ...

  2. C# 指定索引排序 (原)

    private void test(string[] sortkey_list, string[] list_temp) { //打开excel到dt: " }; string[] roww ...

  3. centos网卡配置NM_CONTROLLED=”yes” 慎用

    今天有1台服务器修改了 /etc/sysconfig/network-scripts/ifcfg-eth0 配置文件中的一个参数: NM_CONTROLLED=“yes” 修改成 NM_CONTROL ...

  4. for aws associate exam

    Topics which I read based on the previous forum discussions Amazon DynamoDB January 2016 Day at the ...

  5. mysql学生成绩排名,分组取前 N 条记录

    转载  https://blog.csdn.net/jslcylcy/article/details/72627762 score表: CREATE TABLE `score` ( `student_ ...

  6. pdf.js浏览中文pdf乱码的问题解决

    由于项目中需要支持移动设备在线浏览pdf,苹果还好,天生支持,但是安卓中就不行了,需要第三方组件的支持. 这里就找到了pdf.js,由于pdf数据太多,开始的时候没法一一测试,所以随便测试打开了几篇没 ...

  7. leetcode-mid-backtracking-17. Letter Combinations of a Phone Number

    mycode  68.26% class Solution(object): def letterCombinations(self, digits): """ :typ ...

  8. -----------------解决天天模拟器不能连接adb命令

    cmd------输入adb connect 127.0.0.1:6555即可 查询日志:adb shell "logcat |grep OkHttp"

  9. 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果

    背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...

  10. Ajax请求Json数据,报500错误,后台没有错误日志。

    post请求:http://localhost:9080/DataDiscoveryWeb/issueformcount/queryIssueTendencyDetail.xhtml?jobId=86 ...