思路接近正解?都想到了?这都是借口呀。

没有用的,往前走吧。

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 反思总结的更多相关文章

  1. [CSP-S模拟测试47]反思+题解

    打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  6. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  7. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  8. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  9. [考试反思]0919csp-s模拟测试47:苦难

    ISOLATION 也不粘上面的了,先管好自己. 附了个近期总分,可以看出什么. 反思一下考试心态: 开场看题目,T1傻逼题不用脑子,T2傻逼板子,T3... 这T3是啥啊?没看懂题目啊?再看一遍.啥 ...

随机推荐

  1. sqlite3加密

    最近因为工作原因,需要使用sqlite数据库.sqlite数据库小并且使用方便,感觉挺不错的.但有一个不足就是没有对数据库进行加密,不过好的是sqlite预留有加密的接口,我们可以直接调用即可.我也是 ...

  2. Cocos2d-x 创建工程python脚本

    @echo offset /p projectName=请输入项目名称:if "%projectName%"=="" goto inputErrorset /p ...

  3. IDEA(2018)连接MySQL数据库失败的解决方法(报错08001)

     解决方法: 将url改成: jdbc:mysql://localhost:3306/studentmanage?useSSL=true&serverTimezone=Hongkong& ...

  4. 11_数据降维PCA

    1.sklearn降维API:sklearn. decomposition 2.PCA是什么:主成分分析 本质:PCA是一种分析.简化数据集的技术. 目的:是数据维数压缩,尽可能降低原数据的维数(复杂 ...

  5. 基于neighborhood models(item-based) 的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.2neighborhood models部分内容(其余部分会陆续补充上来). koren论文中用到netflix 数据集, 过于大, 在普通的 ...

  6. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

  7. drools跳转出现错误问题(400)

    400 Sorry, a technical error occurred. Please contact a system administrator. 今天drools的管理平台tomcat部署完 ...

  8. kafka一些问题点的分析

    kakfka架构图: 理解kafka需要理解三个问题. 1.producer,broker,consumer,ZK的工作模式. broker,ZK是作为一个后台服务,而producer和consume ...

  9. springboot4.1.1的log4j2配置

    一.默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台: 日志输出内容元素具体如下: 时间日期:精确到毫秒 日志级别:ERROR, WARN, INFO, D ...

  10. 【linux之路】常用的命令

    用bash插入代码 1.查看ubuntu的版本号 lsb_release –a //linux标准基础(Linux Standards Base):release发布 2.查看Ubuntu的内核 un ...