这个 T1 的 \(n^{3}\) 的 SPJ 效率还是太慢了,膜拜 SPJ 大神学长,还会画画

A.Permutations & Primes

这题感觉挺水的但是感觉有不是那么水,主要还是因为我赛时没想出正解,在打的表里找了一组好看的规律,打上了然后就过了. 对偶数来说,我的规律正好是正解的特化,但是对奇数来说,我的规律就很奇怪了,我开头是 \(5\),最中间是 \(1\),结尾是 \(2\) 但是我完全卡不掉,如上图. 感觉是对的,不会证明其正确性.

学长写的 SPJ 挺神的,每次根据答案扩展,我的 \(n^{3}\) 写法比起来就太菜了

#include<bits/stdc++.h>
using namespace std;
int n,a[200001];
int main(){
int cases;scanf("%d",&cases);while(cases--){
scanf("%d",&n);
if(n&1){
a[(n+1)/2]=1;int tot=1;
int i1=1,j1=(n+1)/2-1,i2=(n+1)/2+1,j2=n;
while(i1<=j1 and i2<=j2){
a[j2]=++tot;j2--;
a[j1]=++tot;j1--;
if(i1<=j1 and i2<=j2){
a[i2]=++tot;i2++;
a[i1]=++tot;i1++;
}
}
for(int i=1;i<=n;++i){
printf("%d ",a[i]);
}
cout<<endl;
}
else{
int i1=1,j1=n/2,i2=n/2+1,j2=n;int tot=0;
while(i1<=j1 and i2<=j2){
a[i2]=++tot;i2++;
a[i1]=++tot;i1++;
if(i1<=j1 and i2<=j2){
a[j2]=++tot;j2--;
a[j1]=++tot;j1--;
}
}
for(int i=1;i<=n;++i){
printf("%d ",a[i]);
}
cout<<endl;
}
}
}

附一个对拍

//create.cpp
#include<bits/stdc++.h>
using namespace std;
namespace rander{
vector<long long> list;
int it,ssize;
int reset(int size){if(size<=0)return -1;int seed=std::rand();mt19937 Rand(seed);ssize=size;it=0;list.clear();for(int i=1;i<=size;++i){list.push_back(Rand());}return seed;}
int reset(){struct _timeb T;_ftime(&T);srand(T.millitm);return rander::reset(1000);}
vector<long long> randlist(int size){int seed=ssize;reset(size);vector<long long> ret=list;reset(seed);return ret;}
int rand(){if(ssize<=0)reset();int ret=list[it];it++;if(it>=ssize)reset(ssize);return ret;}
int rand(int mod){int ret=rander::rand()%mod;return ret;}
long long randabs(int mod){long long ret=abs(rander::rand());if(mod)ret%=mod;return ret;}
long long rand(int l,int r){if(l<0)return rander::rand(0,r);long ret=rander::randabs(r-l+1)+l;return ret;}
template<typename _T>_T from(vector<_T>p){long long ret=rander::randabs(p.size());return p[ret];}
template<typename _T>void randsort(vector<_T>&p){for(int i=1;i<=p.size();++i){int x=rander::rand(0,p.size()-1),y=rander::rand(0,p.size()-1);swap(p[x],p[y]);}}
template<typename _T>void randsort(_T &p,int from,int to){for(int i=1;i<=to-from+1;++i){int x=rander::rand(from,to),y=rander::rand(from,to);swap(p[x],p[y]);}}
};
int main(){
int n=rander::rand(1,40000)*2+1;
cout<<"Create [n="<<n<<"]"<<endl;
freopen("test.in","w",stdout);
cout<<1<<endl;
cout<<n<<endl;
}
//checker.cpp
#include<bits/stdc++.h>
using namespace std;
int a[200001];bool isprime[200001];
int main(){
freopen("test.out","r",stdin); memset(isprime,true,sizeof isprime);
isprime[1]=isprime[0]=false;
for(int i=4;i<=200000;i+=2){
isprime[i]=false;
}
for(int i=3;i<=200000;i+=2){
if(isprime[i]){
for(int j=3;j*i<=200000;j+=2){
isprime[i*j]=false;
}
}
}
int p=0,ans=0;
while(cin>>a[p]){
p++;
}
for(int i=1;i<=p-1;++i){
for(int j=i;j<=p-1;++j){
int mex=1;
for(int k=i;k<=j;++k){
if(a[k]==mex){
mex++;
k=i-1;
}
}
if(isprime[mex]) ans++;
}
}
int res=ans;
cout<<"[Test.check] ok "<<res<<endl;
freopen("test.check","w",stdout);
cout<<res<<endl;
}
//maintest.cpp
#include<bits/stdc++.h>
using namespace std;
#include<windows.h>
int main(){
int cnt=0,wrong=0;
while(1){
cnt++;
cout<<"Test "<<cnt<<" Now Wrong Times:"<<wrong<<endl;
system("create.exe");int st=clock();
system("test.exe");int ed=clock();
system("answer.exe");ed=clock();
system("checker1.exe");
system("checker2.exe");ed=clock();
cout<<"Checking Finished. Cost "<<ed-st<<" ms"<<endl;
if(system("fc test.check ans.check")){
wrong++;
system("pause");
}
}
}

B.树上游戏

真有 \(50w\) 个吗,能不能送我一个

没想到答案居然有单调性,但是答案确实有单调性. 如果能选 \(k\) 种颜色就一定能选 \(\lt k\) 种颜色,因此可以用二分答案做.

现在问题就是 check() 怎么写,发现我们可以只考虑深度最大的节点往回搜,当搜到 \(mid\) 距离的时候就说明至少要在这里放一个点,否则就走不到了,因此我们据此来统计节点个数,然后跟 \(k\) 比较作为二分依据

#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
int a[200001],b[200001];
int num,len;
vector<int>e[200001];
void dfs(int now,int last){
int p=-1,q=0;
for(int i:e[now]){
if(i!=last){
dfs(i,now);
p=max(p,a[i]-1);
q=max(q,b[i]+1);
}
}
if(p>=q){
a[now]=p;
b[now]=-1;
return;
}
if(q<len){
a[now]=0;
b[now]=q;
return;
}
num++;
a[now]=len;
b[now]=-1;
}
bool check(int x){
memset(a,-1,sizeof a);
memset(b,-1,sizeof b);
len=x,num=0;
dfs(1,0);
if(b[1]!=-1){
num++;
}
if(num>k) return false;
return true;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n-1;++i){
int x,y;cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
int l=1,r=200000;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}
else{
l=mid+1;
}
}
cout<<ans<<endl;
}

C.Ball Collector

考虑对冲突的部分连边(还是记一下吧,挺套路的,上一个用这个套路的题还是二分图最大独立集)

连完以为是道不可做,结果能手玩一下出性质,性质就是树只能选出 \(x-1\) 个种类不同的数,其余情况均能选出 \(x\) 个

我在考场上大抵是没这么大胆猜这种结论.

维护是不是树,那么可以通过维护一个并查集,然后看它的 \(size\) 来决定,但是还需要写撤销操作,所以要用可撤销并查集,可撤销并查集思路还是挺巧的,用了按秩合并来维护平衡

#include<bits/stdc++.h>
using namespace std;
const int p=998244353;
int n;
int power(int x,int y){
int ans=1,base=x;
while(y){
if(y&1){
ans=1ll*ans*base%p;
}
y>>=1;
base=1ll*base*base%p;
}
}
int inv(int x){
return power(x,p-2)%p;
}
pair<int,int> stk[200001];int top;
int num[200001];
bool tag[200001];
int fa[200001],size[200001],ans;
int find(int x){
return x==fa[x]?x:find(fa[x]);
}
void join(int a,int b){
int x=find(a),y=find(b);top++;
if(x==y){
if(num[x]==size[x]-1){
ans++;
tag[top]=true;
}
num[x]++;
stk[top]={-1,x};
}
else{
if(size[x]>size[y]) swap(x,y);
if(num[x]==size[x]-1 or num[y]==size[y]-1){
ans++;
tag[top]=true;
}
size[y]+=size[x];
fa[x]=y;
stk[top]={x,y};
num[y]+=num[x]+1;
}
}
void undo(int id){
if(stk[id].first==-1) num[stk[id].second]--;
else{
int x=stk[id].first,y=stk[id].second;
fa[x]=x;
size[y]-=size[x];
num[y]-=num[x]+1;
}
if(tag[id]) ans--;
tag[id]=false;
stk[id]={0,0};
}
int _ans[200001],a[200001],b[200001];
vector<int>e[200001];
void dfs(int now,int fa){
int cur=top;
join(a[now],b[now]);
_ans[now]=ans;
for(int i:e[now]){
if(i!=fa){
dfs(i,now);
}
}
while(top>cur) undo(top--);
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i]>>b[i];
}
for(int i=2;i<=n;++i){
int x,y;cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
for(int i=1;i<=n;++i){
size[i]=1,fa[i]=i;
}
dfs(1,0);
for(int i=2;i<=n;++i){
cout<<_ans[i]<<" ";
}
}

D.满穗

暑假集训CSP提高模拟7的更多相关文章

  1. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  2. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  3. 牛客网NOIP赛前集训营-提高组(第四场)B区间

    牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1  \dots   a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...

  4. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  5. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  6. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  7. 20190820 Tue 集训总结&NOIP模拟 27

    低谷度过了? 但是skyh阿卡了,还是反衬出我的辣鸡. T1知道要sort,却忘了判重,正解不如暴力分高,555. T2成功化出正解柿子,然后化过头了,化出了无法DP的柿子. 果然不够强,大神们一眼就 ...

  8. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  9. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  10. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

随机推荐

  1. CF1363A 题解

    洛谷链接&CF 链接 题目简述 共有 \(T\) 组数据. 对于每组数据,给定 \(n,x\) 和 \(n\) 个数,问是否可以从 \(n\) 个数中选 \(x\) 个使其和为奇数,可以输出 ...

  2. java小技巧~修改对象的属性名

    今天联调的时候,有个功能是在初始化的时候将图片路径回显到vant组件的上传组件上,但是vant组件需要图片路径名叫url,而后端返给我的路径名叫filePath,而且是双层嵌套.一个个遍历老麻烦了,下 ...

  3. sharding-jdbc 兼容 MybatisPlus的动态数据源

    背景:之前的项目做读写分离的时候用的 MybatisPlus的动态数据做的,很多地方使用的@DS直接指定的读库或者写库实现的业务:随着表数据量越来越大,现在打算把比较大的表进行水平拆分,准备使用 Sh ...

  4. 【Uni-App】关于获取手机系统信息的项目实践

    原因是这里APP下载方式的问题 安卓 和 IOS都可以写A标签跳转访问附件资源 但是甲方对这种下载方式并8满意[安卓行 苹果8行, 苹果行,安卓又8行] 通过 uni.getSystemInfo来判断 ...

  5. 【Vue】Re03 computed属性计算和ES6的一些补充

    一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...

  6. 由于美国的制程限制,假如我国的同等性能的AI芯片5年内无法实现量产化我们应该如何发展我们的AI领域的基础设施呢?

    相关: 美晶片禁令面難題!封過頭反把市場送中國? 今年华为公司推出了mate pro60手机,可以说我们可以实现7nm芯片的制造了,但是要注意,我们在实现7nm芯片制造的时候使用的应该依旧是被美国限制 ...

  7. 惠普暗影精灵2pro挑电池和电源适配器

    自己几年前买的暗影2pro前几个月坏掉了,无法充电,而且偶发性掉电,经过长时间研究发现该款电脑存在挑电池和电源适配器的问题. 相关资料: https://www.chinafix.com/thread ...

  8. python语言绘图:绘制一组二项分布图

    代码源自: https://github.com/PacktPublishing/Bayesian-Analysis-with-Python ============================= ...

  9. 最新版gym-0.26.2中Atari环境下各游戏在不同模式和困难度下的遍历

    相关内容参看前文: 最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明 =========================================== gym中 ...

  10. 12-es6类的方式封装折线图

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...