11.3 模拟赛

写了300分得了120 被众多低年级大佬的暴力踩成了弱智

T1 avogadro

题目大意:

3行N列 第一行为N的排列 其余两行的数属于$[1,n]$

求最少删除多少列使剩下的列中 三行排序后一样

思路:

找到第二行或第三行里没有的 然后像拓扑一样搞就行了

(写的贼丑)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 200100
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
19     return x*f;
20 }
21 //yyc score=0
22 int n,a[MAXN][3],hsh[MAXN],cnt[MAXN][3];
23 int vis[MAXN],q[MAXN],l=1,r,ans;
24 int main()
25 {
26     freopen("avogadro.in","r",stdin);
27     freopen("avogadro.out","w",stdout);
28     n=read();int b,c;
29     for(int i=1;i<=n;i++) a[i][0]=read(),hsh[a[i][0]]=i;
30     for(int i=1;i<=n;i++) a[i][1]=read(),cnt[a[i][1]][1]++;
31     for(int i=1;i<=n;i++) a[i][2]=read(),cnt[a[i][2]][2]++;
32     for(int i=1;i<=n;i++)
33         if((!cnt[i][1]||!cnt[i][2])&&!vis[hsh[i]]) vis[hsh[i]]=1,q[++r]=hsh[i];
34     while(l<=r)
35     {
36         c=q[l++],cnt[a[c][1]][1]--,cnt[a[c][2]][2]--;
37         if(!vis[hsh[a[c][1]]]&&!cnt[a[c][1]][1]) vis[hsh[a[c][1]]]=1,q[++r]=hsh[a[c][1]];
38         if(!vis[hsh[a[c][2]]]&&!cnt[a[c][2]][2]) vis[hsh[a[c][2]]]=1,q[++r]=hsh[a[c][2]];
39     }
40     for(int i=1;i<=n;i++) if(vis[i]) ans++;
41     printf("%d",ans);
42 }

T2 connect

题目大意:

N个点($n\le9$) M条边 每条边有$p_i$的概率消失

求所有点联通的概率

思路:

阶乘状压表示集合裸题

(但是忘记这是个二维dp导致算重了,而且转换也非常菜的算错了)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 380100
13 #define MOD 1000000007
14 using namespace std;
15 inline int read()
16 {
17     int x=0,f=1;char ch=getchar();
18     while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
19     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
20     return x*f;
21 }
22 //yyc score=0
23 int n,m,lm[12],u[100],v[100],no[MAXN],g[MAXN][12],t[12];
24 double w[100],dp[MAXN],gr[MAXN];
25 inline int calc()
26 {
27     int res=0;
28     for(int i=1;i<=n;i++) res+=(t[i]-1)*(lm[n]/lm[i]);
29     return res+1;
30 }
31 int main()
32 {
33     freopen("connect.in","r",stdin);
34     freopen("connect.out","w",stdout);
35     n=read(),m=read();
36     for(int i=1;i<=m;i++)
37     {
38         u[i]=read(),v[i]=read();
39         scanf("%lf",&w[i]);
40     }
41     for(int i=lm[0]=1;i<=n;i++) lm[i]=lm[i-1]*i;
42     for(int i=1;i<=n;i++) g[1][i]=1;
43     for(int i=2,x;i<=lm[n];i++)
44     {
45         x=n;
46         while(1)
47         {
48             g[i][x]=g[i-1][x]+1;
49             if(g[i][x]>x) g[i][x]=1,g[i][x-1]++;
50             else break;
51             x--;
52         }
53         for(int j=1;j<x;j++) g[i][j]=g[i-1][j];
54     }
55     dp[lm[n]]=1.0;
56     for(int i=1;i<=m;i++)
57     {
58         for(int j=1;j<=lm[n];j++)
59             if(dp[j])
60             {
61                 for(int k=1;k<=n;k++) t[k]=g[j][k];
62                 for(int k=1;k<=n;k++) if(g[j][v[i]]==t[k]||t[k]==g[j][u[i]]) t[k]=min(g[j][u[i]],g[j][v[i]]);
63                 gr[calc()]+=dp[j]*(1-w[i]),gr[j]+=dp[j]*w[i];
64             }
65         for(int j=1;j<=lm[n];j++) dp[j]=gr[j],gr[j]=0;
66     }
67     printf("%.3lf\n",dp[1]);
68 }

T3 dist

题目大意:

网格图上有一些点为黑点 M次询问 每次询问一个坐标离它最近的黑点的欧几里得距离

思路:

考场上没想那么多 KD tree莽就完事了

(结果估价函数写挂了)

正解是对每行处理斜率优化推一推式子

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<queue>
  8 #include<vector>
  9 #include<map>
 10 #define inf 2139062143
 11 #define ll long long
 12 #define MAXN 2500100
 13 using namespace std;
 14 inline int read()
 15 {
 16     int x=0,f=1;char ch=getchar();
 17     while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
 18     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
 19     return x*f;
 20 }
 21 //yyc score=0
 22 int n,tot,dim,m;
 23 char ch[2010][2010];
 24 struct node {int d[2],mn[2],mx[2],l,r;};
 25 bool cmp (const node &a,const node &b) {return a.d[dim]<b.d[dim];}
 26 inline int sqr(int x) {return x*x;}
 27 struct kd_tree
 28 {
 29     node tr[MAXN],l,r,g;
 30     int rt,ans;
 31     inline void upd(int k)
 32     {
 33         l=tr[tr[k].l],r=tr[tr[k].r];
 34         for(int i=0;i<2;i++)
 35         {
 36             if(tr[k].l) tr[k].mn[i]=min(tr[k].mn[i],l.mn[i]),tr[k].mx[i]=max(tr[k].mx[i],l.mx[i]);
 37             if(tr[k].r) tr[k].mn[i]=min(tr[k].mn[i],r.mn[i]),tr[k].mx[i]=max(tr[k].mx[i],r.mx[i]);
 38         }
 39     }
 40     inline int get(int k)
 41     {
 42         int res=0;
 43         for(int i=0;i<2;i++)
 44             res+=sqr(max(max(0,tr[k].mn[i]-g.d[i]),max(0,g.d[i]-tr[k].mx[i])));
 45         return res;
 46     }
 47     inline int dis(int k)
 48     {
 49         int res=0;
 50         for(int i=0;i<2;i++)
 51             res+=sqr(tr[k].d[i]-g.d[i]);
 52         return res;
 53     }
 54     int build(int l,int r,int D)
 55     {
 56         dim=D;int mid=l+r>>1;
 57         nth_element(tr+l,tr+mid,tr+r+1,cmp);
 58         for(int i=0;i<2;i++) tr[mid].mn[i]=tr[mid].mx[i]=tr[mid].d[i];
 59         if(l<mid) tr[mid].l=build(l,mid-1,D^1);
 60         if(mid<r) tr[mid].r=build(mid+1,r,D^1);
 61         upd(mid);return mid;
 62     }
 63     int query(int k)
 64     {
 65         int dl=inf,dr=inf;
 66         ans=min(ans,dis(k));
 67         if(tr[k].l) dl=get(tr[k].l);
 68         if(tr[k].r) dr=get(tr[k].r);
 69         if(dl>dr)
 70         {
 71             if(dr<ans) query(tr[k].r);
 72             if(dl<ans) query(tr[k].l);
 73         }
 74         else
 75         {
 76             if(dl<ans) query(tr[k].l);
 77             if(dr<ans) query(tr[k].r);
 78         }
 79     }
 80 }K;
 81 int main()
 82 {
 83     freopen("dist.in","r",stdin);
 84     freopen("dist.out","w",stdout);
 85     n=read();
 86     for(int i=0;i<n;i++)
 87     {
 88         scanf("%s",ch[i]);
 89         for(int j=0;j<n;j++) if(ch[i][j]==‘1‘) K.tr[++tot].d[0]=i,K.tr[tot].d[1]=j;
 90     }
 91     n=tot,m=read();
 92     K.rt=K.build(1,n,0);
 93     while(m--)
 94     {
 95         K.g.d[0]=read()-1,K.g.d[1]=read()-1;
 96         if(ch[K.g.d[0]][K.g.d[1]]==‘1‘) {puts("0");continue;}
 97         K.ans=inf;K.query(K.rt);
 98         printf("%d\n",K.ans);
 99     }
100 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/9903406.html

时间: 2024-10-01 10:49:48

11.3 模拟赛的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

11.4 模拟赛

终于AK了,虽然第三题主要是搞月想出来的 T1: n个1*1的小方块,把这些小方块拼成一个图形,使这个图形周长最小 思路: 枚举拼成长方形的长为i,宽为n/i 可得面积 (i+n/i+(bool)(n%i))*2 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstr

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40

2017/11/1模拟赛

磁星(magnet)[题目描述]在 B 城呆惯了的小 H 决定去外太空溜达一圈.人类现已发现并开发的星球(包括小 H 所在的星球)有 n 个,并且在这 n 个星球之中,人们发现了 m 对两个星球的关系.关系"xy"表示的是星球 x 对星球 y 有 1 一个单位的引导力,由于引导力还具有传递性,如果星球 x 对星球 y 能有恰好 a 个单位的引导力,星球y 对星球 z 能有恰好 b 个单位的引导力,那么星球 x 对星球 z 就能有恰好 a+b 个单位的引导力. 换言之,星球 x 对星球

11.2 模拟赛

T1: tarjan裸不能再裸了 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #define inf 2147483611 10 #defi

11.24 模拟赛

T1 bzoj 4730 Alice和Bob又在玩游戏 题目大意: Alice和Bob在玩游戏 n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最小的点 Alice和Bob轮流操作,每回合选择一个没有被删除的节点x,将x及其所有祖先全部删除,不能操作的人输 思路: 根据博弈论的一些定理可以得到一个优秀的$n^2$做法 由$SG$定理得 每个点的$SG$函数值为$mex${子树内一个点的SG xor 该根节点其余儿子的SG} 因此对于每个点我们可以开一个t

2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运算(模二意义下0.1互换,注意前导0也要交换),然后在任意相邻的两个数之间插入二进制与.二进制或,或者二进制异或.现在他想知道这样计算完产生的最美妙的数字是多少. 一共T组数据.对于每组数据,第一行一个n,表示这组数据中一串数有多少个.下面n个非负整数,表示这串数. 样例输入 2 2 3 6 3 1