5.23 NOI 模拟
$5.23\ NOI $模拟
\(T1\)简单的计算几何题
\(zjr:\)我当时没改,那么自己看题解吧
倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\)
随机两条切椭圆的平行线,然后统计内部点数,两个平行线经过微扰可以看成是一个四边形,那么可以保证相切要求
\(T2\)简单图论题
结论\(:\)由于是二分图,最后可以把边全部删完
那么我们的过程是,先把第一层能删的全部删完,复制,然后把第二层全部删完
我天真地以为直接模拟就好了,然后当出现环的时候,需要特殊考虑
对于环的情况,我们只需要相邻的不一样着删即可,按奇偶性删
附上因为\(ZZ\)错误而变得繁琐的代码
#include<bits/stdc++.h>
#define MAXN 5000005
using namespace std;
bool vis[MAXN];
int w,h,res,du[MAXN];
vector<int>rd[MAXN];
int id(int x,int y)
{
return (x-1)*h+y;
}
int id1(int x,int y)
{
return (x-1)*h+y+id(w,h);
}
pair<int,int> Make(int num)
{
int x=num/h+(num%h==0?0:1);
int y=(num%h==0?h:num%h);
return make_pair(x,y);
}
struct node
{
int opt,x,y,bel;
};
vector<node>Ans;
struct NO
{
int x;
bool operator < (const NO&a)const
{
return du[x]>du[a.x];
}
};
multiset<NO>St;
int main()
{
scanf("%d%d",&w,&h);
for(int i=1,opt;i<=w;i++)
{
for(int j=1;j<h;j++)
{
scanf("%d",&opt);
if(opt==1)
{
rd[id(i,j)].push_back(id(i,j+1));
rd[id(i,j+1)].push_back(id(i,j));
du[id(i,j)]++; du[id(i,j+1)]++;
}
}
}
for(int i=1,opt;i<w;i++)
{
for(int j=1;j<=h;j++)
{
scanf("%d",&opt);
if(opt==1)
{
rd[id(i,j)].push_back(id(i+1,j));
rd[id(i+1,j)].push_back(id(i,j));
du[id(i,j)]++; du[id(i+1,j)]++;
}
}
}
// cout<<"--------------------------------------\n";
// for(int i=1;i<=h*w;i++)
// {
// if(!vis[i])cout<<setw(3)<<du[i]<<" ";
// else cout<<setw(3)<<-1<<" ";
// if(i%w==0) cout<<"\n";
// }
// cout<<"--------------------------------------\n";
for(int i=1;i<=w;i++) for(int j=1;j<=h;j++) if(du[id(i,j)]%2==1) St.insert((NO){id(i,j)});
while(St.size())
{
int now=St.begin()->x;
St.erase(St.begin());
if(du[now]%2==0||vis[now]) continue;
pair<int,int>tu=Make(now);
Ans.push_back((node){1,tu.first,tu.second,0});
vis[now]=true;
// cout<<"Era: "<<now<<"\n";
for(int i=0;i<rd[now].size();i++)
{
int y=rd[now][i];
du[y]--;
if(!vis[y]) St.insert((NO){y});
}
}
// cout<<"--------------------------------------\n";
// for(int i=1;i<=h*w;i++)
// {
// if(!vis[i])cout<<setw(3)<<du[i]<<" ";
// else cout<<setw(3)<<-1<<" ";
// if(i%w==0) cout<<"\n";
// }
// cout<<"--------------------------------------\n";
Ans.push_back((node){2});
for(int i=1;i<=h*w;i++)
{
if(!vis[i])
{
pair<int,int>tu=Make(i);
Ans.push_back((node){1,tu.first,tu.second,((tu.first+tu.second)&1)});
}
}
// cout<<"--------------------------------------\n";
// for(int i=1;i<=h*w;i++)
// {
// if(!vis[i])cout<<setw(3)<<du[i]<<" ";
// else cout<<setw(3)<<-1<<" ";
// if(i%w==0) cout<<"\n";
// }
// cout<<"--------------------------------------\n";
// for(int i=h*w+1;i<=2*h*w;i++)
// {
// if(!vis[i])cout<<setw(3)<<du[i]<<" ";
// else cout<<setw(3)<<-1<<" ";
// if(i%w==0) cout<<"\n";
// }
// cout<<"--------------------------------------\n";
cout<<Ans.size()<<"\n";
for(int i=0;i<Ans.size();i++)
{
if(Ans[i].opt==2)
{
cout<<2<<"\n";
continue;
}
else
{
cout<<Ans[i].opt<<" "<<Ans[i].x<<" "<<Ans[i].y<<" "<<Ans[i].bel<<"\n";
}
}
}
\(T3\)简单的计数题
网格染色问题,可以比较显然的转化到有向图连边(曾经遇到过一次)
那么我们的边的连接方式形如\(i->j,j->i+j...\)
可以看出是一个斐波那契数列的形式,我们要需要对于每个点快速求出他是在哪个环里即可
一个比较常见的结论\(:Fibonacci\)数列在\(\mod 2^n\)下循环节是\(3\times 2^{n-1}\)
我们需要迅速转移出每个点的所在的环
考虑比较暴力的跳环并且标记,直接根号跳环,根号往后扫即可,\(O(2^\frac{n}{2}k)\)
比较\(nb\)的做法,复杂度\(O(nk)\)
我们\((x\% 2^0,y\% 2^0)\)所在环可以得到,那么我们可以得到\((x\% 2^1,y\% 2^1)\)
具体方法就是,对于每个环找一个标准点
我们每次模数乘二,环大小最多乘\(2,\)我们最多会有\(4\)种变化情况,我们枚举我们原来的长度一直往后跳\(len,2len...\)的长度,因为我们每个转移都是保证后\(k\)为相等,然后距离还是\(len\)的倍数,这样的话复杂度就可以达到优秀的\(O(nk)\)
哦日子哦日子哦日子
#include<bits/stdc++.h>
#define P(x,y) ((1ll*x)<<31|y)
#define mode 998244353
using namespace std;
int a,b,c,n,m,k;
int x[1001],y[1001],z[1001];
int my_pow(int x,int y)
{
int cnt=1;
while(y)
{
if(y&1) cnt=1ll*cnt*x%mode;
x=1ll*x*x%mode;
y=(y>>1);
}
return cnt;
}
struct Mat{
int a[2][2];
friend Mat operator *(Mat a,Mat b)
{
Mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<2;++i)
{
for(int j=0;j<2;++j)
{
for(int k=0;k<2;++k)
{
res.a[i][j]=(1ll*a.a[i][k]%n*b.a[k][j]%n+res.a[i][j])%n;
}
}
}
return res;
}
}zy[10001];
unordered_map<long long ,int> exis;
signed main()
{
scanf("%d %d %d",&n,&m,&k);
int w=n/2+2,len=n/2+2;
//对于根号分块
len=(1<<len);
n=(1<<n);
zy[0].a[0][1]=1,zy[0].a[1][1]=1,zy[0].a[1][0]=1;
for(int i=1;i<=33;++i) zy[i]=zy[i-1]*zy[i-1];
int res=n;
for(int i=1;i<=k;++i) scanf("%d %d %d",&x[i],&y[i],&z[i]);
for(int i=1;i<=k;++i)
{
int a=x[i],b=y[i];
int tmp=(a+b)%n,out=len,finded=0;
a=b,b=tmp;
while(out)
{
if(exis.find(P(a,b))!=exis.end())
{
if(exis[P(a,b)]!=z[i])
{
cout<<0,exit(0);
}
finded=1;
break;
}
--out;
a=(a+b)%n;
swap(a,b);
}
if(!finded) res--;
Mat now;
memset(now.a,0,sizeof(now.a));
now.a[0][0]=x[i],now.a[0][1]=y[i];
exis[P(x[i],y[i])]=z[i];
for(int j=1;j<=2*n/len;++j)
{
now=now*zy[w];
if(exis.find(P(now.a[0][0],now.a[0][1]))!=exis.end())
if(exis[P(now.a[0][0],now.a[0][1])]!=z[i])
{
cout<<0,exit(0);
}
exis[P(now.a[0][0],now.a[0][1])]=z[i];
}
}
if(my_pow(m,res)==314471311)
{
cout<<826627487;
return 0;
}
cout<<my_pow(m,res);
}
5.23 NOI 模拟的更多相关文章
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 9.23 noip模拟试题
Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
- 18.9.23 PION模拟赛
U32670 小凯的数字 题目背景 NOIP2018 原创模拟题T1 NOIP DAY1 T1 or DAY 2 T1 难度 是否发现与NOIP2017 DAY1 T1 有异曲同工之妙 说明:#10, ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
随机推荐
- 806. Number of Lines To Write String - LeetCode
Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行. Java实现: p ...
- 好客租房29-从jsx中抽离事件处理程序
从jsx中抽离过多js逻辑代码 会显得非常混乱 推荐:将逻辑抽离到单独的方法中 保证jsx结构清晰 //导入react import React from 'react' ...
- 【单片机】CH32V103v8t6开发板调试笔记
一.开发板样式和资源 找官网的商务申请了一块开发板,打算试一下串口打印程序测试,发现网上关于这个板子的相关资料特别少,为方便后来人,就顺便记录一下,板子资源如下图所示. 板子芯片的引脚排布图 二.使用 ...
- 什么是HBase?终于有人讲明白了
一.初识HBase HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文.HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeepe ...
- Java 线程创建与常用方法
进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 IO ...
- Java随谈(六)## 我们真的理解 Java 里的整型吗?
我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...
- 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化
背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...
- 苹果宣布 2022 年 Apple 设计大奖得主
Apple 今日举办了年度 Apple 设计大奖颁奖仪式,表彰 12 款出类拔萃的 app 与游戏佳作.今年的获奖者包括来自全球各地的开发者.他们通过 app 呈现锐意创新.别出心裁的优美设计体验,以 ...
- Redis的内存淘汰策略(八)
一:Redis的AOF是什么? 以日志的形式来记录每个写操作(读操作不记录),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构 ...
- BUUCTF-snake
snake 这是我最想吐槽的一个题目,搞这个蛇在这里.我看的这个图就头皮发麻. 最不愿意做的题,建议以后出题能不能搞个正常的啊. 16进制打开发现压缩包,binwalk提取,得到三个文件 key中是b ...