[jzoj NOIP2018模拟11.02]
嗯T1忘记取模了,100到20
嗯T2忘记了那啥定理,暴力也写炸了,这题我认
嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分。但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了一个半小时
据说有大佬的线段树合并分裂A掉了T3,然而我这份极限数据跑了2.4s的代码不敢说话,至今还是黄黄的70分TLE挂在那里
T1:昆特牌
题目链接:
https://jzoj.net/senior/#contest/show/2546/0
题目:
作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观。但没想到你刚一到就遇到了麻烦。昆特牌的数据库发生了故障。原本昆特牌中有 k种卡牌和n 种阵营,为了平衡,每个阵营拥有的卡牌种数都是相等的,并且每个阵营的数据顺序排列。由于故障,卡牌数据被打乱了,每个阵营现在有ai 种卡牌。因为昆特牌即将迎来重大更新,每种牌的所属阵营并不重要,工程师只想尽快让每个阵营拥有相同数量的卡牌。由于数据库的结构原因,你每单位时间只能将一种牌向左边或右边相邻的一个阵营移动。作为OI选手,这自然是难不倒你,但作为一名卡牌游戏爱好者,你想知道最终的卡牌分布有多少种方案。两种方案不同当且仅当存在一种卡牌,它在两种方案中所属阵营不同。对998244353取模
题解:
就是均分纸牌问你方案数。
很自然联想均分纸牌的做法,发现变成负数的时候好像搞不了方案数啊。
于是很大胆的猜测只要给出去牌之后自己还是正的,现在给和以后给都是一样的。
那么我就是要尽可能的让当前要给牌的位置牌足够多。什么时候足够多呢?所有的该给它的牌都给它就是了。
发现就是连个边拓扑排序一下就ok了,边权就是需要给的牌的数量
哎,别忘了取模
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll; const int N=1e6+;
const ll mo=;
int n,k;
ll a[N],b[N],fac[N],in[N];
struct node{
int to;
ll w;
};
vector <node> p[N];
inline ll read(){
char ch=getchar();ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
queue <int> q;
ll qpow(ll a,ll b)
{
ll re=;
for (;b;b>>=,a=a*a%mo) if (b&) re=re*a%mo;
return re;
}
ll C(ll a,ll b)
{
return fac[a]*qpow(fac[b],mo-)%mo*qpow(fac[a-b],mo-)%mo;
}
ll topo()
{
ll ans=;
while (!q.empty()) q.pop();
for (int i=;i<=n;i++) if (!in[i]) q.push(i);
while (!q.empty())
{
int k=q.front();q.pop();
for (int i=;i<p[k].size();i++)
{
node u=p[k][i];
ans=ans*C(b[k],u.w)%mo;
b[k]-=u.w;
b[u.to]+=u.w;
in[u.to]--;
if (!in[u.to]) q.push(u.to);
}
}
return ans;
}
int main()
{
freopen("gwent.in","r",stdin);
freopen("gwent.out","w",stdout);
fac[]=;
for (int i=;i<N;i++) fac[i]=fac[i-]*i%mo;
int T=read();
while (T--)
{
n=read();k=;
for (int i=;i<=n;i++)
{
a[i]=read();
b[i]=a[i];
k+=a[i];
p[i].clear();
}
k/=n;
for (int i=;i<=n;i++)
{
if (a[i]==k) continue;
if (a[i]>k)
{
ll q=a[i]-k;
p[i].push_back((node){i+,q});
in[i+]++;
a[i]-=q;
a[i+]+=q;
}
else
{
ll q=k-a[i];
p[i+].push_back((node){i,q});
in[i]++;
a[i]+=q;
a[i+]-=q;
}
}
printf("%lld\n",topo());
}
return ;
}
T2:时空幻境
题目链接:
https://jzoj.net/senior/#contest/show/2546/1
题目:
Tim拥有控制时间的能力。他学会了BFS后,出了一道题:求出一张无向图中连通块的个数。他想请你做出这道题来

题解:
我们定义每次从x到超过n被取模为一轮,有个结论就是说若是初始的x不同,这一轮中的边都不同。更深入的就是说,在碰到x重复出现之前,每连一条边都会减少一个连通块(这两个结论都不是很准确,看看下面就懂了)
我们定义从开始到回到x为一个循环,显然一旦我们找到最小循环节后面就不需要做下去了,可以直接计算答案
首先我们找最小循环节,$x \times k^p \,\ \equiv \,\ x (\mod n)$,最小循环节为使得上式成立的最小p
根据$x \times k^{\varphi(n)} \,\ \equiv \,\ x \,\ (\mod n)$,我们知道$p|\varphi(n)$
由于n是固定的,我们预处理$\varphi(n)$的约数从小到大枚举快速幂判断即可
找到最小循环节之后呢?
最小循环节是偶数就是隔一个连一条边,直到某个$a_y==x$就停下;是奇数就是一直合并,第二次到某个$a_y==x$才停下,也就是直到成环,但是注意最后一条完成环的边不能算入答案
画画图对理解有帮助
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; const int N=;
int cnt;
ll pri[N];
void div(ll x)
{
for (int i=;1ll*i*i<=x;i++)
{
if (x%i) continue;
pri[++cnt]=i;if (1ll*i*i!=x) pri[++cnt]=x/i;
}
}
ll qpow(ll a,ll b,ll mod)
{
ll re=;
for (;b;b>>=,a=a*a%mod) if (b&) re=re*a%mod;
return re;
}
int main()
{
freopen("braid.in","r",stdin);
freopen("braid.out","w",stdout);
div();
sort(pri+,pri++cnt);
int T;
ll n,m,x,k;
scanf("%d",&T);
while (T--)
{
scanf("%lld%lld",&n,&m);
scanf("%lld%lld",&x,&k);
ll ans;
for (int i=;i<=cnt;i++)
{
if (qpow(k,pri[i],n)==)
{
ans=pri[i];
break;
}
};
if (ans==) ans=;//特判一下
if (ans&) ans--;//完成了环
else ans/=;//边数等于点数除2
if (ans<m) printf("%lld\n",n-ans);
else printf("%lld\n",n-m);
}
return ;
}
T3:初音未来
题目链接:
https://jzoj.net/senior/#contest/show/2546/2
题目:
Hercier作为一位喜爱Hatsune Miku的OIer,痛下决心,将Vocaloid买回了家。打开之后,你发现界面是一个长为n的序列,代表音调,并形成了全排列。你看不懂日语,经过多次尝试,你只会用一个按钮:将一段区间按升序排序。不理解音乐的Hercier决定写一个脚本,进行m次操作,每次对一段区间进行操作。可惜Hercier不会写脚本,他找到了在机房里的你,请你模拟出最后的结果。
题解:
部分分:经典题目,二分答案后变为区间查询,区间set1,0.见 [HEOI2016/TJOI2016]排序
一个序列交换相邻的两个数进行排序的话,最小次数就是逆序对个数,具体操作方法就是每次交换相邻逆序对。
所 以将排序过程变为交换相邻位置直到没有逆序对。记录哪些位置是逆序对。
这个过程可以用set维护,每次二分出逆序对的位置,如果再区间内,则交换之,并将两侧出现的新逆序对加入。
由于只会交换$O(n^2)$次,总的时间复杂度为$O((n^2+m)log n)$
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<set>
using namespace std; const int N=+;
int n,m,L,R;
int a[N];
set <int> s;
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
freopen("miku.in","r",stdin);
freopen("miku.out","w",stdout);
n=read();m=read();L=read();R=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<n;i++) if (a[i]>a[i+]) s.insert(i);
set <int>::iterator it;
while (m--)
{
int l=read(),r=read();
while ()
{
it=s.lower_bound(l);
int pos=*it;
if (pos>=r||it==s.end()) break;
s.erase(it);
swap(a[pos],a[pos+]);
if (a[pos-]>a[pos]) s.insert(pos-);
if (a[pos+]>a[pos+]) s.insert(pos+);
}
}
for (int i=L;i<=R;i++) printf("%d ",a[i]);
return ;
}
[jzoj NOIP2018模拟11.02]的更多相关文章
- [jzoj NOIP2018模拟10.29]
OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...
- [JZOJ NOIP2018模拟10.21]
考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...
- [jzoj NOIP2018模拟10.23]
丢分主要是下面几个方面: 1.T2代码交错了,有个特判没写丢了10分 2.T1线段树加等差数列写错了(其实二维差分就可以,但我当时不会) 3.T3思考再三还是为了10分写上了主席树,还是写错了 总体评 ...
- [JZOJ NOIP2018模拟10.20 B组]
T1:原根(math) 题目链接: http://172.16.0.132/senior/#contest/show/2532/0 题目: 题解: 一个数m原根的个数是$\phi{(\phi{(m)} ...
- [JZOJ NOIP2018模拟10.20 A组]
由于T3数据出锅,还不清楚自己的分数...估分150,前100已经拿到了,T3的50没拍过(写的就是暴力怎么拍),感觉很不稳 考试的时候就是特别的困,大概是因为早上在房间里腐败...腐败完了才睡觉 T ...
- [JZOJ NOIP2018模拟10.19]
T1写炸了今天,期望70却落了个20...连链上的都没有写对 T3什么什么线段树分治套AC自动机,表示我完全自闭了,幸好考场上没有杠T3 总体比赛还是比较舒服,暴力分给的蛮足的,不像昨天那样 T1:林 ...
- 【NOIP2018模拟11.01】树
题目 描述 题目大意 维护一个序列,支持三种操作: 1.修改一段区间,将这段区间内的所有数都andandand一个数. 2.询问区间和. 3.询问区间两两相加的平方和. N≤10000N\leq 10 ...
- JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C
3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
随机推荐
- docker初安装的血泪史
最近docker很火,不管是朋友圈内还是公司内聊天都离不开docker,于是对docker产生了极大的好奇心,凭着一颗程序猿的好奇心开始了docker的安装血泪史. 首先我有一台从公司退役的本本x22 ...
- css3子级高度与父级同高,内容垂直居中
.E-wrap{ overflow: hidden; position: relative; border: 1px solid #ccc; margin: 30px auto 0; width: 5 ...
- gdal集成kml库的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近要读取kml文件,具体就是把kml文件当作一个矢量文件来读取.我发现gdal是支持集成kml库的.不过集成这个km ...
- jar文件配置冲突问题transformResourcesWithMergeJavaResForDebug
先看本人AS报错异常 Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > c ...
- HTTP+XML接口客户端 结合策略模式实现总结
在项目中,我们经常会使用到http+xml的接口,而且不仅仅的是一个,可能会有多个http的接口需要实时的交互.但是http接口的发送消息的公共部分是一样的,只有每个接口的报文解析和返回报文是不同的, ...
- asp实现阿里大鱼短信API接口的方法
阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...
- 【node.js web项目】解决路由默认是hash模式(带#)
[概念讲述] 1.什么是hash模式 Vue+WebPack项目,本身是一个单页应用. vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 ...
- 激情世界杯,盛夏大放价,CDR 618返场继续嗨
最近被刷屏应该就是世界杯.世界杯和世界杯了... 进行了到第七天的球迷们,你们还好么 私房钱还剩下多少?上班有没有请假迟到? 哎,中国的小龙虾都去俄罗斯了,就国足队员没去… 满屏而来的不仅是手机朋友圈 ...
- LeetCode Golang 9.回文数
9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package main import ( "strconv" "fmt" ) //判断一个整数是 ...
- JS判断客户端是否是iOS或者Android或者ipad(二)
js判断客户端是IPAD和iphone 多了就不说了,直接上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 funct ...