Noip模拟6 2021.6.10
T1 辣鸡
首先吐嘈一下,这题的测试点就离谱,不说了,附上我65分代码:
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9 }
10 int n,wsn;
11 namespace WSN{
12 inline int main(){
13 n=read();
14 for(int i=1;i<=n;i++){
15 int x1=read(),y1=read(),x2=read(),y2=read();
16 int a=x2-x1,b=y2-y1;
17 wsn+=a*b*2;
18 }
19 printf("%lld\n",wsn);
20 return 0;
21 }
22 }
23 signed main(){return WSN::main();}
震撼我,这不相邻的矩形咋这么多!!!
但是当时没有敢打,可惜可惜。。
然而这题正解也是暴力,所以就不说什么了,上代码
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9 }
10 int n,wsn;
11 struct SNOW{int x1,y1,x2,y2;};SNOW s[100005];
12 bool cmp(SNOW a,SNOW b){return a.x1<b.x1;}
13 namespace WSN{
14 inline int main(){
15 n=read();
16 for(int i=1;i<=n;i++){
17 s[i].x1=read();s[i].y1=read();s[i].x2=read();s[i].y2=read();
18 wsn+=(s[i].x2-s[i].x1)*(s[i].y2-s[i].y1)*2;
19 }
20 sort(s+1,s+n+1,cmp);
21 for(int i=1;i<n;i++){
22 for(int j=i+1;j<=n;j++){
23 if(s[j].x1-s[i].x2>1) break;
24 if(min(s[i].x2,s[j].x2)-max(s[i].x1,s[j].x1)>=0){
25 if(s[j].y1-s[i].y2==1){
26 wsn+=(min(s[i].x2,s[j].x2)-max(s[i].x1,s[j].x1))*2;
27 if(s[i].x1!=s[j].x1) wsn++;
28 if(s[j].x2!=s[i].x2) wsn++;
29 }
30 if(s[i].y1-s[j].y2==1){
31 wsn+=(min(s[i].x2,s[j].x2)-max(s[i].x1,s[j].x1))*2;
32 if(s[i].x1!=s[j].x1) wsn++;
33 if(s[j].x2!=s[i].x2) wsn++;
34 }
35 }
36 if(min(s[i].y2,s[j].y2)-max(s[i].y1,s[j].y1)>=0){
37 if(s[j].x1-s[i].x2==1){
38 wsn+=(min(s[i].y2,s[j].y2)-max(s[i].y1,s[j].y1))*2;
39 if(s[i].y1!=s[j].y1) wsn++;
40 if(s[j].y2!=s[i].y2) wsn++;
41 }
42 if(s[i].x1-s[j].x2==1){
43 wsn+=(min(s[i].y2,s[j].y2)-max(s[i].y1,s[j].y1))*2;
44 if(s[i].y1!=s[j].y1) wsn++;
45 if(s[j].y2!=s[i].y2) wsn++;
46 }
47 }
48 if(s[j].x1-s[i].x2==1&&(s[j].y1-s[i].y2==1||s[i].y1-s[j].y2==1)) wsn++;
49 }
50 }
51 printf("%lld\n",wsn);
52 return 0;
53 }
54 }
55 signed main(){return WSN::main();}
T2 模板(线段树合并)
这题目暴力很好想注意一下细节就可以很好拿到30分了,然而我现在还没有学习线段树合并,就先贴上暴力代码了。
1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int x=0,f=1; char ch=getchar();
5 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
6 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
7 return x*f;
8 }
9 const int NN=1e5+10;
10 int n,m,q,fa[NN],k[NN];
11 bool v[NN],typ[NN];
12 vector<int> co[NN];
13 struct SNOW{ int to,next;}; SNOW g[NN<<1]; int r[NN<<1],tot;
14 inline void add(int x,int y){g[++tot]=(SNOW){y,r[x]}; r[x]=tot;}
15 inline void dfs1(int x){
16 v[x]=true;
17 for(int i=r[x];i;i=g[i].next)
18 if(!v[g[i].to]){
19 fa[g[i].to]=x;
20 dfs1(g[i].to);
21 }
22 }
23 inline void dfs2(int x,int val){
24 if(k[x]>0) co[x].push_back(val);
25 k[x]--;
26 if(!fa[x]) return;
27 dfs2(fa[x],val);
28 }
29 namespace WSN{
30 inline int main(){
31 n=read();
32 for(int i=1;i<n;i++){
33 int u=read(),v=read();
34 add(u,v); add(v,u);
35 }
36 dfs1(1);
37 for(int i=1;i<=n;i++) k[i]=read();
38 m=read();
39 for(int i=1;i<=m;i++){
40 int x=read(),c=read();
41 dfs2(x,c);
42 }
43 q=read();
44 for(int i=1;i<=q;i++){
45 memset(typ,false,sizeof(typ));
46 int x=read(),maxn=0,minn=0x3fffffff;
47 for(int j=0;j<co[x].size();j++){
48 typ[co[x][j]]=true;
49 maxn=max(co[x][j],maxn);
50 minn=min(co[x][j],minn);
51 }
52 int wsn=0;
53 for(int j=minn;j<=maxn;j++){
54 if(typ[j]) wsn++;
55 }
56 printf("%d\n",wsn);
57 }
58 return 0;
59 }
60 }
61 signed main(){return WSN::main();}
回来补坑,线段树以时间开,在启发式合并的时候判断时间和颜色的先后位置,然后在合并。
1 #include<bits/stdc++.h>
2 #define mid ((l+r)>>1)
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9
10 }
11
12 const int NN=1e5+10;
13 int n,m,q,k[NN];
14 vector<int> vc[NN];
15 int rt[NN];
16 int son[NN],ans[NN],siz[NN];
17
18 struct snow{int x,c;}; snow wk[NN]; int dis[NN],m_new;
19 struct SNOW{ int to,next;}; SNOW e[NN<<1]; int head[NN],tot;
20 inline void add(int x,int y){e[++tot]=(SNOW){y,head[x]}; head[x]=tot;}
21
22 inline void discrete(){
23 sort(dis+1,dis+m+1); m_new=unique(dis+1,dis+m+1)-dis-1;
24 for(int i=1;i<=m;i++){
25 wk[i].c=lower_bound(dis+1,dis+m_new+1,wk[i].c)-dis;
26 vc[wk[i].x].push_back(i);
27 }
28 }
29
30 inline void init(){
31 n=read();
32 for(int i=1;i<n;i++){
33 int u=read(),v=read();
34 add(u,v); add(v,u);
35 }
36 for(int i=1;i<=n;i++) k[i]=read();
37 m=read();
38 for(int i=1;i<=m;i++) wk[i].x=read(),dis[i]=wk[i].c=read();
39 discrete();
40 }
41
42 struct SNOWtree{
43 int seg,ls[NN*80],rs[NN*80];
44 int sum[NN*80],kin[NN*80];//颜色数量 颜色种类
45 int pre[NN*80],fro[NN*80],rp; //第一次出现的时间 第一个颜色出现的种类 颜色个数
46
47 inline void insert(int &x,int l,int r,int pos,int kind,int v){
48 if(!x) x=++seg;
49 if(l==r) {sum[x]=v; kin[x]=kind; return;}
50 if(pos<=mid) insert(ls[x],l,mid,pos,kind,v);
51 else insert(rs[x],mid+1,r,pos,kind,v);
52 sum[x]=sum[ls[x]]+sum[rs[x]];
53 kin[x]=kin[ls[x]]+kin[rs[x]];
54 }
55
56 inline void gather(int x,int t,int co){//节点 时间 颜色
57 if(!pre[co]){
58 fro[++rp]=co;
59 pre[co]=t;
60 insert(rt[x],1,m,t,1,1);
61 return;
62 }
63 if(pre[co]<t){ insert(rt[x],1,m,t,0,1); return; }
64 if(pre[co]>t){
65 insert(rt[x],1,m,t,1,1);
66 insert(rt[x],1,m,pre[co],0,1);
67 pre[co]=t; return;
68 }
69 }
70
71 inline void merge(int x,int l,int r,int p){
72 if(!x) return;
73 if(l==r&&sum[x]){ gather(p,l,wk[l].c); return; }
74 merge(ls[x],l,mid,p);
75 merge(rs[x],mid+1,r,p);
76 }
77
78 inline int query(int x,int l,int r,int res){
79 if(!x||!res) return 0;
80 if(l==r) return kin[x];
81 int an=0;
82 if(ls[x]&&res<sum[ls[x]]) an+=query(ls[x],l,mid,res);
83 else{
84 an+=kin[ls[x]];
85 an+=query(rs[x],mid+1,r,res-sum[ls[x]]);
86 }
87 return an;
88 }
89
90 inline void clear(){ while(rp) pre[fro[rp--]]=0; }//只清空有数的
91
92 }tr;
93
94 inline void find_heavyson(int f,int x){
95 siz[x]=vc[x].size()+1;
96 for(int i=head[x];i;i=e[i].next){
97 if(e[i].to==f) continue;
98 int y=e[i].to;
99 find_heavyson(x,y);
100 siz[x]+=siz[y];
101 if(siz[y]>siz[son[x]]) son[x]=y;
102 }
103 }
104
105 inline void dfs(int f,int x){
106 for(int i=head[x];i;i=e[i].next){
107 int y=e[i].to;
108 if(y==f||y==son[x]) continue;
109 dfs(x,y); tr.clear();
110 }
111 if(son[x]) dfs(x,son[x]);
112 rt[x]=rt[son[x]];
113 for(int i=0;i<vc[x].size();i++)
114 tr.gather(x,vc[x][i],wk[vc[x][i]].c);
115 for(int i=head[x];i;i=e[i].next){
116 int y=e[i].to;
117 if(y==f||y==son[x]) continue;
118 tr.merge(rt[y],1,m,x);
119 }
120 ans[x]=tr.query(rt[x],1,m,k[x]);
121 }
122
123 namespace WSN{
124 inline int main(){
125 init();
126 find_heavyson(0,1);
127 dfs(0,1);
128 q=read();
129 for(int i=1;i<=q;i++) printf("%d\n",ans[read()]);
130 return 0;
131 }
132 }
133 signed main(){return WSN::main();}
T3 大佬(概率与期望)
首先,这题分数取莫,想到用费马小定理求逆元
然后就是推柿子:
$ans=\frac{\sum\limits_{i=1}^{m}g(i)*w[i]}{m^k}*(n-k+1)$
此柿子何来?
$g[x]=x^k-(x-1)^k$
每道题有x种选择,要除掉不合法的状态,即最大难度不是x,根据容斥可得。
然而仔细推一下可以发现他的每一个项都是由递推得到的,则代码:
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9 }
10 const int NN=505,p=1000000007;
11 int n,m,k,phi,sum,res,w[NN],a[NN];
12 inline int fima(int a,int b){
13 int ans=1; a%=p;
14 while(b){
15 if(b&1) ans=(ans*a)%p;
16 b>>=1; a=(a*a)%p;
17 } return ans;
18 }
19 namespace WSN{
20 inline int main(){
21 n=read(); m=read(); k=read();
22 if(n<k) {printf("0\n");return 0;}
23 for(int i=1;i<=m;i++) w[i]=read();
24 phi=fima(fima(m,k),p-2);
25 for(int i=1;i<=m;i++){
26 a[i]=(fima(i,k)-sum+p)%p;
27 sum=(sum+a[i])%p;
28 }
29 for(int i=1;i<=m;i++) res=(res+a[i]*w[i]%p)%p;
30 printf("%lld\n",(n-k+1)*res%p*phi%p);
31 return 0;
32 }
33 }
34 signed main(){return WSN::main();}
T4 宝藏(状压dp)
看到这数据,是不是想状压,而且二维数组求距离还特别方便,现在这么一想,感觉还是比较水的
代码表现的非常明白,是一个按层推的思想。这样dp才可以找到dian的加和值
1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int x=0,f=1; char ch=getchar();
5 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
6 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
7 return x*f;
8 }
9 int n,m,k,wsn=0x3fffffff,f[13][1<<12],dis[13][13],g[13][13];
10 inline void dfs(int st,int x){
11 for(int i=1;i<=n;i++){
12 if(!(x&(1<<i-1))) continue;
13 for(int j=1;j<=n;j++){
14 if(x&(1<<j-1)) continue;
15 if(g[i][j]==999999999) continue;
16 if(f[st][x|(1<<j-1)]>f[st][x]+dis[st][i]*g[i][j]){
17 f[st][x|(1<<j-1)]=f[st][x]+dis[st][i]*g[i][j];
18 dis[st][j]=dis[st][i]+1;
19 dfs(st,x|(1<<j-1));
20 }
21 }
22 }
23 }
24 namespace WSN{
25 inline int main(){
26 memset(f,0x3f,sizeof(f));
27 for(int i=0;i<=12;i++)
28 for(int j=0;j<=12;j++) g[i][j]=999999999;
29 n=read(),m=read();
30 for(int i=1;i<=m;i++){
31 int x=read(),y=read(),z=read();
32 if(z<g[x][y]) g[x][y]=g[y][x]=z;
33 }
34 for(int i=1;i<=n;i++){
35 f[i][1<<i-1]=0;
36 dis[i][i]=1;
37 dfs(i,1<<i-1);
38 wsn=min(wsn,f[i][(1<<n)-1]);
39 }
40 printf("%d\n",wsn);
41 return 0;
42 }
43 }
44 signed main(){return WSN::main();}
END
这次考试没什么超长发挥的地方,还是有很多遗憾的,比如第一题最基础的五分没拿到手等等,下次考试还是要注意时间分配,尽量每题都有分吧~~~
Noip模拟6 2021.6.10的更多相关文章
- Noip模拟50 2021.9.10
已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就 ...
- Noip模拟35 2021.8.10
考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Noip模拟81 2021.10.20
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...
- Noip模拟84 2021.10.27
以后估计都是用\(markdown\)来写了,可能风格会有变化 T1 宝藏 这两天老是会的题打不对,还是要细心... 考场上打的是维护\(set\)的做法,但是是最后才想出来的,没有维护对于是没有交. ...
- Noip模拟83 2021.10.26
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...
- Noip模拟80 2021.10.18
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...
随机推荐
- Java XXE漏洞典型场景分析
本文首发于oppo安全应急响应中心: https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247485488&idx=1&am ...
- sync 修饰符在Vue中如何使用
在有些情况下,我们可能需要对一个 prop 进行"双向绑定".不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源. 这 ...
- go语言游戏服务端开发(二)——网络通信
一.网络层 网络游戏客户端除了全局登录使用http请求外,一般通过socket长连接与服务端保持连接.go语言的net包提供网络socket长连接相关操作. 对于服务端,一般经历 Listen.Acc ...
- 创建一个web项目
- mybatis整理笔记
以下是idea2018辑编器 新建 Maven工程 1 file ->new ->project 新建后编程器在右下角加载插件.,这个时候需要会儿, 加载好后,软件目录会多一个ja包 ...
- python字典时间日期
字典时间日期 学习完本篇,你将会深入掌握 字典操作. 1.如何新建一个字典 2.如何正序以及反序访问字典 3.如何更新字典元素 4.如何删除字典 日期时间操作 1.如何打印一个2021-9-20 17 ...
- django安装xadmin
环境:pycharm django1.11.20 python2.7(根据网络上的资料,自己整理实现) 下载:https://github.com/sshwsfc/xadmin/tree/mast ...
- P4929-[模板]舞蹈链(DLX)
正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 \(n*m\)的矩形有\(0/1\),要求选出若干行使得每一列有且仅有一个\(1\). 解题思路 ...
- 51nod1600-Simple KMP【SAM,树链剖分】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1600 题目大意 给出一个字符串\(s\),每次在最后插入一个字符后求它的 ...
- Java实现两数之和等于二十
找出数组中两个数字之和为20的两个数 代码实现 public static void main(String[] args) { // TODO Auto-generated method stub ...