2019.9.19 csp-s模拟测试47 反思总结
思路接近正解?都想到了?这都是借口呀。
没有用的,往前走吧。
T1:Emotional Flutter
我的做法和题解不太一样,我把s放在最后考虑了。
因为出发以后步幅是一样的,所以每一个黑条可以ban掉一段出发点。把黑条的左右边界%k存成区间,每个黑条可以存一个或者两个区间【跨越k这个边界】。然后像以前写区间覆盖的贪心一样按左端点排序,看看有没有长至少为s的空余。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
int s,k,n,flag,flag1;
int a[],cnt;
long long sum[];
struct node{
int l,r;
}b[];
bool cmp(node x,node y){
if(x.l<y.l)return true;
else if(x.l==y.l){
if(x.r<y.r)return true;
else return false;
}
else return false;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&s,&k,&n);
flag=;
cnt=;
if(k<s)flag=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>=k&&i&)flag=;
sum[i]=sum[i-]+a[i];
}
if(flag){
printf("NIE\n");
continue;
}
for(int i=;i<=n;i+=){
long long x=sum[i-]+,y=sum[i];
if(x/k<y/k){
b[++cnt].l=,b[cnt].r=y%k;
b[++cnt].l=x%k;b[cnt].r=k-;
}
else{
b[++cnt].l=x%k,b[cnt].r=y%k;
}
}
sort(b+,b+cnt+,cmp);
int r=-;
for(int i=;i<=cnt;i++){
if(b[i].l-r->=s){
flag=;
break;
}
r=max(b[i].r,r);
}
if(k-r->=s)flag=;
if(flag)printf("TAK\n");
else printf("NIE\n");
}
return ;
}
至于考场上对s的处理混乱,没有考虑黑条的时候才判断是否大于k……这些,都是不应该犯的错误才对。
T2:Endless Fantasy
题意很明确,统计一个子树内人数最多的A以及这个人数B,需要考虑的就是怎么去除因为dfs序的限制而产生的其它不相关子树的影响。
……其实是道板子题,但是我当时在树上启发式合并那个地方偷懒了,没学……
咳,欠下的总是要还的,我好像之前也说过这句话…
于是一边跟自己生气一边头铁,大半夜开始学树上启发式合并【这个时候刚刚改完T1】。先是几乎默写了一遍板子,在1:24的时候通过T2。然后再自己理解着重来一次,三点钟又交了一次。大约是晚上状态很差花的时间不短,神奇的是两次的代码居然一模一样,可能我还是背会的……?
嗯,那么再来记一遍树上启发式合并。
对于每个节点,统计它的答案。首先solve所有轻儿子的答案,然后再遍历一次去除它们对统计数组的影响。然后solve重儿子,这一次不用清除,直接先让当前节点继承它处理过的统计数组以及答案。最后再次遍历轻儿子及其子树,把它们的信息累加到统计数组里。这样可以避免其它不相关节点的信息留在统计数组里造成影响,也可以避免每次暴力清除和合并【虽然树上启发式合并就是个优化的暴力】。树上启发式合并可以少跑重儿子的清除,虽然轻儿子会多跑两次。处理轻儿子的总时间复杂度是O(nlogn)级别,处理重儿子是O(n)级别,总复杂度O(nlogn)。
另外再提一下,线段树合并也是O(nlogn)级别的,而平衡树合并是O(nlog2n)。到刚刚为止我都算错了线段树合并的复杂度,不然哪来这么多事【捶桌】。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans[][],a[],b[],f[];
int ver[],Next[],head[],tot;
int siz[];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int fa){
siz[x]=;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
dfs(y,x);
siz[x]+=siz[y];
}
}
void ins(int x,int y,int v,int opt){
if(opt==){
f[x]+=y;
if(f[x]>ans[v][]||(f[x]==ans[v][]&&x<ans[v][])){
ans[v][]=x;
ans[v][]=f[x];
}
}
else f[x]-=y;
}
void count(int x,int fa,int v,int opt){
ins(a[x],b[x],v,opt);
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
count(y,x,v,opt);
}
}
void solve(int x,int fa){
int v=;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
if(siz[y]>siz[v])v=y;
}
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa||y==v)continue;
solve(y,x);
count(y,x,x,);
}
if(v)solve(v,x),ans[x][]=ans[v][],ans[x][]=ans[v][];
ins(a[x],b[x],x,);
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa||y==v)continue;
count(y,x,x,);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
for(int i=;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
dfs(,);
solve(,);
for(int i=;i<=n;i++)printf("%d %d\n",ans[i][],ans[i][]);
return ;
}
T3:字符消除2
【考试的时候我疑惑了一下为什么题目名称画风变了主人公也变了,仔细一看题面,这个语死早的感觉,一定不是同一个出题人,你看看T2的题面多良心……【大雾】】
你好,题面理解先gank掉半小时。【并没有这么夸张】
我想到了kmp,因为我只会kmp,不要提什么自动机自动机我全忘了还没复习】】】
虽然改错的时候发现kmp也快记错了…
考场上没什么思路,打了个暴力dfs。题解给出的正解是跑kmp,从n开始往回跳的next数组就是t集合。即t集合包含n,next[n],next[next[n]]……
可能是我对题目理解还是有偏差。我觉得对于原串,所求出的这个并非t集合,而是与每一个t对应的,原串折叠回去的长度。
求出这个t集合以后开始生成01串,t作为现在已经生成的串长。考虑从前一个t到下一个t,因为t是结尾折叠回去的长度,每个t对应的串结尾部分一定相同。于是如果上一个t长*2大于等于当前t的串长,直接把当前t减去上一个t的长度复制成上一个t的结尾。如果上一个t长*2小于当前串长,那么除了复制的一段,中间还要填0或者1。最优的情况肯定是全部填成0,但是这样可能会使得不该与t对应的长度满足了t的条件。发现中间填的这一段的最后一个数字就可以决定这一段是否与原串不相符,所以可以只考虑这个位置填什么。
题解的做法是往回跳next,并看当前串长与是非被减去重复部分的串长整除。但我手模了很多组数据,感觉只有后面新的一部分串和前面完全相同的时候才可能出现冲突。等一下试着写写。
诶 不是 不对,刚刚只改了一个地方,照这样尝试只有六十分……不过可能是别的问题 我再看看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,j,k,len,nxt[],nxt1[],a[],b[],cnt;
char s[];
int main()
{
scanf("%d",&n);
while(n--){
scanf("%s",s+);
len=strlen(s+);
j=;
cnt=;
memset(nxt,,sizeof(nxt));
memset(nxt1,,sizeof(nxt1));
memset(b,,sizeof(b));
for(int i=;i<=len;i++){
while(j&&s[i]!=s[j+])j=nxt[j];
if(s[i]==s[j+])j++;
nxt[i]=j;
}
for(int i=len;i;i=nxt[i])a[++cnt]=i;
sort(a+,a+cnt+);
for(int i=;i<a[];i++)b[i]=;
b[a[]]=;
b[]=;
k=;
for(int i=;i<=a[];i++){
while(k&&b[i]!=b[k+])k=nxt1[k];
if(b[i]==b[k+])k++;
nxt1[i]=k;
}
for(int i=;i<=cnt;i++){
if(a[i-]*>=a[i]){
for(int l=a[i-]+;l<=a[i];l++){
b[l]=b[l-(a[i]-a[i-])];
while(k&&b[l]!=b[k+])k=nxt1[k];
if(b[l]==b[k+])k++;
nxt1[l]=k;
}
}
else{
for(int l=a[i-]+;l<a[i]-a[i-];l++){
b[l]=;
while(k&&b[l]!=b[k+])k=nxt1[k];
if(b[l]==b[k+])k++;
nxt1[l]=k;
}
int flag=,pos=a[i]-a[i-],p=k;
while(p){
if(!b[p+]){
if(pos%(pos-p-)==)flag=;
}
p=nxt1[p];
}
if(!b[p+]){
if(pos%(pos-p-)==)flag=;
}
if(flag)b[pos]=;
else b[pos]=;
while(k&&b[pos]!=b[k+])k=nxt1[k];
if(b[pos]==b[k+])k++;
nxt1[pos]=k;
for(int l=pos+;l<=a[i];l++){
b[l]=b[a[i-]+l-a[i]];
while(k&&b[l]!=b[k+])k=nxt1[k];
if(b[l]==b[k+])k++;
nxt1[l]=k;
}
}
}
for(int i=;i<=len;i++)printf("%d",b[i]);
printf("\n");
}
return ;
}
在没放弃前都不算输家,记住这一点并继续加油吧。嗯,我这种垃圾不谈,希望的大家一定可以做到的。
2019.9.19 csp-s模拟测试47 反思总结的更多相关文章
- [CSP-S模拟测试47]反思+题解
打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
- [考试反思]0919csp-s模拟测试47:苦难
ISOLATION 也不粘上面的了,先管好自己. 附了个近期总分,可以看出什么. 反思一下考试心态: 开场看题目,T1傻逼题不用脑子,T2傻逼板子,T3... 这T3是啥啊?没看懂题目啊?再看一遍.啥 ...
随机推荐
- Django实现简单的图书管理系统
目录 Django写图书管理系统 功能截图 创建Django项目 开始项目 配置文件 建立路由关系 开始写Django项目 编写核心逻辑函数 写前端页面 add_author.html add_boo ...
- LUOGU P3387 【模板】缩点 (缩点+DAG dp)
解题思路 缩点后按拓扑排序跑一个dp. #include<iostream> #include<cstdio> #include<cstring> #include ...
- 如何学习AxureRP Axure学习方法
从作者最初接触的5.5版本,到5.6版本,到后来6.0的多个迭代版本,直到现在的6.5版本,AxureRP每次的版本升级都伴随着新功能的增 加,也解决了原型设计上的一些难题.这也从另一个方面诠释了“学 ...
- java基础温习 -- Thread synchronized关键字
synchronized 基本规则 1. 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或 ...
- charles-过滤网络请求方法
方法一:在主界面的中部的 Filter 栏中填入需要过滤出来的关键字.例如我们的服务器的地址是:https://www.baidu.com , 那么只需要在 Filter 栏中填入 https://w ...
- 编程之法:面试和算法心得(旋转字符串java实现)
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b ...
- 2019-8-31-dotnet-启动-JIT-多核心编译提升启动性能
title author date CreateTime categories dotnet 启动 JIT 多核心编译提升启动性能 lindexi 2019-08-31 16:55:58 +0800 ...
- Spring_关于@Resource注入为null解决办法
初学spring,我在dao层初始化c3p0的时候,使用@Resource注解新建对象是发现注入为null,告诉我 java.lang.NullPointerException. @Repositor ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--09--06CMDB测试Linux系统采集硬件数据的命令04
root 123456 ip addr init 0 root 123456 ip addr root 123456 python3 yum -y install zlib-devel bzip2-d ...
- 软件-SecureCRT:SecureCRT
ylbtech-软件-SecureCRT:SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件 ...