博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOI 2013
阅读量:5140 次
发布时间:2019-06-13

本文共 3717 字,大约阅读时间需要 12 分钟。

图片摘自:https://www.cnblogs.com/Dragon-Light/p/6378185.html

 3的情况写得不太对,只得了90,先贴着。

#include 
#include
#include
#include
using namespace std;const int maxn=1e5+10;int n,d,k,tot;int a[maxn][101],a3[maxn][101],b3[101][maxn],b[101][maxn],x[maxn],ans[maxn];int tmp[101];inline void find(int x){ int temp=0; for(int i=1;i<=n;i++) if(i!=x) { temp=0; for(int j=1;j<=d;j++) temp=(temp+a[i][j]*a[x][j])%k; if(temp==0) { if(i>x) swap(i,x); printf("%d %d",i,x); return; } } printf("-1 -1");}int main(){ scanf("%d%d%d",&n,&d,&k); for(int i=1;i<=n;i++) for(int j=1;j<=d;j++) scanf("%d",&a[i][j]),a[i][j]%=k; if(n<=1200) { for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { long long tmp=0; for(int p=1;p<=d;p++) tmp=(tmp+(a[i][p]*a[j][p]))%k; if(tmp==0) { printf("%d %d",i,j); return 0; } } printf("-1 -1"); return 0; } else if(k==2) { for(int i=1;i<=n;i++) for(int j=1;j<=d;j++) b[j][i]=a[i][j]; int T=5; while(T--) { tot=0; memset(tmp,0,sizeof(tmp)); for(int j=1;j<=n;j++) x[j]=rand()%k,tot+=x[j]; tot%=k; for(int i=1;i<=d;i++) for(int j=1;j<=n;j++) tmp[i]=(tmp[i]+a[j][i]*x[j])%k; for(int i=1;i<=n;i++) { int temp=0; for(int j=1;j<=d;j++) temp=(temp+tmp[j]*b[j][i])%k; if(temp!=tot) { find(i); return 0; } } } printf("-1 -1"); } else { for(int i=1;i<=n;i++) for(int j=1;j<=d;j++) a3[i][j]=(a[i][j]*a[i][j])%k; for(int i=1;i<=n;i++) for(int j=1;j<=d;j++) b3[j][i]=a3[i][j]; int T=8; while(T--) { tot=0; memset(tmp,0,sizeof(tmp)); for(int j=1;j<=n;j++) x[j]=rand()%k,tot=(tot+x[j])%k; tot%=k; for(int i=1;i<=d;i++) for(int j=1;j<=n;j++) tmp[i]=(tmp[i]+a3[j][i]*x[j])%k; for(int i=1;i<=n;i++) { int temp=0; for(int j=1;j<=d;j++) temp=(temp+tmp[j]*b3[j][i])%k; if(temp!=tot) { find(i); return 0; } } } printf("-1 -1"); } return 0;}
View Code

 

BFS 在前的点的深度一定小于等于后面的点,所以从Bfs序考虑比较容易,显然如果我们想好了如何给Bfs分层,就知道了答案。

分情况(只有序列相邻的两点才能判断是否分层):(记得要画图)

1、(必须不在同一层)对于bfs连续的ab两点,假如a的bfs序小于b的bfs序,且a的dfs序大于b的,那么他们之间肯定是要分层的,对答案贡献为1;

2、(必须在同一层)对于bfs连续的ab两点,假如a的bfs序小于b的bfs序,且a的dfs序小于b的,那么他们之间不能分层,贡献为0; 

3、(在不在同一层都行)对于dfs序连续的ab两点,假如a的dfs序小于b的,且a的bfs序也小于b,既可以与上一个点作为兄弟也可以作为儿子

只能是2,3这样 ↑,贡献为0.5

4、第一个点要强制分层

CODE:

 

#include 
#include
#include
#include
using namespace std;const int maxn=2e5+10;int n,top;int Bfs[maxn],Dfs[maxn],nb[maxn],nd[maxn]; int fen[maxn],no[maxn],q[maxn];double ans;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&Dfs[i]),nd[Dfs[i]]=i; for(int i=1;i<=n;i++) scanf("%d",&Bfs[i]),nb[Bfs[i]]=i; for(int i=1;i
nd[Bfs[i+1]]) fen[i]=1,no[i]=1; for(int i=1;i<=n;i++) fen[i]+=fen[i-1]; for(int i=1;i
View Code

 

转载于:https://www.cnblogs.com/linda-fcj/p/9141198.html

你可能感兴趣的文章
数据库进阶了解
查看>>
11.3
查看>>
C#---#define条件编译
查看>>
最小费用最大流模板
查看>>
计算机网络体系结构作业题整理-第二章答案
查看>>
脚本,网络配置,指令
查看>>
Ubuntu中MySQL中文乱码解决
查看>>
关于jQuery的ajax的源码的dataType解读
查看>>
类方法和对象方法的区别
查看>>
Lintcode376-Binary Tree Path Sum-Easy
查看>>
MonoTouch
查看>>
Spring MVC 知识总结
查看>>
【7】Django网页视图模板处理
查看>>
D3DXLoadMeshFromXof 0xC0000005: 读取位置 0x00000000 时发生访问冲突
查看>>
Python爬虫学习1
查看>>
Application之图书馆
查看>>
绿色djvu阅读软件
查看>>
最长子串 FZU2118
查看>>
vue中input限制最多两位小数
查看>>
spring mvc ModelAndView 404的原因
查看>>