T1 数列


考场上切掉的简单题。

$a$,$b$与数列中数的正负值对答案无关。全当作正数计算即可。

$exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数。如果不为$gcd(a,b)$倍数则无解,否则将解的绝对值加和调整至最小。

调整可以分类讨论,我写了不用动脑子的倍增。

$code:$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=1e5+5;
5 int n,a,b,l[NN],ans,x,y,gcd,epx[30],epy[30],tmx,tmy,res;
6 inline int qabs(int x){ return x<0?(~x+1):x; }
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(int x,char sp){
14 char ch[20]; int len=0;
15 if(x<0){ putchar('-'); x=~x+1; }
16 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
17 for(int i=len-1;i>=0;--i) putchar(ch[i]); putchar(sp);
18 }
19 int exgcd(int a,int b){
20 if(!b){ x=1; y=0; return a; }
21 int g=exgcd(b,a%b),z=x;
22 x=y; y=z-y*(a/b);
23 return g;
24 }
25 signed main(){
26 n=read(); a=qabs(read()); b=qabs(read());
27 if(a>b) swap(a,b);
28 for(int i=1;i<=n;i++) l[i]=qabs(read());
29 gcd=exgcd(a,b); epx[0]=b/gcd; epy[0]=a/gcd;
30 for(int i=1;i<30;i++){
31 epx[i]=epx[i-1]<<1;
32 epy[i]=epy[i-1]<<1;
33 }
34 for(int i=1;i<=n;i++){
35 if(l[i]%gcd){ puts("-1"); return 0; }
36 tmx=l[i]/gcd*x; tmy=l[i]/gcd*y;
37 for(int j=29;j>=0;j--){
38 if(qabs(tmx+epx[j])+qabs(tmy-epy[j])<qabs(tmx)+qabs(tmy)) tmx+=epx[j], tmy-=epy[j];
39 if(qabs(tmx-epx[j])+qabs(tmy+epy[j])<qabs(tmx)+qabs(tmy)) tmx-=epx[j], tmy+=epy[j];
40 }
41 ans+=qabs(tmx)+qabs(tmy);
42 }
43 write(ans,'\n');
44 return 0;
45 }

T1

T2 数对


乍一看好像是道原题,结果元素可以随意排列,直接人傻了。

结果直接乱搞排序能切。($min(a,b)$,$a*b$)人又傻了。

正解是按加和排序。对$a_i<b_j$,$a_j>b_i$,$i$放在前面,反之$i$放在后面。对$a_i<b_j$,$a_j<b_i$和$a_j<b_i$,$a_i<b_j$两种情况$i$,$j$顺序任意。因此按加和排序即可。

线段树以最大$a$为下标建树,支持区间查询,区间加,单点修改。

一个道理的原题题解:

(这个原题是$a_i$必须大于等于$b_j$,反向理解一下啦~~)

$code:$

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define ld rt<<1
4 #define rd (rt<<1)|1
5 using namespace std;
6 const int NN=2e5+5;
7 int n,has[NN<<1],ext,cnt;
8 struct pairs{ int a,b,w; }p[NN],AA[10];
9 inline bool cmp(pairs x,pairs y){ return (x.a+x.b)<(y.a+y.b); }
10 inline int read(){
11 int x=0,f=1; char ch=getchar();
12 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
13 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
14 return x*f;
15 }
16 inline void write(int x,char sp){
17 char ch[20]; int len=0;
18 if(x<0){ putchar('-'); x=~x+1; }
19 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
20 for(int i=len-1;i>=0;--i) putchar(ch[i]); putchar(sp);
21 }
22 struct segment_tree{
23 int laz[NN<<2],mx[NN<<2];
24 void pushup(int rt){
25 mx[rt]=max(mx[ld],mx[rd]);
26 }
27 void pushdown(int rt){
28 laz[ld]+=laz[rt]; laz[rd]+=laz[rt];
29 mx[ld]+=laz[rt]; mx[rd]+=laz[rt];
30 laz[rt]=0;
31 }
32 void update(int rt,int l,int r,int pos,int v){
33 if(l==r){
34 mx[rt]=max(mx[rt],v);
35 return;
36 }
37 pushdown(rt);
38 int mid=l+r>>1;
39 if(pos<=mid) update(ld,l,mid,pos,v);
40 else update(rd,mid+1,r,pos,v);
41 pushup(rt);
42 }
43 void modify(int rt,int l,int r,int opl,int opr,int v){
44 if(l>=opl&&r<=opr){
45 mx[rt]+=v;
46 laz[rt]+=v;
47 return;
48 }
49 pushdown(rt);
50 int mid=l+r>>1;
51 if(opl<=mid) modify(ld,l,mid,opl,opr,v);
52 if(opr>mid) modify(rd,mid+1,r,opl,opr,v);
53 pushup(rt);
54 }
55 int query(int rt,int l,int r,int opl,int opr){
56 if(l>=opl&&r<=opr) return mx[rt];
57 pushdown(rt);
58 int mid=l+r>>1,ans=0;
59 if(opl<=mid) ans=max(ans,query(ld,l,mid,opl,opr));
60 if(opr>mid) ans=max(ans,query(rd,mid+1,r,opl,opr));
61 return ans;
62 }
63 }s;
64 int dp(){
65 for(int i=1;i<=n;i++)
66 if(p[i].a>=p[i].b)
67 s.update(1,1,ext,p[i].a,s.query(1,1,ext,1,p[i].b)+p[i].w);
68 else{
69 s.modify(1,1,ext,p[i].a+1,p[i].b,p[i].w);
70 s.update(1,1,ext,p[i].a,s.query(1,1,ext,1,p[i].a)+p[i].w);
71 }
72 return s.query(1,1,ext,1,ext);
73 }
74 signed main(){
75 n=read();
76 for(int i=1;i<=n;i++)
77 has[++cnt]=p[i].a=read(), has[++cnt]=p[i].b=read(), p[i].w=read();
78 sort(has+1,has+cnt+1);
79 ext=unique(has+1,has+cnt+1)-has-1;
80 for(int i=1;i<=n;i++){
81 p[i].a=lower_bound(has+1,has+ext+1,p[i].a)-has;
82 p[i].b=lower_bound(has+1,has+ext+1,p[i].b)-has;
83 }
84 sort(p+1,p+n+1,cmp);
85 write(dp(),'\n');
86 return 0;
87 }

T2

T3 最小距离


多源最短路?

具体是跑多个源点的$dijstra$,$dis$记离该点最近的特殊点与该点的距离,$pre$记离该点最近的特殊点。

更新答案时枚举每条边,如果两个端点的$pre$不同就更新两个$pre$的答案。

$code:$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int NN=4e5+5;
5 int n,m,p,d[NN],st[NN<<1],to[NN<<1],nex[NN<<1],head[NN],w[NN],num,ans[NN],dis[NN],pre[NN];
6 struct node{
7 int yd,id,v;
8 bool operator<(const node &a)const{ return a.v<v; }
9 }c;
10 inline int read(){
11 int x=0,f=1; char ch=getchar();
12 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
13 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
14 return x*f;
15 }
16 inline void write(int x,char sp){
17 char ch[20]; int len=0;
18 if(x<0){ putchar('-'); x=~x+1; }
19 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
20 for(int i=len-1;i>=0;--i) putchar(ch[i]); putchar(sp);
21 }
22 inline void add(int a,int b,int c){
23 to[++num]=b; nex[num]=head[a]; head[a]=num; w[num]=c; st[num]=a;
24 to[++num]=a; nex[num]=head[b]; head[b]=num; w[num]=c; st[num]=b;
25 if(n==p) ans[a]=min(ans[a],c), ans[b]=min(ans[b],c);
26 }
27 inline void dij(){
28 priority_queue<node>q;
29 bool vis[NN]={0};
30 for(int i=1;i<=n;i++) dis[i]=1e18;
31 for(int i=1;i<=p;i++){
32 c.id=d[i]; c.v=0; dis[d[i]]=0; pre[d[i]]=d[i];
33 q.push(c);
34 }
35 while(!q.empty()){
36 int x=q.top().id,y=q.top().v; q.pop();
37 if(vis[x]) continue;
38 vis[x]=1;
39 for(int i=head[x];i;i=nex[i]){
40 int v=to[i];
41 if(dis[v]<=y+w[i]) continue;
42 dis[v]=y+w[i]; pre[v]=pre[x];
43 c.id=v; c.v=dis[v];
44 q.push(c);
45 }
46 }
47 }
48 signed main(){
49 n=read(); m=read(); p=read();
50 for(int i=1;i<=n;i++) ans[i]=1e18;
51 for(int i=1;i<=p;i++) d[i]=read();
52 for(int i=1;i<=m;i++){
53 int a=read(),b=read(),c=read();
54 add(a,b,c);
55 }
56 dij();
57 for(int i=1;i<=num;i+=2){
58 int s=st[i],t=to[i];
59 if(pre[s]==pre[t]) continue;
60 ans[pre[s]]=min(ans[pre[s]],w[i]+dis[s]+dis[t]);
61 ans[pre[t]]=min(ans[pre[t]],w[i]+dis[s]+dis[t]);
62 }
63 for(int i=1;i<=p;i++)
64 write(ans[d[i]],i==n?'\n':' ');
65 return 0;
66 }

T3

T4 真相


分类讨论有没有人断言有几个真话。

如果没有,所有人的话可以构成一个环,找一个人枚举他的话真假,判断是否矛盾即可。

如果有,所有人的话会构成多个以这种话为结尾的块。枚举这种话不同的人数,令它为真。

与它相同的话都为真,不同的话为假,可以递推出所有人话的真假,比较真话数量是否符合即可。

$code:$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=2e5+5;
4 int t,n,opt[NN],k[NN],pcnt,last,tot;
5 bool flag,con,inc,tmp[NN];
6 char op;
7 struct node{
8 int k,t,f,u;
9 bool operator<(const node &a)const{ return a.k<k; }
10 }p[NN];
11 inline int read(){
12 int x=0,f=1; char ch=getchar();
13 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
14 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
15 return x*f;
16 }
17 inline void write(int x,char sp){
18 char ch[20]; int len=0;
19 if(x<0){ putchar('-'); x=~x+1; }
20 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
21 for(int i=len-1;i>=0;--i) putchar(ch[i]); putchar(sp);
22 }
23 bool judge(){
24 tmp[1]=1;
25 for(int i=2;i<=n;i++) tmp[i]=tmp[i-1]^opt[i-1];
26 if(tmp[1]==tmp[n]^opt[n]) return 1;
27 tmp[1]=0;
28 for(int i=2;i<=n;i++) tmp[i]=tmp[i-1]^opt[i-1];
29 if(tmp[1]==tmp[n]^opt[n]) return 1;
30 return 0;
31 }
32 void clear(){
33 pcnt=last=tot=flag=con=inc=0;
34 }
35 signed main(){
36 t=read();
37 while(t--){
38 n=read(); clear();
39 for(int i=1;i<=n;i++){
40 cin>>op;
41 if(op=='$') flag=1, k[i]=read(), opt[i]=-1;
42 if(op=='+') opt[i]=0;
43 if(op=='-') opt[i]=1;
44 }
45 if(!flag){ puts(judge()?"consistent":"inconsistent"); continue; }
46 for(int i=1;i<=n;++i){
47 if(opt[i]!=-1) continue;
48 int j=i-1;
49 if(!j)j=n;
50 tmp[i]=1;
51 p[++pcnt]=(node){k[i],1,0,0};
52 while(opt[j]!=-1){
53 tmp[j]=tmp[j==n?1:(j+1)]^opt[j];
54 if(tmp[j]) p[pcnt].t++;
55 else p[pcnt].f++;
56 j--;if(!j)j=n;
57 }
58 }
59 sort(p+1,p+pcnt+1);
60 p[0].k=-20050410;
61 for(int i=1;i<=pcnt;++i)
62 if(p[i].k==p[last].k)p[last].t+=p[i].t,p[last].f+=p[i].f,p[i].u=1;
63 else last=i;
64 int tot=0;
65 for(int i=1;i<=pcnt;++i) if(!p[i].u) tot+=p[i].f;
66 for(int i=1;i<=pcnt;++i) if(!p[i].u) if(p[i].k==tot-p[i].f+p[i].t) con=1;
67 for(int i=1;i<=pcnt;++i) if(p[i].k==tot) inc=1;
68 puts((con||!inc)?"consistent":"inconsistent");
69 }
70 return 0;
71 }

T4

2021.8.12考试总结[NOIP模拟37]的更多相关文章

  1. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  2. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

  3. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  4. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  5. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  6. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  7. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  8. 2021.9.14考试总结[NOIP模拟53]

    T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...

  9. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

随机推荐

  1. CommonsCollections2 反序列化利用链分析

    在 ysoserial中 commons-collections2 是用的 PriorityQueue reaObject 作为反序列化的入口 那么就来看一下 java.util.PriorityQu ...

  2. go语言游戏服务端开发(三)——服务机制

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...

  3. 最新seo优化技巧

    国内的SEO也发展不少年份了.我是最早开始从事SEO的那一班人.看着这个行业从零开始发展,长大.成熟还谈不上.可以这样说吧,国内做这个行业的,高手并不多.实战的高手更是寥寥无几.当然这个是我个人的推断 ...

  4. 基于pgpool搭建postgresql集群

    postgresql集群搭建 基于pgpool中间件实现postgresql一主多从集群部署,这里用两台服务器作一主一从示例 虚拟机名 IP 主从划分 THApps 192.168.1.31 主节点 ...

  5. 深入HTML5第一天

    页面的title一般是30-40个字符:分别为主页,详情页,列表页  keywords:100个字符  description: em是:emphasize: 强调,着重  i:italic斜体的 : ...

  6. requests接口自动化-assert断言

    断言,自动判断接口返回的结果与预期结果是否一致 from common.get_mysql import * def test_assert(): a=0 b=1 # assert a,'断言失败打印 ...

  7. 配置php redis 扩展

    参照runoob:PHP 使用 Redis Windows: - 假设redis已经安装好 服务启动 - xampp (php 7.1 x86 windows) 查看phpinfo (php 7.1 ...

  8. pycharm向GitHub提交代码

    设置为自动add commit代码 push代码 查看github,看到提交记录

  9. mysql 添加远程访问

    第一种:mysql 5.0(两种方式) 一. 在命令窗口输入,mysql -u root -p  回车,并输入密码 执行 use mysql 执行下面句子,查看权限,root默认权限为localhos ...

  10. hadoop生态之面试题篇

    一.hdfs的高可用 1.先说下自己的理解, 正常的hdfs有namenode,datanode,secondnamenode,但是second name node 不是真正意义上的namenode备 ...