我愿称这场考试为STL专练

T1 世界线

巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的。

但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但是也有很大代价

相比bool是好的,所以这题要用一个节点池来存放节点卡内存限制

但是当时考试的时候还不知道有这种东西。。

考试时候的想法是:

因为发现如果暴力的话只用$floyd$循环找一遍无法将所有边找全,于是想到使用多次$floyd$

记一个ans数组记录每一次新产生的连边,如果这一次的ans为0,直接break,然后把ans数组加和输出

因为有大样例,发现跑6次刚刚好

数据范围较小,水五十是可以的

然后说说正解。使用拓扑序思想

因为有多个联通块,则应该找到所有图进行dfs。

使用bitset记录每一个点的子节点可能产生的贡献,将其存到一个进制数中,知道子节点的贡献为0,将其回收

新技巧:

1.内存池回收;

2.$bitset$各种使用方法

 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=6e4+5,MM=1e5+5;
10 int n,m,in[NN],ot[NN],tot;
11 struct SNOW{int to,next;}; SNOW e[MM]; int head[NN],rp;
12 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]}; head[x]=rp;}
13 bitset<60001> s[30001];
14 int id[NN],ans,bin[NN],top;
15 bool vis[NN];
16 inline void calc(int x){
17 ans+=s[id[x]].count()-1-ot[x];
18 s[bin[++top]=id[x]].reset();
19 }
20 inline int New(){
21 if(top) return bin[top--];
22 return ++tot;
23 }
24 inline void dfs(int x){
25 vis[x]=true;
26 if(!id[x]) id[x]=New();
27 s[id[x]].set(x);
28 for(int i=head[x];i;i=e[i].next){
29 int y=e[i].to;
30 if(vis[y]){
31 if(!id[y]) id[y]=New();
32 s[id[x]]|=s[id[y]];
33 in[y]--;
34 if(!in[y]) calc(y);
35 continue;
36 }
37 if(!id[y]) id[y]=New();
38 dfs(y);
39 s[id[x]]|=s[id[y]];
40 in[y]--;
41 if(!in[y]) calc(y);
42 }
43 }
44 namespace WSN{
45 inline int main(){
46 n=read();m=read();
47 for(int i=1;i<=m;i++){
48 int a=read(),b=read();
49 ot[a]++; in[b]++; add(a,b);
50 }
51 for(int i=1;i<=n;i++){
52 if(!vis[i]){
53 dfs(i);
54 if(!in[i]) calc(i);
55 }
56 }
57 printf("%d\n",ans);
58 return 0;
59 }
60 }
61 signed main(){return WSN::main();}

T2 时间机器

不难发现这是个死贪心(然而考场上少判断就贪假了。。)

众所周知,贪心只有0分和100分。。。

不过想要拿到100分还要使用$set$

找到所有满足节点范围左端点限制的电阻,然后将其右端点插入set中,

依次找到符合电压范围的后继右端点电阻,减去个数就行

打的时候好好想着有没有可能假的地方,否则就会假。。。

注意细节

新技巧:

1.$set$快速维护

 1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int min(int a,int b){return a<b?a:b;}
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=5e4+5;
11 int T,n,m;
12 struct nod{
13 int id,r;
14 friend bool operator<(nod a,nod b){return a.r==b.r? a.id<b.id : a.r<b.r;}
15 };set<nod> s;
16 struct node{int r,sum,l;}; node U[NN],R[NN];
17 inline bool cmp(node a,node b){return a.l==b.l?a.r<b.r: a.l<b.l;}
18 namespace WSN{
19 inline int main(){
20 // FILE *A=freopen("1.in","r",stdin);
21 T=read();
22 while(T--){
23 s.clear();
24 n=read();m=read();
25 for(int i=1;i<=n;i++) U[i].l=read(),U[i].r=read(),U[i].sum=read();
26 for(int i=1;i<=m;i++) R[i].l=read(),R[i].r=read(),R[i].sum=read();
27 sort(U+1,U+n+1,cmp); sort(R+1,R+m+1,cmp);
28 nod st; st.r=0x3fffffff,st.id=0; s.insert(st);
29 bool f=0; int j=1;
30 for(int i=1;i<=n;i++){
31 nod g;
32 while(R[j].l<=U[i].l&&j<=m)
33 g.id=j,g.r=R[j].r,j++,s.insert(g);
34 g.r=U[i].r,g.id=0;//将t设置为电压右端点,找到其后继点
35 while(U[i].sum){
36 g=*s.lower_bound(g);
37 if(g.r==0x3fffffff) break;//无满足电阻,跳出判断
38 int mn=min(R[g.id].sum,U[i].sum);
39 U[i].sum-=mn;
40 R[g.id].sum-=mn; //减去此类满足的电阻个数
41 if(!R[g.id].sum) s.erase(g);//如果此种类全无,删除此种类电阻
42 }
43 if(U[i].sum){ f=1; break;}//如果最后把所有满足电阻都删掉但是节点还有剩余,直接输出
44 }
45 if(f){puts("No");continue;}
46 if(!f){puts("Yes"); continue;}
47 }
48 return 0;
49 }
50 }
51 signed main(){return WSN::main();}

T3 weight

此题非常牛皮。。

他说最小生成树,就先生成树。

然后将边分为树边和非树边,进行判断。

如果是非树边,他只能最大变成他紧连着的树边里最大的那一个

如果是树边,他顶多变成非树边-1

那么,除了使用数链剖分加线段树维护树边最大值以外,

还要用线段树维护一个最小值(打在一个线段树里,但不用pushup,因为每一段毫无联系(或者说没用),只需下放信息)

查询最小值的话只需要查把边权下放到的那个点即可

在树剖求max时顺便更新最小值

输出的时候还要判断联通

涉及知识点:

1.最小生成树

2.树链剖分+线段树

3.有关边权下放的性质(利用其边权总下放在更深的节点上)

4.并查集判断联通

  1 #include<bits/stdc++.h>
2 #define lid (id<<1)
3 #define rid (id<<1|1)
4 using namespace std;
5 inline int max(int a,int b){return a>b?a:b;}
6 inline int min(int a,int b){return a<b?a:b;}
7 inline void swap(int &x,int &y){x^=y^=x^=y;}
8 inline int read(){
9 int x=0,f=1; char ch=getchar();
10 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
11 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
12 return x*f;
13 }
14 const int NN=700005,MM=1e6+5,inf=0x7fffffff;
15 int n,m,a,ff[NN],w[NN],ans[MM];
16 int dfn[NN],rk[NN],son[NN],fa[NN],top[NN],dep[NN],siz[NN],cnt;
17 bool vis[MM];
18 struct node{int id,u,v,w;};node mp[NN];
19 struct SNOW{int from,to,val,next;};SNOW e[MM]; int head[NN],rp;
20 inline void add(int x,int y,int z){e[++rp]=(SNOW){x,y,z,head[x]}; head[x]=rp;}
21 inline bool cmp(node a,node b){return a.w<b.w;}
22 inline int getfa(int x){return ff[x]=((ff[x]==x)?x:getfa(ff[x]));}
23 inline void kru(){
24 int seg=0; sort(mp+1,mp+m+1,cmp);
25 for(int i=1;i<=n;i++) ff[i]=i;
26 for(int i=1;i<=m;i++){
27 int x=mp[i].u,y=mp[i].v,ID=mp[i].id;
28 if(getfa(x)!=getfa(y)){
29 ff[getfa(x)]=getfa(y);
30 add(x,y,mp[i].w);
31 add(y,x,mp[i].w);
32 seg++; vis[ID]=true;
33 }if(seg==n-1) break;
34 }
35 }
36 inline void dfs1(int f,int x){
37 siz[x]=1; fa[x]=f; dep[x]=dep[f]+1;
38 for(int i=head[x];i;i=e[i].next){
39 int y=e[i].to;
40 if(y==f) continue;
41 w[y]=e[i].val;
42 dfs1(x,y);
43 siz[x]+=siz[y];
44 if(siz[son[x]]<siz[y]) son[x]=y;
45 }
46 }
47 inline void dfs2(int x,int t){
48 dfn[x]=++cnt; rk[cnt]=x; top[x]=t;
49 if(!son[x]) return; dfs2(son[x],t);
50 for(int i=head[x];i;i=e[i].next){
51 int y=e[i].to;
52 if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
53 }
54 }
55 struct SNOWtree{
56 int ll[NN<<2+5],rr[NN<<2+5];
57 int minn[NN<<2+5],maxn[NN<<2+5],lzy[NN<<2+5];
58 inline void pushup(int id){
59 lzy[id]=min(lzy[lid],lzy[rid]);
60 minn[id]=min(minn[lid],minn[rid]);
61 maxn[id]=max(maxn[lid],maxn[rid]);
62 }
63 inline void pushdown(int id){
64 if(lzy[id]==inf||ll[id]==rr[id]) return;
65 minn[lid]=min(minn[lid],lzy[id]);
66 minn[rid]=min(minn[rid],lzy[id]);
67 lzy[lid]=min(lzy[lid],lzy[id]);
68 lzy[rid]=min(lzy[rid],lzy[id]);
69 lzy[id]=inf;
70 }
71 inline void build(int id,int l,int r){
72 ll[id]=l; rr[id]=r;
73 if(l==r){
74 maxn[id]=w[rk[l]];
75 minn[id]=lzy[id]=inf;
76 return;
77 }
78 int mid=l+r>>1;
79 build(lid,l,mid); build(rid,mid+1,r);
80 pushup(id);
81 }
82 inline void update(int id,int l,int r,int val){
83 if(l<=ll[id]&&rr[id]<=r){
84 minn[id]=min(minn[id],val);
85 lzy[id]=min(lzy[id],val);
86 return;
87 }
88 pushdown(id);
89 if(l<=rr[lid]) update(lid,l,r,val);
90 if(r>=ll[rid]) update(rid,l,r,val);
91 // minn[id]=min(minn[lid],minn[rid]);
92 }
93 inline int query_max(int id,int l,int r){
94 if(l<=ll[id]&& rr[id]<=r) return maxn[id];
95 int ans=0;
96 if(l<=rr[lid]) ans=max(ans,query_max(lid,l,r));
97 if(r>=ll[rid]) ans=max(ans,query_max(rid,l,r));
98 return ans;
99 }
100 inline int query_min(int id,int pos){
101 if(ll[id]==rr[id]) return minn[id];
102 int mid=ll[id]+rr[id]>>1,ans=inf;
103 pushdown(id);
104 if(pos<=mid) ans=min(ans,query_min(lid,pos));
105 else ans=min(ans,query_min(rid,pos));
106 return ans;
107 }
108 }tr;
109 inline int MAX(int x,int y,int val){
110 int ans=0;
111 while(top[x]!=top[y]){
112 if(dep[top[x]]<dep[top[y]]) swap(x,y);
113 ans=max(ans,tr.query_max(1,dfn[top[x]],dfn[x]));
114 tr.update(1,dfn[top[x]],dfn[x],val-1);
115 x=fa[top[x]];
116 }if(dfn[x]>dfn[y]) swap(x,y);
117 ans=max(ans,tr.query_max(1,dfn[x]+1,dfn[y]));
118 tr.update(1,dfn[x]+1,dfn[y],val-1);
119 return ans;
120 }
121 namespace WSN{
122 inline int main(){
123 // freopen("weight1.in","r",stdin);
124 n=read(); m=read(); a=read();
125 for(int i=1;i<=m;i++) mp[i].u=read(),mp[i].v=read(),mp[i].w=read(),mp[i].id=i;
126 kru(); dfs1(0,1); dfs2(1,1); tr.build(1,1,n); int root=getfa(1);
127 for(int i=1;i<=m;i++) if(!vis[mp[i].id]){
128 if(getfa(mp[i].u)!=root) ans[mp[i].id]=0;
129 else ans[mp[i].id]=MAX(mp[i].u,mp[i].v,mp[i].w)-1;
130 }
131 for(int i=1;i<=m;i++) if(vis[mp[i].id]){
132 if(getfa(mp[i].u)!=root) ans[mp[i].id]=0;
133 else{
134 if(dep[mp[i].u]>dep[mp[i].v]){
135 ans[mp[i].id]=tr.query_min(1,dfn[mp[i].u]);
136 }
137 else ans[mp[i].id]=tr.query_min(1,dfn[mp[i].v]);
138 }
139 }
140 for(int i=1;i<=m;i++){
141 if(ans[i]==inf) printf("-1 ");
142 else printf("%d ",ans[i]);
143 }
144 return 0;
145 }
146 }
147 signed main(){return WSN::main();}

Noip模拟17 2021.7.16的更多相关文章

  1. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  2. Noip模拟54 2021.9.16

    T1 选择 现在发现好多题目都是隐含的状压,不明面给到数据范围里,之凭借一句话 比如这道题就是按照题目里边给的儿子数量不超过$10$做状压,非常邪门 由于数据范围比较小,怎么暴力就怎么来 从叶子节点向 ...

  3. Noip模拟41 2021.8.16

    T1 你相信引力吗 对于区间的大小关系问题,往往使用单调栈来解决 这道题的优弧和劣弧很烦,考虑将其等价的转化 由于所有的合法情况绕过的弧都不会经过最高的冰锥, 又因为环可以任意亲定起点,这样可以直接把 ...

  4. NOIP模拟 17.8.16

    NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

  5. NOIP模拟17.9.21

    NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...

  6. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  7. NOIP模拟 17.8.20

    NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...

  8. NOIP模拟 17.8.18

    NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...

  9. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

随机推荐

  1. RDS导入注意事项

    1)导入文件大小不超过100M,支持格式有CSV.SQL.ZIP 2)sql文件需注释如下内容: SET @@SESSION.SQL_LOG_BIN=0 ; SET @@GLOBAL.GTID_PUR ...

  2. 转:C#读取PDF、TXT内容

    //读取PDF内容 private void button2_Click(object sender, EventArgs e) { label3.Text = OnCreated("D:\ ...

  3. Asp.net Core Jwt简单使用

    .net 默认新建Api项目不需要额外从Nuget添加Microsoft.AspNetCore.Authentication.JwtBearer appsettings.json { "Lo ...

  4. JS003. 事件监听和监听滚动条的三种参数( addEventListener( ) )

    全局 1 window.addEventListener('scroll', () => { 2 console.log('------') 3 console.log(document.doc ...

  5. 全网唯一正常能用的centos7 安装mysql5.7.35 22 33 25

    CentOS7.4用yum安装并配置MySQL5.7   1.配置YUM源 下载MySQL源安装包 wget http://dev.mysql.com/get/mysql57-community-re ...

  6. python基础--网站推荐

    Python教程 - 廖雪峰的官方网站 Python 基础教程 | 菜鸟教程 随笔分类 - 机器学习

  7. Playfield 类方法的注释

    前言 本篇随笔的底包采用的是百度炉石兄弟吧20200109折腾版中自带的 routines 文件. 本次仅为绝大多数方法添加 xml 注释和简单解析,没有具体解析与重构. Playfield 类方法众 ...

  8. 为什么要设置GOROOT/GOPATH

    设置GOROOT的原因 编译器的位置指定的时候,需要指定GO开发包的安装位置,然后设置环境变量PATH的时候,需要指定到安装包下的bin目录,其中就有以下的编译/执行器.所以GOROOT指定了前面的路 ...

  9. 496. 下一个更大元素 I

    496. 下一个更大元素 I 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. ...

  10. 洛谷P1019——单词接龙(DFS暴力搜索)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...