link

C-Attention

题意:一个字符队列,每个位置是\(W\)或\(E\),计算最小的修改数量,使得存在一个位置,它之前的都是\(E\),之后的都是\(F\)

#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=3e5+5;
int ans,tmp;
char s[MN];
int main()
{
int i,N=read();
scanf("%s",s+1);
for(i=1;i<N;++i)tmp+=s[i]=='W';ans=tmp;
for(i=N-1;i;--i)tmp+=s[i+1]=='E',tmp-=s[i]=='W',ans=min(ans,tmp);
printf("%d\n",ans);
}

D-Xor Sum 2

题意:给出一个序列,问有多少个区间满足区间异或和等于区间和

发现满足若大区间满足,则内部区间都满足,采用尺取法即可。

#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=2e5+5;
int N,a[MN],Xor,Sum;
ll ans;
int main()
{
N=read();
reg int i,l,r;
for(i=1;i<=N;++i) a[i]=read();
for(l=1,r=1;l<=N;++l)
{
while((Xor^a[r])==(Sum+a[r])&&r<=N)
Xor^=a[r],Sum+=a[r++];
ans+=r-l;
Xor^=a[l];Sum-=a[l];
}
printf("%lld\n",ans);
return 0;
}

E-Range Minimum Queries

题意:长度为\(N\)的序列,每次选一个长度为\(K\)的区间,删除任意一个最小的数,共执行\(Q\)次,问删除的数的最小极差

可以枚举最小删除的数,然后显然整个序列变成一个个可执行区间,从小到达删除可以删除的数,直到所有可执行的区间长度小于\(K\),或恰好删了\(Q\)个数。

#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=2005,inf=1e9+5;
int N,K,Q;
int id[MN],a[MN];
bool cmp(int x,int y){return a[x]<a[y];}
int bel[MN],len[MN],cnt,bl;bool in[MN];
int solve(int pos)
{
memset(in,0,sizeof in);
cnt=bl=0;reg int i,j,k;
for(i=1;i<=N;++i)
{
for(;i<=N&&a[i]<a[pos];++i);
for(j=i;j<=N&&a[j]>=a[pos];++j);--j;//因为--j Wa了5次
for(len[++bl]=j-i+1,k=i;k<=j;++k)
bel[k]=bl,in[k]=true;
i=j;
}
for(i=1;i<=N;++i)if(in[id[i]]&&len[bel[id[i]]]>=K)
{
--len[bel[id[i]]];
if(++cnt==Q)return a[id[i]]-a[pos];
}
return inf;
}
int main()
{
N=read();K=read();Q=read();
reg int i;
for(i=1;i<=N;++i)a[id[i]=i]=read();
sort(id+1,id+N+1,cmp);
int ans=inf;
for(i=1;i<=N;++i) ans=min(ans,solve(i));
return 0*printf("%d\n",ans);
}

F-Donation

题意:一张简单图,每个点有两个值\(A_i,B_i\),一开始你有\(W\)yen,选择一个点满足\(A_s<W\)作为起始点,每次可以执行两种操作,移动到相邻的\(i\)点上去(满足\(A_i<W\)),或是对当前点捐赠\(B_i\)yen(\(W-=B_i,W\geq 0\)),求可以对每个点都恰好捐赠一次的最小\(W\)

(搬来的)题解:

我们将题目关于\(W\geq A_i\)的限制更改为经过一个点之后需满足\(W\geq Max(A_i-B_i,0)\),并且一定是在最后一次经过某个点的时候才对这个点进行捐赠

证明:

  1. 如果对这个点进行了捐赠,那么捐赠前\(W\geq Max(A_i-B_i,0)+B_i\geq A_i\)

  2. 如果没有对这个点进行捐赠,那么之后肯定会对这个点进行捐赠,因为满足每一时刻的限制,所以当前的\(W\geq A_i\)

  3. 关于“一定是在最后一次经过某个点的时候才对这个点进行捐赠”,因为我们可以延迟捐赠,这样对之后的操作无影响,并且对于之前时刻的\(W\)有增无减

我们可以设\(C_i=Max(A_i-B_i,0)\)

转化条件后,我们走到第\(k\)步(移动第\(k\)次)到达点\(id_k\)需要满足的是:

\(W\geq SumB_k+C_{id_k}\),其中\(SumB\)表示之前已经捐赠的钱的总和

所以\(W\geq Max_k\{ SumB_k,C_{id_k}\}\)

我们考虑最大的\(C_i\),删除这个点之后,会使得原图裂成几个联通块\(G_1,G_2,..G_n\),优秀的做法一定是先访问了所有的\(G_i(i\neq k)\),然后在访问\(G_k\),因为如果先访问了\(G_k\)中的某个点,一定会增大点\(i\)的要求下限值,而对\(G_k\)内的点的要求值无影响

所以我们可以类似的一次处理每个\(G_i\)内的点

具体的,可以建一棵树,满足每个节点是其子树所代表的联通块中\(C_i\)最大的

建树的过程可以对\(C_i\)从小到大排序,依次枚举每个点,将其相邻的并且根的\(C_i\)比当前小的树合并作为它的子树,这个过程需要用并查集维护每个点所在树的根

注意\(C_i\)可能相同,所以对于\(C_i\)的比较应该选用排序后的\(rank\)值

补:最后如和求答案?

答:建出树后在树上\(Dp\)即可,显然访问根之前的都没有用,因为根的\(C_i\)和\(SumB\)都是最大的,所以对于当前子树,假设根为\(x\),枚举最后一个访问的联通块,答案就是\(dp[x]=Min\{ siz[x]-siz[y]+Max(C_x,dp_y)\}\)。叶子节点特殊处理\(dp_x=B_x+C_x\)

没有路径压缩\(TLE\)了好几次

ps:哇哇哇我怎么写得这么认真。。。

#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
#define pb push_back
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=1e5+5;
int N,M,id[MN],rk[MN],par[MN];
ll f[MN],sz[MN],A[MN],B[MN],C[MN];
vector<int> G[MN],T[MN];
bool cmp(const int&x,const int&y){return C[x]<C[y];}
int getf(int x){return x==par[x]?x:par[x]=getf(par[x]);}
void rw(ll &x,ll y){if(y<x)x=y;}
void dfs(int x)
{
#define y T[x][i]
reg int i;sz[x]=B[x];f[x]=1e15;
if(!T[x].size())return (void)(f[x]=B[x]+C[x]);
for(i=T[x].size()-1;~i;--i)dfs(y),sz[x]+=sz[y];
for(i=T[x].size()-1;~i;--i)rw(f[x],sz[x]-sz[y]+max(C[x],f[y]));
#undef y
}
int main()
{
N=read();M=read();
reg int i,j,x,y;
for(i=1;i<=N;++i) par[i]=id[i]=i;
for(i=1;i<=N;++i) A[i]=read(),B[i]=read(),C[i]=max(A[i]-B[i],0LL);
for(i=1;i<=M;++i) x=read(),y=read(),G[x].pb(y),G[y].pb(x);
sort(id+1,id+N+1,cmp);
for(i=1;i<=N;++i)rk[id[i]]=i;
for(i=1;i<=N;++i)for(j=G[x=id[i]].size()-1;~j;--j)
{
y=getf(G[x][j]);
if(y!=x&&rk[y]<i) par[y]=x,T[x].pb(y);
}
dfs(id[N]);
return 0*printf("%lld\n",f[id[N]]);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

【AtCoder】 ARC 098的更多相关文章

  1. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  2. 【Atcoder】ARC 080 E - Young Maids

    [算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...

  3. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  4. 【AtCoder】 ARC 097

    link C-K-th Substring 题意:找出已知串中第\(k\)大的子串,子串相同的不算 \(k\)好小啊,要怎么做啊 不是[Tjoi2015]弦论吗 算了,直接SAM吧 #include& ...

  5. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  6. 【AtCoder】 ARC 099

    link C-Minimization 枚举覆盖\(1\)的区间,两边的次数直接算 #include<bits/stdc++.h> #define ll long long #define ...

  7. 【AtCoder】 ARC 100

    link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把 ...

  8. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

  9. 【AtCoder】 ARC 102

    link C-Triangular Relationship 发现要么全部是\(K\)的倍数,要么全部是模\(K\)余\(K/2,(K=2n)\) #include<bits/stdc++.h& ...

随机推荐

  1. SQL小技巧(一)拼音首字母的模糊查询

    基于Microsoft SQL Server 的标量值函数fun_GetPy,借鉴其他优秀的博主文章,此处贴出源码,以及使用方法 1.打开新建查询,贴如下代码,F5 /****** Object: U ...

  2. [Windows] - Windows/Office纯绿色一键激活工具及方法

    瘟到死网上有很多一件键激活工具(如KMS),但许多带毒或报毒.这里给出一个纯绿色命令行一键激活,及自已搭建激活服务器的方法. KMS现在算法都是公开的了,可以自行在网上找到,这里不详述. 使用命令行一 ...

  3. web技术栈开发原生应用-多端共用一套代码

    weex: vuejs开发原生应用 nativescript: vuejs开发原生应用 ReactNative = reactjs开发原生应用 ionic = angularjs 开发原生应用

  4. if控制器,如何传参。

  5. HTML5 新增文本标签

    一.mark 标记文本 <mark> 标签定义带有记号的文本,表示页面中需要突出显示或高亮显示的信息. 通常在引用原文的时候使用 mark 元素,目的是引起当前用户的注意. 语法格式: & ...

  6. springboot+https+http

    http访问不安全,使用https相对好些. 参考网址:https://blog.csdn.net/bock1984/article/details/90116965 操作如下: 1. 使用JDK自带 ...

  7. mysql 外键的基本使用

    外键的使用条件: 两个表必须是InnoDB表,MyISAM表暂时不支持外键外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立:外键关系的 ...

  8. Tensorflow中保存模型时生成的各种文件区别和作用

    假如我们得到了如下的checkpoints, 上面的文件主要可以分成三类:一种是在保存模型时生成的文件,一种是我们在使用tensorboard时生成的文件,还有一种就是plugins这个文件夹,这个是 ...

  9. 201671030114 马秀丽 实验十四 团队项目评审&课程学习总结

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...

  10. 前端性能----CDN

    Content Distribute Network(内容分发网络)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能模块,使用户就近获取所需内容 ...