题解

这次题目可真是太难了!

糟糕的运气使我AK的步伐寸步难行(士气严重下降)。

T1

这题还是比较水的(尽管我比赛时只拿了50分)

一些大佬们说:这题只是一道简单的暴力题,枚举l+二分r 就可以了。

另一些DL们说:这题就是一道水DP,用SPFA/Dij做就可以了。

我说:这题是一道看不出正解的难题,只能暴力水30分了!

于是乎我打了一个暴力,却手残脑残打了一个贪心,使当前的 L 尽可能小

本以为会GG,结果居然拿了50分!

可以发现,结果区间的L和R都必定在输入里出现(不然怎么可能走不过去?)

因此枚举L,二分R即可!

T2

这题还是有点水的(尽管我爆0)

不难发现这题要用Trie

可以按照T建也可以按照S建,我是按照T建的。

每一个节点上都额外多储存两个变量——last和sum,last建树时最后经过该节点的字符串编号,sum表示到当前字符串,与该字符串前缀相同的字符串组成的A数组中的最长全0串。

建树时,要维护每一个节点的last和sum。

询问时,走到S的尽头节点x(若走不到则输出n),输出\(\max(sum[x],n-last[x])\)即可。

T3

这题十分毒瘤!

一看题目,就觉得正解就是数论。

可以发现,假如 x[p]能够求出来,那么必定存在一对(i,j),满足 \(P\mod k[i]=0,P\mod k[j]=1\)。

这相当于 \(p=a1*k[i]=a2*k[j]+1\)即 \(a1*k[i]-a2*k[j]=1\),这个就可以用扩展欧几里得算法来求通解。

注意:有解的条件必定是gcd(k[i],k[j])=1

但是这样会重复,因此要用容斥原理去重。

我们可以设 f[s1][s2](其中 s1 表示 p mod k[i]=0 的集合,s2 表示 p mod k[j]=1 的集合,s1,s2 可以用二进制来压),来表示满足以下方程的 p 的个数:

\(P\mod k[i1]=0,P\mod k[i2]=0,P\mod k[i3]=0\), ……

\(P\mod k[j1]=1,P\mod k[j2]=1,P\mod k[j3]=1\), ……

事实上,这等价于满足两个方程。

\(P\mod lcm(k[i1],k[i2],…)=0,P\mod lcm(k[j1],k[j2],…)=1\)

这个方程的解的个数可以用扩展欧几里得来求。

因此我们可以用一个DFS枚举s1和s2来实现,当一共选择了奇数个元素时就为重复要减去,否则为不重复要加上。


CODE

T1

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1010
#define M 3010
#define inf 1e+6
struct EDGE
{
int end,l,r,next;
}edge[M<<1];
struct node
{
int first,num,l,r;
node(){first=num=l=r=0;}
}a[N];
int n,m,s,ans,L,R,left[M],right[M];
bool b[N];
inline void inc(int x,int y,int l,int r)
{
edge[++s]=(EDGE){y,l,r,a[x].first};
a[x].first=s;
edge[++s]=(EDGE){x,l,r,a[y].first};
a[y].first=s;
}
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
bool pd(int k)
{
b[k]=0;
if(k==n) return 1;
for(int i=a[k].first;i;i=edge[i].next)
if(edge[i].l<=L&&edge[i].r>=R&&b[edge[i].end]&&pd(edge[i].end))
return 1;
return 0;
}
int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
int i,j,x,y,l,r,mid,ans=0,ansl;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&left[i],&right[i]);
inc(x,y,left[i],right[i]);
left[i]=-left[i];
}
sort(left+1,left+m+1);
sort(right+1,right+m+1);
for(i=1;i<=m;i++) if(left[i]!=left[i-1])
{
l=1,r=m;
while(l<=r)
{
mid=(l+r)/2;
L=-left[i],R=right[mid];
if(R-L+1<ans) l=mid+1;
else
{
for(j=1;j<=n;j++) b[j]=1;
if(pd(1))
{
if(R-L+1>=ans)
ans=R-L+1,ansl=L;
l=mid+1;
}
else r=mid-1;
}
}
}
printf("%d\n",ans);
for(i=ansl;i<ans+ansl;i++) printf("%d ",i);
return 0;
}

T2

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
#define M 5000010
#define minus 'a'
struct trie
{
int last,ans;
trie *son[3];
trie()
{
last=ans=0;
son[0]=son[1]=son[2]=NULL;
}
};
trie *root=new trie;
char st[M];
int n,m,len,num;
inline int max(int x,int y){return x>y?x:y;}
inline void insert(trie *p)
{
len=strlen(st+1);
int i,k;
for(i=1;i<=len;i++)
{
k=st[i]-minus;
if(p->son[k]==NULL)
{
p->son[k]=new trie;
p=p->son[k];
}
else
{
p=p->son[k];
p->ans=max(p->ans,num-(p->last)-1);
}
p->last=num;
}
}
inline int find()
{
int i;
trie *p=root;
len=strlen(st+1);
for(i=1;i<=len;i++)
{
if(p->son[st[i]-minus]) p=p->son[st[i]-minus];
else return n;
}
return max(p->ans,n-p->last);
}
int main()
{
freopen("word.in","r",stdin);
freopen("word.out","w",stdout);
int i;trie *p;
scanf("%d%d",&n,&m);
for(num=1;num<=n;num++)
{
scanf("%s",st+1);
insert(root);
}
while(m--)
{
scanf("%s",st+1);
printf("%d\n",find());
}
return 0;
}

T3

#include<cstdio>
using namespace std;
#define ll long long
ll n,m,ans,x,y,a[12];
ll exgcd(ll a,ll b)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b),t=x;
x=y,y=t-a/b*y;
return d;
}
inline ll gcd(ll x,ll y)
{
if(y==0) return x;
return gcd(y,x%y);
}
inline ll lcm(ll x,ll y)
{
if(x==0) return y;
if(y==0) return x;
return x/gcd(x,y)*y;
}
void dfs(ll k,ll lcm1,ll lcm2,ll sum)
{
if(lcm1>n||lcm2>n) return;
if(k>m)
{
if(lcm1==0||lcm2==0) return;
if(exgcd(lcm1,lcm2)>1) return;
x=(x%lcm2+lcm2)%lcm2;
ans+=(n/lcm1-x+lcm2)/lcm2*(sum&1?-1:1);
return;
}
dfs(k+1,lcm1,lcm2,sum);
dfs(k+1,lcm(lcm1,a[k]),lcm2,sum+1);
dfs(k+1,lcm1,lcm(lcm2,a[k]),sum+1);
}
int main()
{
freopen("sazetak.in","r",stdin);
freopen("sazetak.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++) scanf("%lld",&a[i]);
a[++m]=n;
dfs(1,0,0,0);
printf("%lld\n",ans);
return 0;
}

2018.08.10【省赛&提高A组模拟】比赛总结的更多相关文章

  1. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  2. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  3. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

  4. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  5. 2020.10.17 JZOJ 提高B组T2 导弹拦截

    2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...

  6. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...

  7. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  8. 【NOIP2017提高A组模拟9.17】猫

    [NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...

  9. 【NOIP2017提高A组模拟9.17】组合数问题

    [NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...

随机推荐

  1. bzoj3990

    排序 HYSBZ - 3990 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N) ...

  2. 使用Python操作Excel文档(一)

    Python | 使用Python操作Excel文档(一) 0 前言 在阅读本文之前,请确保您已满足或可能满足以下条件: 请确保您具备基本的Python编程能力. 请确保您会使用Excel. 请确保您 ...

  3. func<T> 和 action<T>

    一.Func Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托. Func<TResult> Func<T,TResult ...

  4. HR问“你目前有几个offer”,聪明人会怎么说?

    点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的!   一个朋友和我聊天,说起自己最近被虐的面试经历.他985毕业,工作3年,看中了一家月薪1.5万的工作,准备跳槽.虽然在北京不算高 ...

  5. 20175214 MySort(选做)

    一.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 二.设计思路 在命令行中输入需要的参 ...

  6. php phpexcel 读取excel文件数据

    public function readExcel(){ $allPath = '/home/examine\video/list.xls'; \think\Loader::import('exten ...

  7. PHP 验证5-20位数字加字母的正则(数字和字母缺一不可)!!!

    $pattern = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{5,20}$/'; if(!preg_match($pattern,$username)){ re ...

  8. 前端单点登录(SSO)实现方法(二级域名与主域名)

    1.单点登录介绍 单点登录 SSO 全称 Singn Sign On .SSO 是指在多个应用系统中,用户只需要登录一次用户系统,就可以访问其他互相信任的应用系统.例如:在网易官网登录账户,那么再进入 ...

  9. rocketmq的linux搭建环境

    3.3. 上传解压[两台机器] # 上传 apache-rocketmq.tar.gz 文件至/usr/local # tar -zxvf apache-rocketmq.tar.gz -C /usr ...

  10. HTML中meta=“viewport”的介绍

    viewport就是浏览器上用来显示网页的那部分区域 layout viewport:整个网页所占据的区域(包括可视也包括不可视的区域)  默认的 visual viewport:网页在浏览器上的可视 ...